前言

本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下

编译环境:vs2019

需求:

在同一个平面内,控制大炮发射的三个方向,空格发射炮弹,敌军和友军飞机会一直随机在天上飞过,击中天上飞行的敌军飞机加一分,击中友军飞机减一分

思路:

先初始化程序,再画出说明和地图,接着进入无限循环,循环中分别实现飞机不停地在天上飞、通过wasd空格键控制游戏内容、符合游戏条件时加分三个主要步骤。

做法:

首先要实现飞机的动画效果,本质是要在控制台上输出三条x轴上输出一个字符串,并要让这三个字符串看起来在同时移动。

这里我借助了写赌马大赛的经验:在第一次无限循环内分别循环输出第1、2、3条的字符串表示走出第一步,然后再自增三个字符串x轴坐标数值,第二次无限循环清除上一次字符串移动痕迹,并再分别输出三条字符串,表示走出第二步。

由于内层for循环没有休眠函数,这样看起来就是三个字符串同时移动的效果。这样就可以通过无限循环表示三架飞机不停地移动了。

接下来是通过getch函数改变大炮炮口指向方向(一个字符),在炮口指向切换的同时,炮弹初始化的位置也同样会改变,当按下空格时,炮弹(一个字符)会从他的初始化位置沿设定好的路线不停移动,当横纵轴坐标与飞机坐标相匹配时判断是否为敌军飞机|—0>,是则得分加一,否则得分减一。

此外程序里还有很多细节,这里不一一赘述。

难点:

看起来让三个字符串同时移动。这是一种算法,学会了就应该应该像记住基础知识一样牢牢记住他。明白了原理之后,比较容易掌握。

注意:

由于编译器原因程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的 “_”。

【源码获取】:

源码在C语言/C++交流②群:967051845!资料共享在群文件里面,有需要的可以自行添加~

此代码并不够高效,如果对代码有任何建议,都可以添加小编的学习交流群,欢迎大家来讨论~

运行效果:

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string.h>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,高30HideCursor();    //光标隐藏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:48printf("|");int j;srand((unsigned)time(NULL));  //初始化随机种子for (j = 0; j < 3; j++)   //初始化飞机的初始x坐标,写在循环之外{ax[j] = rand() % R;fd[j] = rand() % 2;}gotoxy(0, R);printf(" 得分:");   //分数x坐标9
}void hcfjhs()   //画出飞机函数
{gotoxy(ax[i], y[i]);  //首先在飞机尾处输出整架飞机if (fd[i] == 1)printf("|---0>");elseprintf(">>>>>>"); gotoxy(ax[i] - 1, y[i]); //清除飞机尾部留下的痕迹printf(" ");ax[i]++;   //然后飞机尾坐标自增,下次自飞机尾输出整架飞机
}void dhpdxshs()   //画出飞机,并让飞机在飞过x94的时候消失
{for (i = 0; i < 3; i++)  //每架飞机都走一步{hcfjhs();if (ax[i] + 6 >= 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 < 3; i++){if (shells_x >= ax[i] && shells_x <= ax[i] + 6 && shells_y == y[i])//击中时{if(fd[i]==1)score++;   //击中一次,得分加一else{score--;if (score <= 0)score = 0;}rtde = 0;   //击中时,开炮完成gotoxy(ax[i]-1, y[i]);  //击中后,在原飞机尾巴处消除飞机printf(" ");ax[i] = rand() % R;  //修改为小于10的随机数fd[i] = rand() % 2;  //飞机种类发生变化gotoxy(shells_x, shells_y); //在击中飞机的地方输出空格消除炮弹尸体printf(" ");shells_x = 0, shells_y = 0; //炮弹击中飞机,炮弹越界,下一次空格将自动初始化炮弹}}gotoxy(9, R);printf("%d",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);
}

作为一名C语言新手,对未知的知识始终抱有学习和谦卑的态度,如有贵人能够对程序提出复用性、严谨性、运行效率上的建议,小编将不胜感激。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

另外本程序还需要一部分头文件,想要领取可以添加小编的C语言/C++交流②群:967051845,源码在群文件里

福利来咯~

学习过程很“痛苦”,但是结果大家一定会对自己很满意!

如果觉得学习资料难找的话,可以添加小编的C语言/C++交流群:967051845! 学习资料已经共享在群里了,期待你的加入~

C语言经典游戏开发,零基础也能打造微信飞机大战相关推荐

  1. html5游戏开发-零基础开发RPG游戏-开源讲座(四)

    了解上三篇的内容请点击: html5[color=rgb(68, 68, 68) !important]游戏开发-零基础开发RPG游戏-开源讲座(一) http://www.html5cn.org/a ...

  2. html5游戏开发-零基础开发《圣诞老人送礼物》小游戏

    开言: 以前lufy前辈写过叫"html5游戏开发-零基础开发RPG游戏"的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识. ...

  3. 微信小游戏开发零基础教程(一)-CocosCreator

    微信小游戏零基础教程(一)-CocosCreator 最终效果预览 准备工作 创建工程 测试第一个场景 最终效果预览 本教程最后制作的游戏效果: 准备工作 下载 微信开发者工具 最新版->下载地 ...

  4. html5游戏开发-零基础开发RPG游戏-开源讲座(三)-卷轴对话实现

    前两篇,RPG的开发已经实现了添加地图和添加游戏人物,本篇来实现地图的卷轴滚动和人物对话的实现,效果如下 想要了解前两篇内容,请电击下面的链接 html5游戏开发-零基础开发RPG游戏-开源讲座(一) ...

  5. html5游戏开发-零基础开发RPG游戏-开源讲座(四)-游戏脚本化地图跳转

    首先,本篇文章是零基础开发RPG游戏-开源讲座系列文章的第四篇,来实现游戏的脚本化,和利用游戏脚本实现地图场景的切换,离上次更新貌似很长时间了,你在看下面的文字之前,需要先了解前三篇在下啰嗦了些什么东 ...

  6. html5游戏开发-零基础开发RPG游戏-开源讲座(一)

    因为上一篇雷电的开发中,有朋友反应不太理解,本篇将以零基础的视点,来讲解如何开发一款RPG游戏. 在游戏的世界里,我们可以看到各种地图,各种游戏人物,看到人物在地图上行走,对话等,无论是地图还是人物, ...

  7. UE4 虚幻4游戏程序编程开发零基础视频教程

    UE4虚幻腾讯课堂丁树凯丁老师游戏程序编程开发零基础视频教程. 目录: 第01季:虚幻4基础操作 第02季:用UE4蓝图制作FPS 第03季:面向对象思想在UE4蓝图中的应用 第04季:UE4中的人工 ...

  8. 麒麟子Javascript游戏编程零基础教程大纲

    大家好,我是麒麟子, 开源项目<幼麟棋牌-四川麻将>(泄漏版叫 <达达麻将>)作者,成都幼麟科技创始人. 开源项目地址(Github与Gitee同步更新): Github ht ...

  9. Ps编程脚本开发零基础学脚本(一)

    Ps编程脚本开发零基础学脚本(附电子书+脚本案例) PS脚本自动化简介: Photoshop 通过脚本支持外部自动化.在 Windows 中,可以使用支持 COM 自动化的脚本语言,例如 VB Scr ...

  10. 零基础不建议学前端_web前端开发零基础怎样入门-哈尔滨前端学习

    web前端开发零基础怎样入门-哈尔滨前端学习,俗话说,知己知彼,百战百胜.要想学好web前端,首先要了解什么是web前端,下面由小编来给大家介绍一下: 1什么是web? Web就是在Http协议基础之 ...

最新文章

  1. “cvSnakeImage”: 找不到标识符
  2. Centos下gcc的安装、gcc的更新、gcc安装过程中报错:make[1]: *** [stage1-bubble] 错误 2
  3. loadrunner 更新中......
  4. 『TensorFlow』专题汇总
  5. ASP.NET MVC:@helper 不能调试
  6. 清华源安装指定版本tensorflow
  7. 部分常用算法分析总结
  8. kubernetes1.8.4 安装指南 -- 10. 测试nginx服务
  9. 使用ama0实现串口通信_“ AMA”是什么意思,以及如何使用它?
  10. 干货 | 深度学习的可解释性研究(一):让模型「说人话」
  11. java 应用分模块_在Java 11中创建一个简单的模块化应用教程
  12. 超全总结!2020年那些大牛AI论文
  13. 百度网盘高速下载资源
  14. 计算机网络6版,计算机网络教程(第6版)
  15. python 使用word转pdf遇到的问题
  16. 大数据预测模型的深度学习导论
  17. DDR中ODT(on-die termination)
  18. WCF学习(2)- 契约
  19. 基于CANoen协议实现DSP系统与上位机CAN的通讯
  20. 湫湫系列故事——减肥记Ⅰ

热门文章

  1. 达梦数据库DM8企业版--命令行方式的安装、创建数据库和注册服务
  2. 2022年4月中国数据库排行榜:华为GaussDB 挺进前四,榜单前八得分扶摇直上
  3. JAVA 编程练习题
  4. [OCR]用tesseract训练自己的字体
  5. VS 2017番茄插件安装破解教程:visual assist
  6. Java后端开发实习记录
  7. seay源代码审计系统的使用方式
  8. python int占几个字节_int占几个字节(c语言)?
  9. 软件开发和服务项目价格构成及评估方法
  10. protues元件库中英文对照表,对初学者找不到元件的很有用