实验3 --俄罗斯方块 with 20135335郝爽

一、   实验内容

(一)敏捷开发与XP

内容:1.敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。

2.极限编程(eXtreme Programming,XP)是一种全新而快捷的软件开发方法。

要点: 1. XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。

2. 我们关注其中的编码标准,结对编程,代码集体所有,测试,重构等实践。(如实验二中的TDD)

 

(二)编码标准

内容:编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

学习:

1. 软件辅助修改:在eclipse中,用source->Format进行格式规范;

2. 自己命名:包名全部小写,如: io ;类名第一个字母要大写,如:HelloWorldApp;等

(三)结对编程

内容:在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。其中的角色分配为驾驶员(控制键盘输入),领航人(起到领航、提醒作用)。

(四)版本控制

摘要:版本控制提供项目级的 undo(撤销) 功能;•   版本控制允许多人在同一代码上工作;•  版本控制系统保存了过去所作的修改的历史记录;具体步骤如下——

# 添加修改文件

$ git add 所有修改的文件

# 提交到环境中本地代码仓库

$ git commit -m '本次修改的描述'

# push到git.shiyanlou.com,无需输入密码

$ git push

学习:按照要求指导,逐步在实验楼中完成,截图如下:

(五)重构

摘要:重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。学习:尝试Encapsulate Field(封装)功能:

原图:

(六)实践项目

同伴郝爽20135335博客地址http://www.cnblogs.com/20135335hs

1.综述

我们采取“先学习,后操作;边操作,边变通”的实验思路。具体方法是:研读要求—学习代码要素—复习TDD内容—构建测试程序—检查测试程序—测试产品代码—修改产品代码—重新检查产品代码—完成实验报告。在这一过程中,我们对各方面内容都进行了详细记录(未在实验楼中进行托管和git)

团队由两名成员组成,详细分工为:

20135335郝爽:负责前期学习的整理工作,将java代码进行必要注释,并对TDD内容进行补充;进行后期测试

20135233杨光:负责中期的测试代码开发;进行后期测试

 

2.研读要求与自我学习(20135211)

1.TDD(Test Driven Development, 测试驱动开发),

TDD的一般步骤如下:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

2. 测试类具体操作:把鼠标放到项目名上,单击右键,在弹出的菜单中选定New->Source Folder新建一个测试目录test;把鼠标放到test目录上,单击右键,在弹出的菜单中选定New->JUnit Test Case新建一个测试用例类

3.实验要求要点为:程序要有GUI界面,参考用户界面和用户体验;记录TDD和重构的过程,测试代码不要少于业务代码

  

package game;

 

import java.awt.Button; 

import java.awt.Canvas; 

import java.awt.Color; 

import java.awt.Dimension; 

import java.awt.Frame; 

import java.awt.Graphics; 

import java.awt.GridLayout; 

import java.awt.Insets; 

import java.awt.Label; 

import java.awt.Panel; 

import java.awt.TextField; 

import java.awt.event.ActionEvent; 

import java.awt.event.ActionListener; 

import java.awt.event.KeyEvent; 

import java.awt.event.KeyListener; 

import java.awt.event.WindowAdapter; 

import java.awt.event.WindowEvent; 

import java.awt.event.WindowListener;

 

//俄罗斯方块类  

public class ERS_Block extends Frame { 

    public static boolean isPlay = false; 

    public static int level = 1, score = 0; 

    public static TextField scoreField, levelField; 

    public static MyTimer timer; 

    GameCanvas gameScr; 

    public static void main(String[] argus) { 

        ERS_Block ers = new ERS_Block( 

                "俄罗斯方块游戏  V1.0                   Author:Vincent"); 

        WindowListener win_listener = new WinListener(); 

        ers.addWindowListener(win_listener); 

    } 

    // 俄罗斯方块类的构造方法 

    ERS_Block(String title) { 

        super(title); 

        setSize(600, 480); 

        setLayout(new GridLayout(1, 2)); 

        gameScr = new GameCanvas(); 

        gameScr.addKeyListener(gameScr); 

        timer = new MyTimer(gameScr); 

        timer.setDaemon(true); 

        timer.start(); 

        timer.suspend(); 

        add(gameScr); 

        Panel rightScr = new Panel(); 

        rightScr.setLayout(new GridLayout(2, 1, 0, 30)); 

        rightScr.setSize(120, 500); 

        add(rightScr); 

        // 右边信息窗体的布局 

        MyPanel infoScr = new MyPanel(); 

        infoScr.setLayout(new GridLayout(4, 1, 0, 5)); 

        infoScr.setSize(120, 300); 

        rightScr.add(infoScr); 

        // 定义标签和初始值 

        Label scorep = new Label("分数:", Label.LEFT); 

        Label levelp = new Label("级数:", Label.LEFT); 

        scoreField = new TextField(8); 

        levelField = new TextField(8); 

        scoreField.setEditable(false); 

        levelField.setEditable(false); 

        infoScr.add(scorep); 

        infoScr.add(scoreField); 

        infoScr.add(levelp); 

        infoScr.add(levelField); 

        scorep.setSize(new Dimension(20, 60)); 

        scoreField.setSize(new Dimension(20, 60)); 

        levelp.setSize(new Dimension(20, 60)); 

        levelField.setSize(new Dimension(20, 60)); 

        scoreField.setText("0"); 

        levelField.setText("1"); 

        // 右边控制按钮窗体的布局 

        MyPanel controlScr = new MyPanel(); 

        controlScr.setLayout(new GridLayout(5, 1, 0, 5)); 

        rightScr.add(controlScr); 

        // 定义按钮play 

        Button play_b = new Button("开始游戏"); 

        play_b.setSize(new Dimension(50, 200)); 

        play_b.addActionListener(new Command(Command.button_play, gameScr)); 

        // 定义按钮Level UP 

        Button level_up_b = new Button("提高级数"); 

        level_up_b.setSize(new Dimension(50, 200)); 

        level_up_b.addActionListener(new Command(Command.button_levelup, 

                gameScr)); 

        // 定义按钮Level Down 

        Button level_down_b = new Button("降低级数"); 

        level_down_b.setSize(new Dimension(50, 200)); 

        level_down_b.addActionListener(new Command(Command.button_leveldown, 

                gameScr)); 

        // 定义按钮Level Pause 

        Button pause_b = new Button("游戏暂停"); 

        pause_b.setSize(new Dimension(50, 200)); 

        pause_b.addActionListener(new Command(Command.button_pause, gameScr)); 

        // 定义按钮Quit 

        Button quit_b = new Button("退出游戏"); 

        quit_b.setSize(new Dimension(50, 200)); 

        quit_b.addActionListener(new Command(Command.button_quit, gameScr)); 

        controlScr.add(play_b); 

        controlScr.add(level_up_b); 

        controlScr.add(level_down_b); 

        controlScr.add(pause_b); 

        controlScr.add(quit_b); 

        setVisible(true); 

        gameScr.requestFocus(); 

    } 

// 重写MyPanel类,使Panel的四周留空间 

class MyPanel extends Panel { 

    public Insets getInsets() { 

        return new Insets(30, 50, 30, 50); 

    } 

// 游戏画布类 

class GameCanvas extends Canvas implements KeyListener { 

    final int unitSize = 30; // 小方块边长 

    int rowNum; // 正方格的行数 

    int columnNum; // 正方格的列数 

    int maxAllowRowNum; // 允许有多少行未削 

    int blockInitRow; // 新出现块的起始行坐标 

    int blockInitCol; // 新出现块的起始列坐标 

    int[][] scrArr; // 屏幕数组 

    Block b; // 对方快的引用 

    // 画布类的构造方法 

    GameCanvas() { 

        rowNum = 15; 

        columnNum = 10; 

        maxAllowRowNum = rowNum - 2; 

        b = new Block(this); 

        blockInitRow = rowNum - 1; 

        blockInitCol = columnNum / 2 - 2; 

        scrArr = new int[32][32]; 

    } 

    // 初始化屏幕,并将屏幕数组清零的方法 

    void initScr() { 

        for (int i = 0; i < rowNum; i++) 

            for (int j = 0; j < columnNum; j++) 

                scrArr[i][j] = 0; 

        b.reset(); 

        repaint(); 

    } 

    // 重新刷新画布方法 

    public void paint(Graphics g) { 

        for (int i = 0; i < rowNum; i++) 

            for (int j = 0; j < columnNum; j++) 

                drawUnit(i, j, scrArr[i][j]); 

    }  

    // 画方块的方法 

    public void drawUnit(int row, int col, int type) { 

        scrArr[row][col] = type; 

        Graphics g = getGraphics(); 

        switch (type) { // 表示画方快的方法 

        case 0: 

            g.setColor(Color.black); 

            break; // 以背景为颜色画 

        case 1: 

            g.setColor(Color.blue); 

            break; // 画正在下落的方块 

        case 2: 

            g.setColor(Color.magenta); 

            break; // 画已经落下的方法 

        } 

        g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize, 

                unitSize, unitSize, true); 

        g.dispose(); 

    } 

    public Block getBlock() { 

        return b; // 返回block实例的引用 

    } 

    // 返回屏幕数组中(row,col)位置的属性值 

    public int getScrArrXY(int row, int col) { 

        if (row < 0 || row >= rowNum || col < 0 || col >= columnNum) 

            return (-1); 

        else 

            return (scrArr[row][col]); 

    } 

    // 返回新块的初始行坐标方法 

    public int getInitRow() { 

        return (blockInitRow); // 返回新块的初始行坐标 

    } 

    // 返回新块的初始列坐标方法 

    public int getInitCol() { 

        return (blockInitCol); // 返回新块的初始列坐标 

    } 

    // 满行删除方法 

    void deleteFullLine() { 

        int full_line_num = 0; 

        int k = 0; 

        for (int i = 0; i < rowNum; i++) { 

            boolean isfull = true; 

            L1: for (int j = 0; j < columnNum; j++) 

                if (scrArr[i][j] == 0) { 

                    k++; 

                    isfull = false; 

                    break L1;  

                } 

            if (isfull) 

                full_line_num++; 

            if (k != 0 && k - 1 != i && !isfull) 

                for (int j = 0; j < columnNum; j++) { 

                    if (scrArr[i][j] == 0) 

                        drawUnit(k - 1, j, 0); 

                    else 

                        drawUnit(k - 1, j, 2); 

                    scrArr[k - 1][j] = scrArr[i][j]; 

                } 

        } 

        for (int i = k - 1; i < rowNum; i++) { 

            for (int j = 0; j < columnNum; j++) { 

                drawUnit(i, j, 0); 

                scrArr[i][j] = 0; 

            } 

        } 

        ERS_Block.score += full_line_num; 

        ERS_Block.scoreField.setText("" + ERS_Block.score); 

    } 

    // 判断游戏是否结束方法 

    boolean isGameEnd() { 

        for (int col = 0; col < columnNum; col++) { 

            if (scrArr[maxAllowRowNum][col] != 0) 

                return true; 

        } 

        return false; 

    } 

    public void keyTyped(KeyEvent e) { 

    } 

    public void keyReleased(KeyEvent e) { 

    } 

    // 处理键盘输入的方法 

    public void keyPressed(KeyEvent e) { 

        if (!ERS_Block.isPlay) 

            return; 

        switch (e.getKeyCode()) { 

        case KeyEvent.VK_DOWN: 

            b.fallDown(); 

            break; 

        case KeyEvent.VK_LEFT: 

            b.leftMove(); 

            break; 

        case KeyEvent.VK_RIGHT: 

            b.rightMove(); 

            break; 

        case KeyEvent.VK_SPACE: 

            b.leftTurn(); 

            break; 

        } 

    } 

// 处理控制类 

class Command implements ActionListener { 

    static final int button_play = 1; // 给按钮分配编号 

    static final int button_levelup = 2; 

    static final int button_leveldown = 3; 

    static final int button_quit = 4; 

    static final int button_pause = 5; 

    static boolean pause_resume = true; 

    int curButton; // 当前按钮 

    GameCanvas scr; 

    // 控制按钮类的构造方法 

    Command(int button, GameCanvas scr) { 

        curButton = button; 

        this.scr = scr; 

    } 

    // 按钮执行方法 

    public void actionPerformed(ActionEvent e) { 

        switch (curButton) { 

        case button_play: 

            if (!ERS_Block.isPlay) { 

                scr.initScr(); 

                ERS_Block.isPlay = true; 

                ERS_Block.score = 0; 

                ERS_Block.scoreField.setText("0"); 

                ERS_Block.timer.resume(); 

            } 

            scr.requestFocus(); 

            break; 

        case button_levelup: 

            if (ERS_Block.level < 10) { 

                ERS_Block.level++; 

                ERS_Block.levelField.setText("" + ERS_Block.level); 

                ERS_Block.score = 0; 

                ERS_Block.scoreField.setText("" + ERS_Block.score); 

            } 

            scr.requestFocus(); 

            break; 

        case button_leveldown: 

            if (ERS_Block.level > 1) { 

                ERS_Block.level--; 

                ERS_Block.levelField.setText("" + ERS_Block.level); 

                ERS_Block.score = 0; 

                ERS_Block.scoreField.setText("" + ERS_Block.score); 

            } 

            scr.requestFocus(); 

            break; 

        case button_pause: 

            if (pause_resume) { 

                ERS_Block.timer.suspend(); 

                pause_resume = false; 

            } else { 

                ERS_Block.timer.resume(); 

                pause_resume = true; 

            } 

            scr.requestFocus(); 

            break; 

        case button_quit: 

            System.exit(0); 

        } 

    } 

// 方块类 

class Block { 

    static int[][] pattern = { 

            { 0x0f00, 0x4444, 0x0f00, 0x4444 },// 用十六进至表示,本行表示长条四种状态 

            { 0x04e0, 0x0464, 0x00e4, 0x04c4 }, 

            { 0x4620, 0x6c00, 0x4620, 0x6c00 }, 

            { 0x2640, 0xc600, 0x2640, 0xc600 }, 

            { 0x6220, 0x1700, 0x2230, 0x0740 }, 

            { 0x6440, 0x0e20, 0x44c0, 0x8e00 }, 

            { 0x0660, 0x0660, 0x0660, 0x0660 } }; 

    int blockType; // 块的模式号(0-6) 

    int turnState; // 块的翻转状态(0-3) 

    int blockState; // 快的下落状态 

    int row, col; // 块在画布上的坐标 

    GameCanvas scr; 

    // 块类的构造方法 

    Block(GameCanvas scr) { 

        this.scr = scr; 

        blockType = (int) (Math.random() * 1000) % 7; 

        turnState = (int) (Math.random() * 1000) % 4; 

        blockState = 1; 

        row = scr.getInitRow(); 

        col = scr.getInitCol(); 

    } 

    // 重新初始化块,并显示新块 

    public void reset() { 

        blockType = (int) (Math.random() * 1000) % 7; 

        turnState = (int) (Math.random() * 1000) % 4; 

        blockState = 1; 

        row = scr.getInitRow(); 

        col = scr.getInitCol(); 

        dispBlock(1); 

    } 

    // 实现“块”翻转的方法 

    public void leftTurn() { 

        if (assertValid(blockType, (turnState + 1) % 4, row, col)) { 

            dispBlock(0); 

            turnState = (turnState + 1) % 4; 

            dispBlock(1); 

        } 

    } 

    // 实现“块”的左移的方法 

    public void leftMove() { 

        if (assertValid(blockType, turnState, row, col - 1)) { 

            dispBlock(0); 

            col--; 

            dispBlock(1); 

        } 

    } 

    // 实现块的右移 

    public void rightMove() { 

        if (assertValid(blockType, turnState, row, col + 1)) { 

            dispBlock(0); 

            col++; 

            dispBlock(1); 

        } 

    } 

    // 实现块落下的操作的方法 

    public boolean fallDown() { 

        if (blockState == 2) 

            return (false); 

        if (assertValid(blockType, turnState, row - 1, col)) { 

            dispBlock(0); 

            row--; 

            dispBlock(1); 

            return (true); 

        } else { 

            blockState = 2; 

            dispBlock(2); 

            return (false); 

        } 

    } 

    // 判断是否正确的方法 

    boolean assertValid(int t, int s, int row, int col) { 

        int k = 0x8000; 

        for (int i = 0; i < 4; i++) { 

            for (int j = 0; j < 4; j++) { 

                if ((int) (pattern[t][s] & k) != 0) { 

                    int temp = scr.getScrArrXY(row - i, col + j); 

                    if (temp < 0 || temp == 2) 

                        return false; 

                } 

                k = k >> 1; 

            } 

        } 

        return true; 

    } 

    // 同步显示的方法 

    public synchronized void dispBlock(int s) { 

        int k = 0x8000; 

        for (int i = 0; i < 4; i++) { 

            for (int j = 0; j < 4; j++) { 

                if (((int) pattern[blockType][turnState] & k) != 0) { 

                    scr.drawUnit(row - i, col + j, s); 

                } 

                k = k >> 1; 

            } 

        } 

    } 

// 定时线程 

class MyTimer extends Thread { 

    GameCanvas scr; 

    public MyTimer(GameCanvas scr) { 

        this.scr = scr; 

    } 

    public void run() { 

        while (true) { 

            try { 

                sleep((10 - ERS_Block.level + 1) * 100); 

            } catch (InterruptedException e) { 

            } 

            if (!scr.getBlock().fallDown()) { 

                scr.deleteFullLine(); 

                if (scr.isGameEnd()) { 

                    ERS_Block.isPlay = false; 

                    suspend(); 

                } else 

                    scr.getBlock().reset(); 

            } 

        } 

    } 

class WinListener extends WindowAdapter { 

    public void windowClosing(WindowEvent l) { 

        System.exit(0); 

    } 

}

 

 

 

6.实验感悟

本次实验,我们没有进入实验楼完成,自己在电脑上自主做实验,在游戏设计的时候并不是一帆风顺,有许多问题都咨询了学长与同学。

在实验中我们也有查阅网上有关的游戏资料,增长了许多知识与见识,对我的程序设计有很大的帮助。

 

转载于:https://www.cnblogs.com/yg137565645/p/4567753.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2015年总结2016展望

2015感觉过的很快&#xff0c;非常充实。一直在忙着不是写这就是写那。反正是没有闲过。 家庭更和睦&#xff0c;孩子也大了一岁&#xff0c;活泼可爱&#xff0c;父母身体也还可以&#xff0c;经济增长和2014差不多。 15年最大的事就是项目T算是成功运转了&#xff0c;14年废了…

birt插件 web_Maven方式集成BIRT 4.6 Webviewer

平生从未见过如此糟糕的官方maven发布质量&#xff0c;窃以为是公司只想卖商业版本&#xff0c;对应的开源版本BIRT简直就是抱来养的。为了顺利集成BIRT&#xff0c;采用两步走方式&#xff1a;以eclipse的能运行版本为比较基础&#xff0c;再使用maven方式集成验证。传统动态w…

八大排序算法:插入(2:插入、希尔)、选择(2:选择、堆)、交换(2:冒泡、快速)、归并、基数

八大排序算法 发表于2012/7/23 16:45:18 662397人阅读 分类&#xff1a; c/c 数据结构与算法 概述 排序有内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排…

Active Record 数据库迁移总结

占位符!转载于:https://www.cnblogs.com/mahong-shaojiu-ruby/p/5098150.html

cm0中断优先级_转:第13章 FreeRTOS任务优先级修改及其分配方案

FreeRTOS的配置&#xff1a;FreeRTOSConfig.h文件中的配置如下&#xff1a;/* Ensure stdint is only used by the compiler, and not the assembler. */#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)#include extern volatile uint32_t ulHighFrequency…

网页图表Highcharts实践教程之标签组与载入动画

网页图表Highcharts实践教程之标签组与载入动画 Highcharts标签组 在图表的大部分元素都提供了标签功能。但很多时候&#xff0c;我们需要额外说明一些信息。这个时候借助原有的图表元素的标签功能就不是很方便。Highcharts为用户提供了标签组功能。使用该功能可以在图表区的任…

有趣的C语言面试题

1、gets() 和 fgets()函数 问题&#xff1a;找出下面代码的问题 #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; }答&#xff1a;上面代码里的…

Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析

本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处本文代码以MTK平台Android 4.4为分析对象。与Google原生AOSP有些许差异。请读者知悉。前置文章&#xff1a; 《Android 4.4 Kitkat Phone工作流程浅析(一)__概要和学习计划》《Android 4.4 Kitkat Phone工作流程浅…

米家对讲机_对前面两代产品不断总结和完善的产物,米家对讲机2代开箱体验...

4月1日&#xff0c;小米终于发布了旗下对讲机产品的2代&#xff1a;米家对讲机2。憋了两年后&#xff0c;可见米家对讲机团队针对前期米家对讲机一代以及1S很多用户反应的问题还是非常重视的&#xff0c;所以这次的米家对讲机2代基本上改进了前期存在的不足&#xff0c;补齐了前…

【MFC】vs2013_MFC使用文件之15.mfc 按钮CBitmapButton的使用

本文是基于对话框的 博文基于 无幻 的博文为基础写的 http://blog.csdn.net/akof1314/article/details/4951836 笔者使用mfc撑死2个星期&#xff0c;不过这是有c基础的前提下接触mfc&#xff0c;昨天看到了网上对qt creator的评论&#xff0c;感觉好高大上&#xff0c;回去试了…

C语言存储空间布局以及static解析

本文我将采用Linux环境测试C语言存储空间布局&#xff0c;以及采用VC6.0来测试static的常见用法。采用linux环境来测试c语言存储空间布局&#xff0c;是因为Linux很容易利用shell命令中的size命令查看到进程存储区各段的大小。采用VC6.0来测试static的常见用法&#xff0c;是因…

老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...

老李推荐&#xff1a;第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后&#xff0c;会把这些事件排队放入一个由事件源维护的队列&#xff0c;然后其他地方如Monkey类的runMonkeyCycles方法…

swift 打包sdk_在封装SDK中Swift和OC混编之相互调用

oc和swift混编之相互调用.jpg在非SDK中&#xff1a;1、swift调用oc步骤&#xff1a;创建 工程名-Bridging-Header.h放入oc的头文件&#xff0c;swift即可调用在swift项目中或者在oc项目中&#xff0c;创建oc或者swift文件&#xff0c;Xcode都会提示问你是否要创建桥接文件&…

网络上常用的一些网站

域名查询 Whois 查询 站长工具 http://whois.chinaz.com/ 是用来查询域名的IP以及所有者等信息的传输协议。简单说&#xff0c;whois就是一个用来查询域名是否已经被注册&#xff0c;以及注册域名的详细信息的数据库&#xff08;如域名所有人、域名注册商&#xff09;。通过…

字符串替换:用参数字符数组成员替换字符串中的占位符(面试题)

1、问题描述&#xff1a; 请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。 则将剩下的参数字符添加到字符串的结尾。给定一个字符串A&#xff0c;同时给定它的长度n及参数…

华为手机怎么设置应用不全屏显示_手机投屏智能电视画面比例不合适怎么办?...

手机投屏到电视的比例不对怎么办知乎上有网友私下&#xff1a;“苹果手机屏幕镜像投屏到电视上&#xff0c;画面不能全屏&#xff0c;然后在网上查了一下是因为显示比例的问题&#xff0c;请问怎么解决&#xff1f;”这个问题说简单也简单&#xff0c;说难也难。说简单是因为想…

bootstrap精简教程

bootstrap 的学习非常简单&#xff0c;并且它所提供的样式又非常精美。只要稍微简单的学习就可以制作出漂亮的页面。 bootstrap中文网&#xff1a;http://v3.bootcss.com/ bootstrap提供了三种类型的下载&#xff1a; 1、用于生产环境的bootstrap 编译并压缩后的CSS、JavaScri…

群晖docker安装cms_Nas码农篇:群晖Docker安装Gitlab

Git大多数码农来说都很熟悉&#xff0c;团队协作开发必备。今天来分享下在群晖Docker上安装gitlab。群晖上安装gitlab有两种方式&#xff0c;一种是直接安装套件中心的gitlab&#xff0c;另一种是在docker中自定义安装。我们这里选择后者&#xff0c;因为这种方式可以安装最新版…

微信红包问题:找出某个出现次数超过红包总数一半的红包的金额(面试题)

1、问题描述 春节期间小明使用微信收到很多个红包&#xff0c;非常开心。在查看领取红包记录时发现&#xff0c;某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现&#xff0c;要求算法尽可能高效。 给定一个红包的金额数组gif…

手把手教你使用CocoaPods管理你的iOS第三方开源类库

手把手教你使用CocoaPods管理你的iOS第三方开源类库 本文转载自&#xff1a;http://kittenyang.com/cocoapods 鉴于我开这个博客的初衷是记录自己平时的技术积累&#xff0c;而我平时又属研究iOS最多&#xff0c;因此这个博客在一定程度上可以说是以iOS技术为主的博客。既然研究…