游戏的总体结构根据C语言的循环制作的
本来还想说点什么但是注释里面都有
代码:#include二.会发射子弹的飞机#include #include #include int main() { //按q键退出 srand((unsigned int)time(NULL)); //设置一个随机数种子,以便下面rand的使用 //我们得先构造出一个飞机活动的空间 int top = 0, bottom = 10, right = 20, left = 0;//这分别是飞机所在空间上下左右的最大限度 int x = 10; //飞机的初始纵坐标 int y = 10; //飞机的初始横坐标 char input; //通过输入字符来控制飞机的移动 int ny = 5; //给靶子一个初始的位置 int isfire = 0; //控制他攻击(激光) 我设置它1为攻击0为停止攻击 int iskilled = 0; //判断靶子有没有被打掉,0为没有被打掉,1为被打掉了 int time = 0; //我用一个时间来将消灭的靶子,隔了两个次循环过后有恢复 int sum = 0; //记录我打靶子的分数 while (1) { system("cls"); //构造一个简单飞机 if (iskilled == 1) { ny = rand() % 20; //将他设为随机数,让靶子出现在任意空间 } if (y == ny && isfire == 1) //判断靶子有没有被消灭 { iskilled = 1; sum++; } if (iskilled == 0) //靶子被消灭后,重新生成靶子 { for (int i = 0; i < ny; i++) printf(" "); printf("+n"); } if (isfire == 1) //发射激光 { for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { printf(" "); } printf("|"); //显示分数 if (i == 5) { for (int j = 0; j <= right - y+1; ++j) { printf(" "); } printf("当前的分数为:%d", sum); } printf("n"); } isfire = 0;//这一步是将激光变成单次发射,不然就是一直发射了 } else { for (int i = 0; i < x; i++) { //显示分数 if (i == 5) { for (int j = 0; j <= right + 1; ++j) { printf(" "); } printf("当前的分数为:%d", sum); } printf("n"); } } for (int j = 0; j < y; j++) { printf(" "); } printf("*n"); for (int j = 0; j < y-2; j++) printf(" "); printf("*****n"); for (int j = 0; j < y-1; j++) printf(" "); printf("* *"); if (iskilled == 1) //判断靶子有没有被消灭 time++; //如果被消灭,就开始记录时间 if (time == 2) //靶子消灭之后,过了两次循环,就重新恢复靶子 { iskilled = 0; time = 0; //并将时间重新设置为零,以便下一次的使用 } input = _getch(); //这就是飞机的移动功能,通过增加减少纵坐标和横坐标来控制飞机的移动,w向上,s向下,a向左,d向右 if (input == 'w') //向上 x--; if (input == 's') //向下 x++; if (input == 'a') //向左 y--; if (input == 'd') //向右 y++; if (input == ' ') isfire = 1; //我们将空格设置为攻击键,如果按空格就是将isfire变成1 if (input == 'k')//设置一个退出按钮 break; //飞机活动的范围 if (x < top) x=top; //如果飞机移动到顶部就x也就是纵坐标减一让他在原位置处,不能超出这个范围 if (x > bottom) x--; //跟上面一样的 if (y < left) y++; if (y > right) y--; } return 0; }
我觉得发射激光太low了,只用发射子弹才是正宗的飞机大战,所以我写了一个改良版只能发射子弹的,比较简单,所以注释有点少
代码#include三.改良改良版的飞机大战(函数)#include #include #include int main() { int x=10, y=10;//飞机的初始位置 int top = 0, bottom = 20, left = 0, right = 10;//飞机活动的空间大小 char input;//通过输入的字符来控制飞机的移动 int isfire = 0; //判断是否攻击 while (1) { system("cls");; int t = x; if (isfire == 1) { for (int i = 0; i < x; i++) { for (int j = 0; j < t-1; j++) printf("n"); for (int k = 0; k < y; k++) printf(" "); printf("on");; for (int i = 0; i < x - t; i++) printf("n"); for (int i = 0; i < y; i++) printf(" "); printf("*n"); for (int i = 0; i < y - 2; i++) printf(" "); printf("*****n"); for (int i = 0; i < y - 1; i++) printf(" "); printf("* *"); t--; system("cls"); } isfire = 0; } system("cls"); for (int i = 0; i < x; i++) printf("n"); for (int i = 0; i < y; i++) printf(" "); printf("*n"); for (int i = 0; i < y - 2; i++) printf(" "); printf("*****n"); for (int i = 0; i < y - 1; i++) printf(" "); printf("* *"); input = _getch(); if (input == 'w') x--; if (input == 's') x++; if (input == 'a') y--; if (input == 'd') y++; if (input == ' ') isfire=1; //输入空格,就将isfire变成yi以至于能攻击 } return 0; }
这个版的有一个总体的游戏框架,看着舒服很多,而且它的画质比前面都高,因为没有用到system("cls")清屏这个操作,我使用了void gotoxy(int x, int y) 光标移动到(x,y)位置,然后在用到void HideCursor() 来进行隐藏光标
我先给出这个两个函数,以后就用就行了,还有使用这个函数的头文件是#include
void gotoxy(int x, int y) //光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor() //用于隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
总体代码
#include#include #include #include #include int position_x, position_y; //飞机的位置 int weight, height; //游戏的范围 char input; //控制飞机的移动 int bullet_x, bullet_y; //发射子弹的位置 int enemy_x, enemy_y; //敌人的位置 static int speed = 0; //用来控制敌机下落的速度 int score = 0; //记录分数 int speedsize = 15; //控制速度的大小 int market[5] = { 10,100,200,300,500 }; //分数达到多少分增加的速度 int stage = 0; //记录分数达到哪一个阶段 void HideCursor() //光标移动到(x,y)位置 { CONSOLE_CURSOR_INFO cursor_info = { 1,0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } void gotoxy(int x, int y) //用于隐藏光标 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle, pos); } void starup() //数据初始化 { HideCursor(); weight = 32; height = 18; position_x = height / 2; position_y = weight / 2; bullet_x = 0; bullet_y = -1; enemy_x = 0; enemy_y = weight / 2; } void show() //显示画面 { int i, j; gotoxy(0, 0); for (i = 0; i < height; i++) { for (j = 0; j < weight; j++) { if (i == position_x && j == position_y) printf("*"); //输出飞机* else if(i == bullet_x && j == bullet_y) printf("|"); //输出子弹 else if (i == enemy_x && j == enemy_y) printf("@"); //输出敌方飞机 else printf(" "); } printf("n"); } printf("你的分数为:%d", score); } void updatewithoutInput() //与用户输入无关的数据 { //设置一堵墙防止飞机飞出范围 if (position_x>= height) position_x--; if (position_x < 0) position_x++; if (position_y >= weight) position_y--; if (position_y < 0) position_y++; if (score == market[stage]) //分数达到下一个阶段就增加飞机的速度 { speedsize-=3; stage++; } srand((unsigned int)time(NULL)); //随机数种子 if (bullet_x == enemy_x && bullet_y == enemy_y) { score++; //记录消灭敌机的分数+1 enemy_y = rand() % weight; //产生新的飞机 enemy_x = 0; } if (bullet_x >= 0) bullet_x--; speed++; if (speed == speedsize) { if (enemy_x <= height)//将敌机控制在范围内落下 { enemy_x++; } else { enemy_x = -1; //防止落下后没有敌机生成 enemy_y = rand() % weight; } speed = 0; } } void updatewithInput() //与用户输入相关的数据 { if (kbhit()) { input = _getch(); if (input == 'w') //向上移动 position_x--; if (input == 's') //向下移动 position_x++; if (input == 'a') //向左移动 position_y--; if (input == 'd') //向右移动 position_y++; if (input == ' ') //攻击 { bullet_x = position_x - 1; bullet_y = position_y; } if (input == 'z') //按z游戏暂停 system("pause"); } } int main() { starup(); //数据初始化 while (1) //游戏循环执行 { show(); //显示画面 updatewithoutInput(); //与用户输入无关的数据 updatewithInput(); //与用户输入有关的数据 } return 0; }
最后感谢大家,我们一起加油。



