代码重构与程序优化——实现简易的打砖块游戏 Part 1

接着昨天的反弹球继续写。运用昨天的反弹球可以写出例如flappy bird,打砖块等游戏的核心部分。(图文无关)


前置知识:函数(C语言)

今天来讲打砖块的第一部分,代码重构与程序优化。

代码重构

为了方便我们的开发,程序中的各个部分通常要用函数进行封装,这样会使各种功能模块化,方便我们日后的调试和维护。

这里给出一个书上的最初的简易游戏框架。

1
2
3
4
5
6
7
8
9
   int main(){
startup();
while (1){
show();
updateWithInput();
updateWithoutInput();
}
return 0;
}

解释一下那几个函数所需要包含的功能。

startup:游戏数据初始化

show:显示游戏画面

updateWithInput:和用户输入有关的游戏更新

updateWithoutInput:和用户输入无关的游戏更新

以后的程序我尽量都会按照这样的结构进行代码编写,这只是一个最基础的框架,随着游戏变得更复杂,游戏所需要的函数就会变得更多。

好,那么让我们把昨天的框架弹球程序按照这个结构重构一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define Top 20
#define Bottom 0
#define Left 0
#define Right 30

int x,y,vx,vy;

void startup() {
x = 5;
y = 10;
vx = 1;
vy = 1;
}

void show() {

system("cls");
for (int i = Bottom; i < Top; i++) {
for (int j = Left; j < Right; j++) {
if ((i == Bottom) || (i == Top - 1))
printf("-");
else if ((j == Left) || (j == Right - 1))
printf("|");
else if ((i == x) && (j == y))
printf("O");
else
printf(" ");
}
printf("\n");
}

}

void updateWithInput() { //该程序不需要用户进行输入,所以该函数是空的,但是不可以删去

}

void updateWithoutInput() {
x = x + vx;
y = y + vy;

if (x == Top - 1 || x == Bottom + 1)
vx = -vx;
if (y == Left + 1 || y == Right - 1)
vy = -vy;

Sleep(100);
}


int main() {
startup();
while (1) {
show();
updateWithInput();
updateWithoutInput();
}
return 0;
}

重构完成。不过该程序在显示方面有一个很明显的缺陷:闪屏现象严重,并且伴随光标胡乱跳动。这是由于system(“cls”)的性能较差导致的。现在来介绍一个新的清屏函数。这里面牵扯到一个叫句柄的东西,不理解的话只需要记住这个函数能干什么就好。下面给出实现方式。

1
2
3
4
5
6
7
   void gotoxy(int x, int y) {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}

然后把system(“cls”)替换为gotoxy(0,0)就可以了。

下面我们来解决光标的问题。可以自定义一个HideCursor()函数进行解决。

1
2
3
4
void HideCursor() {
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

这个函数只需要调用一次,放在while(1)之前就可以。

Part 1的内容就这么多了,在Part 2我就会说到打砖块游戏的实现方式,等到了Part 3,我们就可以用easyX来美化游戏了。


-------------本文结束,感谢您的阅读转载请注明原作者及出处-------------


本文标题:代码重构与程序优化——实现简易的打砖块游戏 Part 1

文章作者:Shawn Zhou

发布时间:2018年08月02日 - 22:08

最后更新:2018年12月09日 - 13:12

原始链接:http://yoursite.com/2018/08/02/代码重构——实现简易的打砖块游戏/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

知识无价,码字不易。对您有用,敬请打赏。金额随意,感谢关心。