C语言——简单版的飞翔小鸟
目录
前言
飞翔小鸟的代码
实现代码
1、下落的小鸟
2、打印障碍物
3、移动障碍物
4、判断是否相撞
5、障碍物的循环出现
总结
前言
代码参考了《C语言课程设计与游戏开发实践教程》
小游戏介绍:
玩家通过空格键来控制正在下落的小鸟 ' @ ' 飞起来,并躲过障碍物 ' * '。
飞翔小鸟的代码
首先我们来看整个的代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.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) // 光标移动到(x,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;}
}int main()
{startup(); // 数据初始化while (1) // 游戏循环执行{show(); // 显示画面updateWithoutInput(); // 与用户输入无关的更新updateWithInput(); // 与用户输入有关的更新}return 0;
}
接下来再来对代码进行一一解析
实现代码
1、下落的小鸟
首先我们来实现一个移动光标到指定位置的函数
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);
}
GetStdHandle函数:具体请看这里
SetConsoleCursorPosition:具体请看这里
接下来我们就开始打印小鸟 ' @ ' ,这里我将打印小鸟放在了显示所有画面的函数中
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);
}
实现小鸟的打印后我们就要开始让小鸟实现下落了,这里只需要让小鸟的横坐标增加就可以了。纵坐标就不要动了,让障碍物的移动来让小鸟看起来是在移动,而障碍物没有移动。
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");}printf("得分:%d\n", score);
}
3、移动障碍物
当我们打印障碍物后就来实现障碍物的移动。和之前我们移动小鸟一样,让障碍物的横坐标减小就可以了。这个时候会发现小鸟和障碍物的移动速度太快了,处理这个问题,我们就要使用一个函数( Sleep() )来实现这个功能。
Sleep() 函数:具体请看这里
4、判断是否相撞
我们已经将小鸟和障碍物都打印出来了,接下来我们就要来实现判断小鸟和障碍物是否相撞(判断小鸟的坐标和障碍物的坐标有没有重合,没有重合就表明两者没有相撞,重合就表明两者想相撞了)。
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);
}
相撞了就结束游戏,没有就继续生成障碍物,同时分数加一(分数可以增加别的分数)。
5、障碍物的循环出现
没有相撞就重新生成障碍物,这里用随机数来生成。
if (bar1_y <= 0) // 再新生成一个障碍物{bar1_y = width;int temp = rand() % (int)(high * 0.8);bar1_xDown = temp - high / 10;bar1_xTop = temp + high / 10;}
写到这里就已经结束了,下次再见。
总结
飞翔的小鸟主要就是通过移动光标来打印符号、符号位置的变化以及判断符号之间的位置是否重合。
C语言——简单版的飞翔小鸟相关推荐
- 杨辉三角(C语言简单版)
杨辉三角形 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. 下面给出了杨辉三角形的前4行: 1 1 1 ...
- C语言实现简单版Linux的cp命令
C语言实现简单版的Linux的cp命令 前言: 这是我的第一篇CSDN文章,写的不够好的地方有请各路大神指正.本人也是接触代码时间很短,在这里希望把自己学习到的知识写成一些有用的代码.后面有空的话 ...
- c语言之简单版的图书检索系统
开发一个简单版的图书检索系统,图书信息包括:编号.作者.书名.出版社.类型.价格.出版日期. 采用简单的c语言语法,结合结构体及自定义函数实现,让大一初学者也能够看懂. 该程序可实现功能(可根据个人需 ...
- c语言编程简单小游戏坦克大战,坦克大战1990(c语言文件版)游戏
坦克大战1990(c语言文件版)是一款很炫的坦克战争类游戏.游戏设计感很强.敌人千变万化,但是你可别被迷惑哦,将他们通通歼灭吧! 作者的话 经过四五天的奋斗,第一次编的游戏终于完成了,好激动. 首先得 ...
- PTA浙大版python程序设计题目集--第1章-3 输出“Python语言简单易学” (10 分)
输入格式: 无 输出格式: 输出一句短语,Python语言简单易学. 如果包含汉字,用"print(s.encode("utf-8"))"输出. 如: s=&q ...
- 狼人杀c语言代码,1089 狼人杀-简单版——C/C++实现
题目 1089 狼人杀-简单版 (20 point(s)) 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀&quo ...
- 铃儿响叮当c语言编程,铃儿响叮当吉他谱C调简单版儿歌
铃儿响叮当 曲目介绍 1857年,美国波士顿假日学校的学生在教堂有一场感恩节演出,学生们请邻居皮尔彭特写了一首新歌,轻快的旋律让孩子们马上就学会了,这首名为"One Horse Open S ...
- 游戏开发的HelloWorld,快速入门,新手上路,使用CocosCreator+JS,flyBird(飞翔小鸟)
游戏开发的HelloWorld,快速入门,新手上路,使用CocosCreator+JS,flyBird(飞翔小鸟) 介绍 开发环境 游戏原理 文件结构 详细操作 全部代码 介绍 拓展什么的都没有,真正 ...
- 主流WEB开发语言简单对比(转)
主流WEB开发语言简单对比 原文链接:http://www.uml.org.cn/site/201401091.asp 随着时间的飞逝,随着岁月的流失.从世界上第一台计算机ENIAC诞生至今,已 ...
最新文章
- 2022-2028年中国顺丁橡胶行业发展模式分析及市场分析预测报告
- GPSInfoProvider定位
- HAProxy实现动静分离
- shell脚本实现无密码交互的SSH自动登陆
- IE的documentMode属性
- 大数据学习笔记38:Hive - 内置函数(1)
- wp实例开发精品文章源码推荐(8.20)
- 滴普科技,全场景数据智能服务商
- 成为JavaGC专家Part II — 如何监控Java垃圾回收机制
- 数据库中的超键 候选键 主键 外键
- vue中的混入mix
- 微博 php7,PHP_迁移PHP版本到PHP7,今天看到微博上说phpng也就是ph - phpStudy
- Python 用10行代码教你画出太阳花
- Office EXCEL 如何保留两位小数,四舍五入
- the specified jre installation does not exist 规定的jre没有安装
- 思维导图 基础篇(06)思维方法-曼陀罗思考法
- Latex排版,表格标题总是出现在下方的解决方案
- 有意思的hand-crafted features based IQA的论文吧2(图像质量评价)
- 贴纸UI效果如何制作,4个做贴纸效果的小技巧
- 百万军师v1.0——直播答题答案快速搜索
热门文章
- excel xml mysql数据库,数据库文本文档excel表格-excel xml格式的文件 导入到 MYSQL 数据库的语句...
- 最全的sublime插件整理
- 【技术分享】思科设备ISIS配置
- vue element-ui实现获取短信验证码 ,60秒倒计时及页面
- CF1491C Pekora and Trampoline
- 韩国的品牌创造之路(上)
- Promise的用法及如何解决回调地狱
- idea编译Java项目的部分java文件并且生成class文件
- 阿里巴巴大神发布的Java零基础笔记,实战教程多到手软,跪了
- 2023.04.16 学习周报