项目: 用封装的方法实现飞机大战游戏
生活随笔
收集整理的这篇文章主要介绍了
项目: 用封装的方法实现飞机大战游戏
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
目录
- 一、项目描述和最终的成果展示
- 二、用函数进行封装
- 三、新型的发射子弹功能
- 四、实现移动的敌机功能和更正屏幕闪烁,清除光标功能
- 五、订正一些BUG和完成一些美化
这是上一次的飞机大战游戏的项目。项目: 最简单的飞机大战游戏
上次没有用函数进行的封装。这次在上次的基础上进行封装和一些功能的优化。
一、项目描述和最终的成果展示
项目描述: 在上一次的基础上用函数进行了封装,对于一些功能也进行了一些优化。最终效果图如下:
二、用函数进行封装
代码如下:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<conio.h>//全局变量 int position_x,position_y;//飞机位置 int high,width;//游戏画面尺寸void startup()//数据的初始化 {high = 20;width = 30;position_x = high/2;//飞机的上下位置position_y = width/2;//飞机的左右·位置 }void show()//显示画面 {system("cls");int i,j;for(i=0;i<high;i++){for(j=0;j<width;j++){if( (i == position_x) && (j== position_y))//输出飞机printf("☆");elseprintf(" ");}printf("\n");} }void updateWithoutInput()//与用户输入无关的更新 {}void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit())//判断有无输入{input=getch();if( input == 'a' || input == 'A')position_y--;//左移if( input == 'd' || input == 'D')position_y++;//右移if( input == 'w' || input == 'W')position_x--;//上移if( input == 's' || input == 'S')position_x++;//下移} }int main(void) {startup(); //数据的初始化while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }三、新型的发射子弹功能
代码如下:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<conio.h>//全局变量 int position_x,position_y;//飞机位置 int high,width;//游戏画面尺寸 int bullet_x,bullet_y;//子弹位置//定义隐藏光标函数 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }void startup()//数据的初始化 {high = 120;width = 100;position_x = high/2;//飞机的上下位置position_y = width/2;//飞机的左右·位置bullet_x = 0;bullet_y = position_y; }void show()//显示画面 {system("cls");int i,j;for(i=0;i<high;i++){for(j=0;j<width;j++){if( (i == position_x) && (j== position_y))//输出飞机printf("☆");else if( (i == bullet_x)&&(j == bullet_y))printf("|");//输出子弹elseprintf(" ");}printf("\n");} }void updateWithoutInput()//与用户输入无关的更新 {if(bullet_x>-1)bullet_x--; }void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit()){input=getch();if( input == 'a' || input == 'A')position_y--;//左移if( input == 'd' || input == 'D')position_y++;//右移if( input == 'w' || input == 'W')position_x--;//上移if( input == 's' || input == 'S')position_x++;//下移if( input == ' '){bullet_x=position_x-1;bullet_y=position_y;}} }int main(void) {startup();//数据的初始化while(1){show();//显示画面HideCursor();//隐藏光标,防止光标乱闪。updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
四、实现移动的敌机功能和更正屏幕闪烁,清除光标功能
代码如下;
#include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<conio.h>//全局变量 int position_x,position_y;//飞机位置 int high,width;//游戏画面尺寸 int bullet_x,bullet_y;//子弹位置 int enemy_x,enemy_y;//敌机的位置 int score;//得分//定义隐藏光标函数 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }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 startup()//数据的初始化 {system("color 09");high = 30;width =50;position_x = high/2;//飞机的上下位置position_y = width/2;//飞机的左右位置bullet_x = 0;bullet_y = position_y;enemy_x=0;enemy_y=position_y;score=0; }void show()//显示画面 {//system("cls");gotoxy(0,0);int i,j;for(i=0;i<high;i++){for(j=0;j<width;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("*");//输出敌机elseprintf(" ");//输出空格}printf("\n");}printf("得分:%d\n",score); }void updateWithoutInput()//与用户输入无关的更新 {static int speed=0;if(bullet_x>-1)bullet_x--;if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子弹击中飞机{score++;//分数无效enemy_x=-1;//产生新的敌机enemy_y=rand()%width;bullet_x=-2;//子弹无效}// 用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机// 这样修改,虽然用户按键的交互速度还是很快,但是NPC的移动显示可以降速if(speed<10)speed++;if(speed == 10 ){enemy_x++;speed = 0;} }void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit()){input=getch();if( input == 'a' || input == 'A')position_y--;//左移if( input == 'd' || input == 'D')position_y++;//右移if( input == 'w' || input == 'W')position_x--;//上移if( input == 's' || input == 'S')position_x++;//下移if( input == ' '){bullet_x=position_x-1;bullet_y=position_y;}} }int main(void) {startup();//数据的初始化while(1){show();//显示画面HideCursor();//隐藏光标,防止光标乱闪。updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
五、订正一些BUG和完成一些美化
我们的项目基本是已经完成了。但是还有很多的漏洞。 比如: 飞机控制越界问题,以及敌机越界问题。 而且界面不够好看我们要再美化一下。 以及增加游戏暂停功能。 游戏结束功能。代码如下:
#include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<conio.h>//全局变量 int position_x,position_y;//飞机位置 int high,width;//游戏画面尺寸 int bullet_x,bullet_y;//子弹位置 int enemy_x,enemy_y;//敌机的位置 int score;//得分//定义隐藏光标函数 void HideCursor() {CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); }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 startup()//数据的初始化 {system("color 09");high = 30;width =50;position_x = high/2;//飞机的上下位置position_y = width/2;//飞机的左右位置bullet_x = 0;bullet_y = position_y;enemy_x=0;enemy_y=position_y;score=0; }void show()//显示画面 {//system("cls");gotoxy(0,0);int i,j;for(i=0;i<high;i++){for(j=0;j<width;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 if(j==width-1&&i==position_x)//飞机那一行,因为有飞机多占一格,所以要删除前面的一个空格printf("\b+");else if(j==width-1)printf("+");else if(i==high-1)printf("-");elseprintf(" ");//输出空格}printf("\n");}printf("得分:%d\n",score);printf("按1键游戏暂停\n"); }void updateWithoutInput()//与用户输入无关的更新 {static int speed=0;if(bullet_x>-1)bullet_x--;if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子弹击中飞机{score++;//分数无效enemy_x=-1;//产生新的敌机enemy_y=rand()%width+1;bullet_x=-2;//子弹无效}// 用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机// 这样修改,虽然用户按键的交互速度还是很快,但是NPC的移动显示可以降速if(speed<6)speed++;if(speed == 6 ){enemy_x++;if(enemy_x==high-1)//如果飞机越界再次生成{enemy_x=-1;//产生新的敌机enemy_y=rand()%width+1;}if( enemy_x==position_x-1)//撞机了 游戏结束{system("cls");printf("飞机坠毁了,游戏结束\n");printf("分数为:%d\n",score);printf("请重启再开始新的一局\n");while(1){}}speed = 0;} }void updateWithInput()//与用户输入有关的更新 {char input;if(kbhit()){input=getch();if( input == 'a' || input == 'A'){position_y--;//左移if(position_y==0)//判断是否越界{position_y++;}}if( input == 'd' || input == 'D'){position_y++;//右移if(position_y==width-2)//判断是否越界{position_y--;}}if( input == 'w' || input == 'W'){position_x--;//上移if(position_x==1)//判断是否越界{position_x++;}}if( input == 's' || input == 'S'){position_x++;//下移if(position_x==high-1)//判断是否越界{position_x--;}}if( input == ' ')//发射子弹{bullet_x=position_x-1;bullet_y=position_y;}if( input == '1')//按1键游戏暂停{while(1){input=getch();if(input == '1')//再按1键游戏继续break;}}} }int main(void) {startup();//数据的初始化while(1){show();//显示画面HideCursor();//隐藏光标,防止光标乱闪。updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0; }效果图如下:
总结
以上是生活随笔为你收集整理的项目: 用封装的方法实现飞机大战游戏的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 项目: 最简单的飞机大战游戏
- 下一篇: 项目: 用函数实现反弹球消砖块