在今天浏览的过程中,看到了一个用c语言做的简单的飞机小游戏,感觉非常有意思,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int x=15;
int y=5;
int i,n;
int bill=0;
char move;
int a=10; //障碍物的横坐标
int live=1; //障碍物存活状态
while(1) //意思是死循环
{
system("cls"); //清屏函数
if(live==1)
{
for(i=0;i<a;i++)
printf(" "); //输出障碍物左侧空格
printf("*");
}
if(bill==0)
{
for(i=0;i<y;i++)
printf("\n");
}
else {
for(i=0;i<y;i++){
for(n=0;n<(x+2);n++) //x+2的原因是飞机头左侧空格有x+2个
printf(" "); //这个+2是为了和身体对称而手动输出的
printf("|\n");
}
if(x+2==a) //意思是,如果射线横坐标+2等于障碍物坐标,那么障碍物被赋值为0,也就消失了
live=0; //+2是因为要配合机身对准机头
}
bill=0;
for(n=0;n<x;n++)
printf(" "); //输出飞机左侧的空格
printf(" *\n"); //输出飞机头部
for(n=0;n<x;n++)
printf(" "); //输出飞机身体部分左侧的空格
printf("*---*\n"); //因为飞机头部输出后有回车,所以飞机身体已经在下一行
for(n=0;n<x;n++)
printf(" "); //输出飞机尾巴部分左侧的空格
printf(" +-+ \n");
move=getch(); //注意getch函数的使用
if(move=='a') //注意是==不是=
x--; //就是x-1的意思,实现让飞机左移
if(move=='d')
x++;
if(move=='w')
y--;
if(move=='s')
y++;
if(move==' ')
bill=1;
} //这些代码都在while(1)内
return 0;
}
运行结果如图:
可以发现,在这个程序中是存在一些错误的。而错误的来源我通过查相关资料得知是函数名的错误使用,在vs中getch函数的函数名是_getch,而在dev c++中getch函数的函数名就是getch。因为我使用的是vs。所以我们将代码中的getch修改为_getch,再次运行,运行结果如图:
我们发现代码可以运行成功,并且可以实现所描述的飞机的移动和激光的发射,以及障碍物的摧毁功能。但是,我们发现,他的飞机的打印是通过for循环来在前面打空格,在在对应的位置打印*来实现的。这里我们可以使用结构体来定义一个光标对象,并在结构体中运用对应函数来实现光标的跳转操作。从而不用在使用for循环打空格,可以直接在想要的的位置打印飞机。障碍物的打印同样可以用这种方法来实现。
同时,在操作的过程中我们可以发现,当输入法输入的是中文的时候我们并不能通过WASD来实现飞机的移动,情况如图:
因此我在他的基础上加入了通过上下左右键来实现飞机的移动,这样使用上下左右来控制飞机的移动就不会出现因为输入法输入的是中文而不能移动飞机的情况了。同时,在他的代码中,障碍物的位置是固定的,不能移动,很容易就能通关游戏,毫无趣味性。因此,我通过随机数让障碍物的位置是随时移动的,以此来增加游戏的趣味性。以上就是我对他的小游戏进行的修改。最后,完整的代码如下:
#include <stdio.h>
#include<windows.h>
#include <stdlib.h>
#include <conio.h>
#define ROW 22 //游戏区行数
#define COL 42 //游戏区列数void CursorJump(int x, int y)
{
COORD pos; //定义光标位置的结构体变量
pos.X = x; //横坐标
pos.Y = y; //纵坐标
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
SetConsoleCursorPosition(handle, pos); //设置光标位置
}int main()
{
int x = 15;
int y = 5;
int i, n;
int bill = 0;
char move; int live = 1; //障碍物存活状态
while (1) //意思是死循环
{
system("cls"); //清屏函数 int a, b;
a = rand() % ROW;
b = rand() % COL; if (live == 1)
{
CursorJump(2 * b, a); //光标跳转到生成的随机位置处
printf("*");
}
if (bill == 0)
{
for (i = 0; i < y; i++)
printf("\n");
}
else {
for (i = 0; i < y; i++) {
CursorJump(x + 2, i);
printf("|"); }
if (x + 2 == a) //意思是,如果射线横坐标+2等于障碍物坐标,那么障碍物被赋值为0,也就消失了
live = 0; //+2是因为要配合机身对准机头
}
bill = 0; CursorJump(x, y);
printf(" *"); //输出飞机头部 CursorJump(x, y + 1);
printf("*---*"); //因为飞机头部输出后有回车,所以飞机身体已经在下一行 CursorJump(x, y + 2);
printf(" +-+ "); move = _getch(); //注意getch函数的使用
if (move == 'a' || move == '←') //注意是==不是=
x--; //就是x-1的意思,实现让飞机左移
if (move == 'd' || move == '→')
x++;
if (move == 'w' || move == '↑')
y--;
if (move == 's' || move == '↓')
y++;
if (move == ' ')
bill = 1;
} //这些代码都在while(1)内
return 0;
}
运行结果如图: