做游戏,学编程(C语言) 4 flappy bird
在学习数组之前,我们再做一个好玩的游戏:flappy bird。大家可以按照上一个教程中空战游戏的思路,先按照我们的提示,逐步地实现,如果有困难,再参考我们分步骤的代码,这样的锻炼效果最好。
备注:#include <windows.h> 或者 #include <cwindows.h>,大家测试下选适合自己编译器的版本。
第一步,实现一个简单下落的小鸟,实际上和飞机游戏中下落的敌机类似的效果。按空格键后,小鸟上升。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 全局变量
int high,width; // 游戏画面大小
int bird_x,bird_y; // 小鸟的坐标
int bar1_y,bar1_xDown,bar1_xTop; // 障碍物
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{high = 15;width = 20;bird_x = 0;bird_y = width/3;
}void show() // 显示画面
{gotoxy(0,0); // 清屏
int i,j;for (i=0;i<high;i++){for (j=0;j<width;j++){if ((i==bird_x) && (j==bird_y))printf("@"); // 输出小鸟
elseprintf(" "); // 输出空格
}printf("\n");}
} void updateWithoutInput() // 与用户输入无关的更新
{bird_x ++;Sleep(150);
}void updateWithInput() // 与用户输入有关的更新
{ char input;if(kbhit()) // 判断是否有输入
{input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == ' ') {bird_x = bird_x - 2;}}
}void main()
{startup(); // 数据初始化
while (1) // 游戏循环执行
{show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
第二步,同时实现下落的小鸟和静止障碍物的显示,注意为了刻画障碍物的位置、中间缝隙的大小,需要多个变量。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 全局变量
int high,width; // 游戏画面大小
int bird_x,bird_y; // 小鸟的坐标
int bar1_y,bar1_xDown,bar1_xTop; // 障碍物的相关坐标
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{high = 15;width = 20;bird_x = 0;bird_y = width/3;bar1_y = width/2;bar1_xDown = high/3;bar1_xTop = high/2;
}void show() // 显示画面
{gotoxy(0,0); // 清屏
int i,j;for (i=0;i<high;i++){for (j=0;j<width;j++){if ((i==bird_x) && (j==bird_y))printf("@"); // 输出小鸟
else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )printf("*"); // 输出墙壁
elseprintf(" "); // 输出空格
}printf("\n");}} void updateWithoutInput() // 与用户输入无关的更新
{bird_x ++;Sleep(150);
}void updateWithInput() // 与用户输入有关的更新
{ char input;if(kbhit()) // 判断是否有输入
{input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == ' ') {bird_x = bird_x - 2;}}
}void main()
{startup(); // 数据初始化
while (1) // 游戏循环执行
{show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
第三步,让上面的一列障碍物从右向左移动起来,类似飞机子弹移动的思路。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 全局变量
int high,width; // 游戏画面大小
int bird_x,bird_y; // 小鸟的坐标
int bar1_y,bar1_xDown,bar1_xTop; // 障碍物的相关坐标
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{high = 20;width = 50;bird_x = high/2;bird_y = 1;bar1_y = width/2;bar1_xDown = high/3;bar1_xTop = high/2;
}void show() // 显示画面
{gotoxy(0,0); // 清屏
int i,j;for (i=0;i<high;i++){for (j=0;j<width;j++){if ((i==bird_x) && (j==bird_y))printf("@"); // 输出小鸟
else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )printf("*"); // 输出墙壁
elseprintf(" "); // 输出空格
}printf("\n");}} void updateWithoutInput() // 与用户输入无关的更新
{bird_x ++;bar1_y --;Sleep(150);
}void updateWithInput() // 与用户输入有关的更新
{ char input;if(kbhit()) // 判断是否有输入
{input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == ' ') {bird_x = bird_x - 2;}}
}void main()
{startup(); // 数据初始化
while (1) // 游戏循环执行
{show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
第四步,判断小鸟是从障碍物的缝隙中通过,还是发生碰撞,并加入一个记分变量。基本和飞机游戏中判断击中敌机的思路差不多。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 全局变量
int high,width; // 游戏画面大小
int bird_x,bird_y; // 小鸟的坐标
int bar1_y,bar1_xDown,bar1_xTop; // 障碍物的相关坐标
int score; // 得分,经过障碍物的个数
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{high = 20;width = 50;bird_x = high/2;bird_y = 3;bar1_y = width/2;bar1_xDown = high/3;bar1_xTop = high/2;score = 0;
}void show() // 显示画面
{gotoxy(0,0); // 清屏
int i,j;for (i=0;i<high;i++){for (j=0;j<width;j++){if ((i==bird_x) && (j==bird_y))printf("@"); // 输出小鸟
else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )printf("*"); // 输出墙壁
elseprintf(" "); // 输出空格
}printf("\n");}printf("得分:%d\n",score);
} void updateWithoutInput() // 与用户输入无关的更新
{bird_x ++;bar1_y --;if (bird_y==bar1_y){if ((bird_x>=bar1_xDown)&&(bird_x<=bar1_xTop))score++;else{printf("游戏失败\n");system("pause");exit(0);}}Sleep(150);
}void updateWithInput() // 与用户输入有关的更新
{ char input;if(kbhit()) // 判断是否有输入
{input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == ' ') {bird_x = bird_x - 2;}}
}void main()
{startup(); // 数据初始化
while (1) // 游戏循环执行
{show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
第五步,类似飞机游戏中敌机重现的例子,障碍物在左边消失后,在右边循环出现。注意利用随机变量实现障碍物中间缝隙位置的不同。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <cwindow.h>
// 全局变量
int high,width; // 游戏画面大小
int bird_x,bird_y; // 小鸟的坐标
int bar1_y,bar1_xDown,bar1_xTop; // 障碍物1的相关坐标
int score; // 得分,经过障碍物的个数
void gotoxy(int x,int y)//类似于清屏函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);
}void startup() // 数据初始化
{high = 20;width = 20;bird_x = high/2;bird_y = 3;bar1_y = width;bar1_xDown = high/3;bar1_xTop = high/2;score = 0;
}void show() // 显示画面
{gotoxy(0,0); // 清屏
int i,j;for (i=0;i<high;i++){for (j=0;j<width;j++){if ((i==bird_x) && (j==bird_y))printf("@"); // 输出小鸟
else if ((j==bar1_y) && ((i<bar1_xDown)||(i>bar1_xTop)) )printf("*"); // 输出墙壁
elseprintf(" "); // 输出空格
}printf("\n");}printf("得分:%d\n",score);
} void updateWithoutInput() // 与用户输入无关的更新
{bird_x ++;bar1_y --;if (bird_y==bar1_y){if ((bird_x>=bar1_xDown)&&(bird_x<=bar1_xTop))score++;else{printf("游戏失败\n");system("pause");exit(0);}}if (bar1_y<=0) // 再新生成一个障碍物
{bar1_y = width;int temp = rand()%int(high*0.8);bar1_xDown = temp - high/10;bar1_xTop = temp + high/10;}Sleep(150);
}void updateWithInput() // 与用户输入有关的更新
{ char input;if(kbhit()) // 判断是否有输入
{input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == ' ') {bird_x = bird_x - 2;}}
}void main()
{startup(); // 数据初始化
while (1) // 游戏循环执行
{show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
这个flappy bird是不是很cool?大家也可以利用空战游戏、反弹球、flappy bird的实现思路,实现很多常见的小游戏了。
思考题,如果要求空战游戏中2台敌机同时出现、3个反弹球同时反弹、flappy bird画面中同时出现4个柱子,如何实现?
下一个教程,数组之生命游戏:知乎专栏
做游戏,学编程(C语言) 4 flappy bird相关推荐
- 视频教程-做游戏学Python-Python语言快速入门-Python
做游戏学Python-Python语言快速入门 20年软件项目开发管理经验 工信部人才交流中心特聘专家讲师 日本U-CAN在线教育特聘主任讲师 国家十二·五规划软件工程教材作者(书:清华大学出版社出版 ...
- 教孩子学编程 python语言版_教孩子学编程 PYTHON语言版 PDF_IT教程网
资源名称:教孩子学编程 PYTHON语言版 PDF 资源目录: 第1章Python基础--认识环境1 1.1认识Python3 1.2用Python编写程序5 1.3运行Python程序5 1.4本章 ...
- python教孩子学编程,教孩子学编程(Python语言版)
教孩子学编程(Python语言版) 第1 章 Python 基础:认识环境 #NiceHexSpiral.py #运行后,挺奇特,整个作画过程,完全呈现. import turtle colors=[ ...
- 但凡原神有二十树脂,我也不会来学编程(c语言)
但凡原神有二十树脂,我也不会来学编程(c语言)<第一天> 编程小白一只,从今天开始,将在本专栏记录本人学习编程的过程与心得~来自甘肃,普通双非,由于地域影响,想要在计算机方面得到好的出路, ...
- flappy+bird+c语言程序,C语言实现flappy bird游戏
本文实例为大家分享了C语言实现flappy bird的具体代码,供大家参考,具体内容如下 #include #include #include //定义全局变量 int high,width; //边 ...
- 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏
在飞翔的小鸟游戏中,玩家只需通过点击方向键操纵让小鸟避开绿色管道等障碍物即可继续前进.如果小鸟碰到管道,游戏立即结束. 那么如何用Java编写一款属于自己的飞翔的小鸟游戏呢?其过程并不复杂,本课程详细 ...
- 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目
开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...
- 少儿编程python线上课程-少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- python编程少儿游戏编程_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
- 优的python少儿编程课_少儿编程课堂|python – 用游戏学编程
学习编程是很快乐的事情.当我们自己开发出一套时下流行的游戏时,这满满的成就感比玩儿游戏本身高出了不知道会有多少倍. 接下来一段时间我们就python从0开始学习怎么开发 flappy brid 游戏. ...
最新文章
- 设置centos7语言显示环境
- [python]python字典
- 一次毕生难忘的 Java 内存泄漏排查经历
- linux明日命令(6):rm命令
- boost::process::environment相关的测试程序
- Linux网卡改为动态过去IP,Linux修改网卡ens33为eth0以及centos7下修改动态IP为静态IP地址...
- 把图片保存到数据库的实现
- mysql 1117_1117Mysql prepare预处理语句
- 构建复杂的应用程序 —— 重用与重构
- java从文件读入个人信息_Nacos 作为配置中心 读取Properties配置信息
- Universal Radio Hacker(URH):一个用于逆向解析和攻击无线通信协议的开源工具
- 什么工具可以分析php源代码,[精选]PHP性能分析工具,你在用哪一个?
- 访问samba服务器提示无权限使用网络资源
- 用css hack解决IE5 IE5.5 IE6 Firefox浏览器兼容性
- 【大数据技术干货】(还不懂数仓,数据中心?看这一篇就够了!)在实际的开发生产中,让你了解企业级数据中心整体架构(DB+ETL+ODS+DW+DM)的各个层次的过程详解,数据联系及功能区分
- 说话干嘛要“之道”啦?(持续更新中)
- Python学习-小黑屋游戏
- 祝爸爸妈妈中秋节快乐
- 2010年中国十大虚拟主机服务商排行榜(转)
- 专题:固体力学中应力与应变分析详解(7.应变分析 7.5应变张量 7.6主应变与主方向 7.7应变莫尔圆)...