C语言实现一个打飞机的小游戏
更新时间:2020年2月25日 07:46:11 作者:白嘉明
本文主要详细介绍C语言实现的简单的飞行飞机游戏。 文章中的示例代码非常详细,具有一定的参考价值。 有兴趣的朋友可以参考一下
本文实例分享了飞机游戏的C语言实现的具体代码,供大家参考。 具体内容如下
编译环境:vs2019
需要:
在同一平面内,控制火炮发射的三个方向,在空间内发射子弹。 敌方和友方的客机仍然会在天空中随机飞行。 击中空中飞行的敌方客机加一分,击中友方客机扣一分。
想法:
先初始化程序,然后绘制指令和地图,然后进入无限循环。 在循环中,三个主要步骤分别是实现客机在天上飞行、通过awd空格键控制游戏内容、满足游戏条件时加分。
实践:
首先,要实现客机的动画效果,本质就是在控制台输出x轴上的三个字符串,并使这三个字符串看起来同时相连。 这里我用自己写赌马游戏的经验:在第一个无限循环中,分别输出第一、二、三串的字符串来表示第一步,然后输出的x轴坐标值三个字符串是自动递增的。 ,第二个无限循环去掉前面字符串连接的痕迹,然后分别输出三个字符串,说明已经进行了第二步。 由于外层的for循环没有sleep函数,所以这看起来就是同时连接三个字符串的效果。 这样就可以用无限循环来表示三架客机是连续连接的。
下一步是通过getch函数改变大炮(一个角色)的枪口方向。 当枪口切换时,炮弹的初始化位置也会改变。 当按下空格键时,炮弹(角色)将从其初始位置初始化。 该位置沿着设定的路线不断连接。 当横横轴坐标与客机坐标一致时,判断是否为敌方客机|—0>。 如果是,则分数加一,否则分数减一。
另外,程序中还有很多细节,这里不再赘述。
困难:
看起来三根弦同时连接起来。 这是一种算法。 一旦你学会了它,你应该像记住基础知识一样牢牢地记住它。 了解了原理之后,就比较容易掌握了。
阐明:
这是一个简单的小程序。 在这个程序中达到同样疗效的方法有很多种,我使用了很多链表来存储、统计和使用各种数据。 事实上,通过单一阵法也能达到类似的疗效。 以我目前的认知,使用链表,直接输出字符串,优点是简单明了。 但同时,也造成了疗效显现上比较致命的缺陷。
注意:
由于编译器的原因,程序中的_kbhit()和_getch()函数在其他编译器上编译时可能会出现错误。 解决办法是去掉函数后面的“_”。
跑步疗效:
代码:
#include #include #include #include #include #include void HideCursor(); //隐藏光标 void gotoxy(int x, int y); //光标定位 #define R 26 //飞机每次随机尾x坐标最大值 #define N 20 //通关分数 int ax[3] = { 0 }; //三个飞机尾坐标,全局 int y[3] = { 3,7,11 }; //三个y轴,全局,查表法确定飞机的y轴位置 //因为炮弹的飞行距离是一次加两个格子,为了奇偶对应这里的y轴必须都是偶数 int i; //循环用变量 int fd[3]; //控制飞机种类 void cshcxhs() //初始化函数 { system("title 打飞机小游戏"); //标题 system("mode con cols=100 lines=30"); //宽100,高30 HideCursor(); //光标隐藏 gotoxy(46, 12); //介绍游戏规则 printf("游戏规则:"); gotoxy(36, 14); printf("w a d键控制方向,空格键发射炮弹"); gotoxy(26, 16); printf("击中敌军飞机 |---0> 加一分,击中友军飞机 >>>>>> 减一分"); gotoxy(40, 18); printf("累计得分 %d 结束游戏",N); Sleep(2800); system("cls"); int k; //循环用变量 gotoxy(40, R); //初始化炮台 for (k = 0; k < 17; k++) printf("_"); gotoxy(46, R); printf("[_O_]"); gotoxy(48, 25); //中间x:48 printf("|"); int j; srand((unsigned)time(NULL)); //初始化随机种子 for (j = 0; j "); else printf(">>>>>>"); gotoxy(ax[i] - 1, y[i]); //清除飞机尾部留下的痕迹 printf(" "); ax[i]++; //然后飞机尾坐标自增,下次自飞机尾输出整架飞机 } void dhpdxshs() //画出飞机,并让飞机在飞过x94的时候消失 { for (i = 0; i = 94) //判断每架飞机头有没有超过94 { gotoxy(94, y[i]); //满足条件在每架飞机的94处输出空格 printf(" "); if (ax[i]+6 > 100) //每架飞机的飞机头超过100,则重置一个随机数 { ax[i] = rand() % R; //修改为小于R的随机数 fd[i] = rand() % 2; } } } } int da = 2; //da = 1为最左 默认中间 炮台方向,全局变量 int yip = 0; //是否开炮,0不开,1,2,3三个方向 int rtde = 1; //是否发射完毕,必须等待炮弹发射完成 int shells_x; //炮弹坐标 int shells_y; void ckkzhs() { char ch; ch = _getch(); if (ch == 'd' || ch == 'D') { gotoxy(49, 25); printf("/"); //炮台右转 gotoxy(47, 25); printf(" "); da = 3; //最右状态 } if (ch == 'A' || ch == 'a') { gotoxy(47, 25); printf("\"); //转义转义字符 gotoxy(48, 25); printf(" "); da = 1; //最左状态 } if (ch == 'W' || ch == 'w') { gotoxy(48, 25); printf("|"); gotoxy(47, 25); printf(" "); gotoxy(49, 25); printf(" "); da = 2; } if (ch == ' '&& rtde == 0) //大炮处于发射完毕状态,且按下空格 { if (da == 2) //中 炮台朝向 yip = 2; if (da == 1) //左 { yip = 1; shells_x = 45; //初始化炮弹的坐标 } if (da == 3) //右 { yip = 3; shells_x = 51; } shells_y = 23; //初始化炮弹的坐标 } } void dpfshs() //向三个不同方向发射炮弹 { rtde = 1; //循环,炮弹移动时代表未开炮完毕 if (yip == 2) { shells_x = 48; gotoxy(shells_x, shells_y-=2); printf("o"); gotoxy(shells_x, shells_y+2); printf(" "); } if (yip == 1) { gotoxy(shells_x-=2, shells_y-=2); printf("o"); gotoxy(shells_x+2, shells_y+2); printf(" "); } if (yip == 3) { gotoxy(shells_x+=2, shells_y-=2); printf("o"); gotoxy(shells_x-2, shells_y+2); printf(" "); } if (shells_y <= 1) //炮弹越界,消除炮弹 { yip = 0; //炮弹越界,炮弹停下 gotoxy(48, 1); //并消除 printf(" "); gotoxy(23, 1); printf(" "); gotoxy(73, 1); printf(" "); rtde = 0; //炮弹越界,开炮完毕,可进行下一轮开炮 } } int score; //得分 void pdfsjzhs() //判断是否击中和统计信息 { for (i = 0; i = ax[i] && shells_x <= ax[i] + 6 && shells_y == y[i])//击中时 { if(fd[i]==1) score++; //击中一次,得分加一 else { score--; if (score = N) //游戏结束判断 { system("cls"); //清屏 gotoxy(39,15); printf("您通关了,最终得分:%d !", N); gotoxy(0, 29); exit(0); } } void process() //流程 { while (1) { dhpdxshs(); //飞机动画函数 if (_kbhit()) { ckkzhs(); //操作函数 } dpfshs(); //大炮效果函数 pdfsjzhs(); //判断是否击中和统计信息 Sleep(18); } } int main() { cshcxhs(); //初始化程序 process(); //流程 return 0; } void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void gotoxy(int x, int y) { COORD pos = { x,y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); }
缺点:
我在程序中输出客机时,采用的是在客机尾部直接输出整个客机的方法,并且飞机尾部的x坐标是自增的。 这是一个非常愚蠢但非常简单的方法。 这种做法导致客机在掠过控制台最大长度的同时,未能一一清理客机机身。 一旦机头越过控制台最大长度,就会出现程序输出错误。 “边界”是让客机消失的自然效果,所以我们要用最后一架客机所在的y轴上的最后6条x轴条纹作为木板来遮挡客机,从而达到类似的效果。
因为程序没有创意合金弹头小游戏c语言源码,都是我自己写的。 由于本人能力有限,在写这个程序的时候,隐隐感觉自己的程序有很多代码复用性,结构严谨,运行效率低等问题。 为了解决以上问题,同时我对很多函数和变量标识符都采用了盲写和汉语拼音的做法。
作为一名C语言菜鸟,对于未知的知识我一直抱有学习和谦虚的态度。 如果有人能对我的程序的可重用性、严谨性和运行效率提出建议,我将非常感激。
以上就是本文的全部内容。 希望对您的学习有所帮助合金弹头小游戏c语言源码,也希望您多多支持脚本之家。