目录

一、初设想

首先

但是!

二、做优化

1)准备

2)具体步骤

a)代码重构

b)新式子弹

c)添加敌机

三、消除屏闪,最终完善

完全体《狂野打飞机》如下:

家人们火速玩起来,录屏情况下得分破百私信我必给你超级大惊喜!


由于上一个弹球没有游戏体验,接下来做一个可以正常游玩的游戏《狂野打飞机》!doge

一、初设想

首先

根据上一个游戏思维,我们首先要做的就是在屏幕上呈现出飞机,然后飞机可以移动,这个移动呢必须得是我们主动控制它来移动,不能是像小球一样自己移动。所以我们第一时间想到是通过scanf输入指令,然后做出判断并运行,每次移动后都进行清屏然后重新输出

但是呢我们如果用的是scanf的话,每次输入都得按一下回车来执行,这十分影响我们的游戏体验,不可取!所以我们要用getch()来控制飞机的飞行。

要用getch()的话我们首先要加一个库函数#include<conio.h>用kbhit()来判断是否输入规定值。

正所谓打飞机,肯定得有靶子,并且飞机得能发射。 所以程序如下:d

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{int i, j;int x = 10;int y = 5;char input;int isFire = 0;int nx = 5;int isKilled = 0;while (1){system("cls");if (!isKilled){for (j = 0; j < nx; j++)printf(" ");printf(" + \n");}if (isFire == 0){for (i = 0; i < y; i++)printf("\n");}else{for (i = 0; i < y; i++){for (j = 0; j < x; j++)printf(" ");printf("  |\n");}if (x + 2 == nx)isKilled = 1;isFire = 0;}for (i = 0; i < y; i++)printf("\n");for (j = 0; j < x; j++)printf(" ");printf("  *\n");for (j = 0; j < x; j++)printf(" ");printf("****** \n");for (j = 0; j < x; j++)printf(" ");printf(" *  * \n");if (_kbhit()) {input = _getch();if (input == 'a')x--;if (input == 'd')x++;if (input == 'w')y--;if (input == 's')y++;if (input == ' ')isFire = 1;}}return 0;
}

但是!

这个游戏玩起来十分卡顿,并且有闪屏游戏体验依旧很差,就此,我们对它进行进一步的更新。


二、做优化

1)准备

对游戏的优化我们主要做的是添加几个函数,将会用到startup()、show()、updateWithoutInput()、updateWithInput()几个函数中实现,主函数与之前大体无差。

2)具体步骤

a)代码重构

我们首先要做的就是把前面所说的函数加入到之前程序中去,并做出一定的修改。

主要是通过startup()函数来进行数据的初始化,用show()函数来显示画面,用updateWithoutInput()和updateWithInput()函数来进行与用户输入无关和有关的更新。修改后代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>//全局变量
int pos_x, pos_y;
int high, width;
//初始化数据
void startup()
{high = 20;width = 30;pos_x = width / 2;pos_y = high / 2;
}
//显示画面
void show()
{system("cls");int i, j;for (i = 0; i < high; i++){for (j = 0; j < width; j++){if ((i == pos_y) && (j == pos_x))printf("@");elseprintf(" ");}printf("\n");}}
//与用户输入无关的更新
void updateWithoutInput()
{}
//与用户输入有关的更新
void updateWithInput()
{char input;if (_kbhit()){input = _getch();if (input == 'a')pos_x--;if (input == 'd')pos_x++;if (input == 'w')pos_y--;if (input == 's')pos_y++;}
}int main()
{startup();while (1){show();updateWithoutInput();updateWithInput();}return 0;
}

这样我们就完成了第一步的输出一个可以移动的飞机。


b)新式子弹

        飞机必不可少的就是子弹,我们可以像之前那样定义子弹的位置,然后让输出后的子弹自己移动。代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>//全局变量
int pos_x, pos_y;
int high, width;
int bul_x, bul_y;
//初始化数据
void startup()
{high = 20;width = 30;pos_x = width / 2;pos_y = high / 2;bul_x = pos_x;bul_y = 0;
}
//显示画面
void show()
{system("cls");int i, j;for (i = 0; i < high; i++){for (j = 0; j < width; j++){if ((i == pos_y) && (j == pos_x))printf("@");else if ((i == bul_y) && (j == bul_x))printf("|");elseprintf(" ");}printf("\n");}}
//与用户输入无关的更新
void updateWithoutInput()
{//子弹自行移动if (bul_y > -1)bul_y--;
}
//与用户输入有关的更新
void updateWithInput()
{char input;if (_kbhit()){input = _getch();if (input == 'a')pos_x--;if (input == 'd')pos_x++;if (input == 'w')pos_y--;if (input == 's')pos_y++;if (input == ' '){bul_y = pos_y - 1;bul_x = pos_x;}}
}int main()
{startup();while (1){show();updateWithoutInput();updateWithInput();}return 0;
}

这样我们的飞机就可以发射子弹了。


c)添加敌机

        作为打飞机游戏,没有敌机怎么打?所以我们现在的任务就是添加敌机,然后让敌机移动起来,并且在我们的子弹击中敌机后让敌机消失

第一步还是定义敌机的位置,然后让敌机自主地向下移动,即在与用户输入无关的更新的函数updateWithoutInput()中利用静态变量speed静态变量不会被初始化,也不会被别的文件调用,再次调用仍是上次的值,每执行10次updateWithoutInput()函数,敌机移动一次(太快没法打

        然后就是在我们的子弹击中敌机后,敌机和子弹都会消失,然后重新随机生成敌机,并定义一个计分板来计数。其中rand()函数(我们在程序中使用的rand()%width意思就是随机在1~width之间选取一个整数产生一个0~9的随机整数。

程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>//全局变量
int pos_x, pos_y;
int high, width;
int bul_x, bul_y;
int enm_x, enm_y;
int score;
//初始化数据
void startup()
{high = 20;width = 30;pos_x = width / 2;pos_y = high / 2;bul_x = pos_x;bul_y = 0;enm_y = 0;enm_x = pos_x;score = 0;
}
//显示画面
void show()
{system("cls");int i, j;for (i = 0; i < high; i++){for (j = 0; j < width; j++){if ((i == pos_y) && (j == pos_x))printf("@");else if ((i == enm_y) && (j == enm_x))printf("$");else if ((i == bul_y) && (j == bul_x))printf("|");elseprintf(" ");}printf("\n");}printf("得分:%d\n", score);
}
//与用户输入无关的更新
void updateWithoutInput()
{//子弹自行移动if (bul_y > -1)bul_y--;//击中if ((bul_x == enm_x) && (bul_y == enm_y)){score++;enm_y == 0;enm_x = rand() % width;}//敌机飞出地图if (enm_y > high){enm_y = -1;enm_y = rand() % width;}static int speed = 0;if (speed < 10)speed++;if (speed == 10){enm_y++;speed = 0;}
}
//与用户输入有关的更新
void updateWithInput()
{char input;if (_kbhit()){input = _getch();if (input == 'a')pos_x--;if (input == 'd')pos_x++;if (input == 'w')pos_y--;if (input == 's')pos_y++;if (input == ' '){bul_y = pos_y - 1;bul_x = pos_x;}}
}int main()
{startup();while (1){show();updateWithoutInput();updateWithInput();}return 0;
}

这就是经过以上完善的程序,它具有了可玩性,但是闪屏极为严重游戏体验依旧很差!接下来我们就要消除它的屏闪。


三、消除屏闪,最终完善

我们消除屏闪首先要知道屏闪是由什么造成的,屏闪的原因就是每次运行到show()函数都进行一次清屏,并且光标不能回到原点,跟随输出到处跑。

        故而需要用到库函数#include<windows.h>中的void gotoxy(int x,int y)函数,在show()函数里首先调用gotoxy(0,0),光标移动到原点位置,在进行重画,这样就不会使光标到处跑造成屏闪。

同时使用隐藏光标函数HideCursor()解决光标到处跑

完全体《狂野打飞机》如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>//消除屏闪
void gotoxy(int x, int y)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x,y };SetConsoleCursorPosition(handle, pos);
}//消除光标
void HideCursor() {//第二个值为0表示隐藏光标CONSOLE_CURSOR_INFO cursor_info = { 1,0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}//全局变量
int pos_x, pos_y;
int high, width;
int bul_x, bul_y;
int enm_x, enm_y;
int score;
//初始化数据
void startup()
{high = 20;width = 50;pos_x = width / 2;pos_y = high / 2;bul_x = pos_x;bul_y = 0;enm_y = 0;enm_x = pos_x;score = 0;
}
//显示画面
void show()
{gotoxy(0, 0);int i, j;for (i = 0; i < high; i++){for (j = 0; j < width; j++){if ((i == pos_y) && (j == pos_x))printf("@");else if ((i == enm_y) && (j == enm_x))printf("$");else if ((i == bul_y) && (j == bul_x))printf("|");elseprintf(" ");}printf("\n");}printf("《狂野打飞机》");printf("得分:%d\n", score);
}
//与用户输入无关的更新
void updateWithoutInput()
{//子弹自行移动if (bul_y > -1)bul_y--;//击中if ((bul_x == enm_x) && (bul_y == enm_y)){score++;enm_y = 0;enm_x = rand() % width;}//敌机飞出地图if (enm_y > high){score--;enm_y = -1;enm_y = rand() % width;}static int speed = 0;if (speed < 50)speed++;if (speed == 50){enm_y++;speed = 0;}
}
//与用户输入有关的更新
void updateWithInput()
{char input;if (_kbhit()){input = _getch();if (input == 'a')pos_x--;if (input == 'd')pos_x++;if (input == 'w')pos_y--;if (input == 's')pos_y++;if (input == ' '){bul_y = pos_y - 1;bul_x = pos_x;}}
}int main()
{startup();while (1){show();updateWithoutInput();updateWithInput();HideCursor();}return 0;
}

        家人们火速玩起来,录屏情况下得分破百私信我必给你超级大惊喜!

【C语言】 《狂野打飞机》初步构想以及进阶 以及防止闪屏相关推荐

  1. c语言运动的小人编码,C语言,我的小人在动的时候会闪屏,我用的是cls实现的,求知道该怎么办?...

    C语言,我的小人在动的时候会闪屏,我用的是cls实现的,求知道该怎么办?0 #include#include#include#includetypedefenum{DIR_NULL,UP,RIGHT, ...

  2. java数据可视化平台初步构想

    2019独角兽企业重金招聘Python工程师标准>>> java数据可视化平台初步构想 平台架构 权限系统-负责后台用户权限 后台管理系统(oss)-负责后台运营配置相关操作 前端展 ...

  3. 元宇宙来了,用好名字好概念赋能中国制造国际营销的初步构想

    元宇宙来了,用好名字好概念赋能中国制造国际营销的初步构想   李正海 金山顶尖科技股份有限公司 夏婧源 西安翻译学院 图片来源于网络     阿基米德曾说:"给我一个支点,我就能撬起地球.& ...

  4. C语言飞机大战程序思路,C语言代码实现飞机大战

    本文实例为大家分享了C语言实现简单飞机大战的具体代码,供大家参考,具体内容如下 这个游戏的功能很单一,也就是"飞机大战",哈哈哈哈.总共只有300多行代码左右,你也可以想想它会有多 ...

  5. 飞机订票系统c语言大作业,C语言知识学习飞机订票系统

    C语言知识学习飞机订票系统 课程设计 课程:数据结构 专业班级:xx软件工程 xx班 姓名:xx 学号:xxx 姓名:xxx 学号:xxx 设计时间:xxx 指导老师:xxx 课程设计题:飞机订票系统 ...

  6. 自动发射子弹c语言,C语言代码实现飞机大战

    本文实例为大家分享了C语言实现简单飞机大战的具体代码,供大家参考,具体内容如下 这个游戏的功能很单一,也就是"飞机大战",哈哈哈哈.总共只有300多行代码左右,你也可以想想它会有多 ...

  7. c语言小游戏-飞机大战

    今天我们来尝试用easyx图形库实现c语言小游戏-飞机大战(源代码和图片已经在结尾给出) 先引用头文件 #include<stdio.h> #include<time.h>// ...

  8. 飞机大战C语言代码百度云,C语言代码实现飞机大战

    本文实例为大家分享了C语言实现简单飞机大战的具体代码,供大家参考,具体内容如下 这个游戏的功能很单一,也就是"飞机大战",哈哈哈哈.总共只有300多行代码左右,你也可以想想它会有多 ...

  9. 飞机订票系统c语言大作业,c语言课程设计---飞机订票系统

    <c语言课程设计---飞机订票系统>由会员分享,可在线阅读,更多相关<c语言课程设计---飞机订票系统(46页珍藏版)>请在皮匠网上搜索. 1.C 语言程序设计课程设计报告设计 ...

  10. 飞机订票系统程序设计c语言,C语言课程设计——飞机订票系统源代码

    <C语言课程设计--飞机订票系统源代码>由会员分享,可在线阅读,更多相关<C语言课程设计--飞机订票系统源代码(9页珍藏版)>请在人人文库网上搜索. 1.include/标准输 ...

最新文章

  1. 多线程pthread_join()的作用
  2. python File write()方法
  3. ACdream 1431 Sum vs Product
  4. 两台机器做互相信任 scp不使用密码
  5. 笔记:深入理解JVM 第3章 垃圾回收器与内存分配策略
  6. 回顾build 2016:你好,这是微软迄今最好的Windows开发平台
  7. 不是说好一起长大的吗?
  8. Godaddy 上的域名服务器状态查询
  9. EmbarassedBirds全体开发人员落泪
  10. C++ + Irrlicht整一个东东?
  11. SpringBoot 之日志logback使用[简单上手版]
  12. matlab数据栅格化,新手求卫星降水数据CMORPH_V1.0数据完整处理方法,有matlab打开的代码但是不会处理...
  13. RK系列SDK -- i2s mclk 无输出
  14. 微弱信号检测matlab代码,微弱信号检测实验报告.doc
  15. php画图抗锯齿,关于抗锯齿的详细介绍
  16. 基于GEE使用Landsat 8和Landsat 5影像进行分类
  17. 为什么要进行软件验收测试?如何获得软件验收测试报告
  18. ks live room danmu
  19. android自带的webview有广告,android webview 拦截广告
  20. 《等着我吧,我会回来》 苏·西蒙诺夫

热门文章

  1. 如何选用GPU云服务器?
  2. umail for linux,umail邮件服务器 For Linux安装图示(独立安装包)
  3. 读《周一清晨的领导课》有感
  4. 接口调用一会正常,一会失败
  5. 工业物联网的实际应用案例以及技术分析
  6. 励志电影排行榜2011
  7. Android 模拟器 连接局域网
  8. 友情链接对于网站来说有什么作用?
  9. 先进的半导体晶圆清洗技术
  10. Python判断html的元素,python判断网页元素是否存在的方法