纯C语言编程-游戏之Fly Bird

article/2025/9/29 17:36:42

基于纯C的小游戏,基本思想就是使用system("cls")和printf()函数不断刷新界面,捕获键盘事件,然后修改显示数组,并刷新界面。

之前有一款特别火爆的小游戏FlyBird,我们可以使用纯C语言实现,希望对大家学习C语言有所帮助。游戏界面如下:

源码可以从我的博客主页下载:

FlyBird游戏点击下载

使用“#define”定义界面的宽和高:

#define HEIGHT 20
#define WIDTH 36

定义界面的存储数组,ASCII码中“ ”是32,“&”是38表示小鸟,“#”是35用来画柱子,并初始化数组:

char bird_desk[HEIGHT][WIDTH] = {{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32 },{ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32 },{ 38,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 },{ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 }, };

更新界面中的柱子,使用rand随机生成柱子位置,并更新数组中的35(#)

void newinterface(void)
{if (bird_desk[0][1] == 35 && num==0)//当矩阵第二列为黑色方块时,计算出下一次黑柱子上半部分的位置{black = 5 + rand() % 5;num = 2;//黑柱子是两列#组成,第二列与第一列位置一样,用num保证两列位置一致}for (int i = 0; i < HEIGHT; i++){for (int j = 0; j < WIDTH - 1; j++){bird_desk[i][j] = bird_desk[i][j + 1];}if (bird_desk[0][0] == 35 && (i < black || i>(black + 5)))//此时上面的第二列变成了第一列,更新下一个黑柱子,有了黑柱子上半部分位置+5即是下半部分的起始位置{bird_desk[i][WIDTH-1] = 35;}else{bird_desk[i][WIDTH-1] = 32;}}if (num > 0)num--;
}

响应键盘事件,并更新小鸟的位置,按一次空格或w健,小鸟位置上移3格,由于上端为数组的小数端,因此对小鸟位置参数减3。不按小鸟位置降落1格,对小鸟参数加1。

/*更新小鸟位置*/
void birdmove(void)
{for (int a = 0; a < 3; a++){if (a  == 2 && p > 0)//减缓鸟的速度,使按键上跳速度是下落的4倍{p = p + 1;}if (_kbhit()){if (_getch() == ' ' ||  _getch() == 'w' ||  _getch() == 'W'){p = p - 3;}}}
}

当小鸟穿越柱子后进行积分,当小鸟撞到柱子或者跌到地面,小鸟死亡显示Game Over:

/*计分*/
void scoring(void)
{if (p > 20 || bird_desk[p][0] == 35){system("cls");printf("\n\n");printf("              Game Over!\n\n");printf("              Thank you!\n\n");printf("            Your score is:%d\n\n\n", score);p= HEIGHT/2 ;score=0;system("pause");}if (bird_desk[0][0] == 35 && bird_desk[0][1] == 32 )score++;
}

重构界面,将生成的桌面数组显示在界面上

/*重画界面*/
void show_desk(void)
{system("cls");printf("                     FlyBird Game        Author:Dog语言\n");printf("               按\"w\"或\"空格键\"使小鸟飞起来,顺利穿越更多柱子\n");for (int i = 0; i < HEIGHT; i++){printf("            ");for (int j = 0; j < WIDTH; j++){if (i == p && j == 0 && bird_desk[p][0] != 35)printf("%c", 38);elseprintf("%c", bird_desk[i][j]);}printf("\n");}printf("            Score is:%d \n", score);
}

主循环循环调用上述函数,小鸟移动速度是柱子移动速度的4倍,因此循环一圈中嵌套4次小鸟移动函数。

int main(void)
{for(;;){newinterface();scoring();//过一个柱子计一次分,所以和柱子更新速度一致for (int i = 0; i < 4; i++)//小鸟的速度是柱子的4倍{birdmove();show_desk();Sleep(50);}}return 0;
}

源码如下:

BirdMain.c

/** \FlyBird小游戏** \作者:Dog语言* \文件:BirdMain.c* \日期:2020-8-18* \版本:V1.0.0**/
#include <stdio.h>
#include <windows.h>
#include "Interface.h"int main(void)
{for(;;){newinterface();scoring();//过一个柱子计一次分,所以和柱子更新速度一致for (int i = 0; i < 4; i++)//小鸟的速度是柱子的4倍{birdmove();show_desk();Sleep(50);}}return 0;
}

interface.c

/** \FlyBird小游戏** \作者:Dog语言* \文件:interface.c* \日期:2020-8-18* \版本:V1.0.0**/
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include "interface.h"char bird_desk[HEIGHT][WIDTH] = {{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32 },{ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32 },{ 38,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 },{ 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 }, };
//初始界面矩阵,ASCII码中“ ”是32,“&”是38表示小鸟,“#”是35用来画柱子int num = 0;//用于计数输出并排两列黑柱子同一位置
int black;//黑方块位置
int p= HEIGHT/2 ;//小鸟初始位置
int score = 0;//分数/*更新界面各个柱子*/
void newinterface(void)
{if (bird_desk[0][1] == 35 && num==0)//当矩阵第二列为黑色方块时,计算出下一次黑柱子上半部分的位置{black = 5 + rand() % 5;num = 2;//黑柱子是两列#组成,第二列与第一列位置一样,用num保证两列位置一致}for (int i = 0; i < HEIGHT; i++){for (int j = 0; j < WIDTH - 1; j++){bird_desk[i][j] = bird_desk[i][j + 1];}if (bird_desk[0][0] == 35 && (i < black || i>(black + 5)))//此时上面的第二列变成了第一列,更新下一个黑柱子,有了黑柱子上半部分位置+5即是下半部分的起始位置{bird_desk[i][WIDTH-1] = 35;}else{bird_desk[i][WIDTH-1] = 32;}}if (num > 0)num--;
}/*更新小鸟位置*/
void birdmove(void)
{for (int a = 0; a < 3; a++){if (a  == 2 && p > 0)//减缓鸟的速度,使按键上跳速度是下落的4倍{p = p + 1;}if (_kbhit()){if (_getch() == ' ' ||  _getch() == 'w' ||  _getch() == 'W'){p = p - 3;}}}
}/*计分*/
void scoring(void)
{if (p > 20 || bird_desk[p][0] == 35){system("cls");printf("\n\n");printf("              Game Over!\n\n");printf("              Thank you!\n\n");printf("            Your score is:%d\n\n\n", score);p= HEIGHT/2 ;score=0;system("pause");}if (bird_desk[0][0] == 35 && bird_desk[0][1] == 32 )score++;
}/*重画界面*/
void show_desk(void)
{system("cls");printf("                     FlyBird Game        Author:Dog语言\n");printf("               按\"w\"或\"空格键\"使小鸟飞起来,顺利穿越更多柱子\n");for (int i = 0; i < HEIGHT; i++){printf("            ");for (int j = 0; j < WIDTH; j++){if (i == p && j == 0 && bird_desk[p][0] != 35)printf("%c", 38);elseprintf("%c", bird_desk[i][j]);}printf("\n");}printf("            Score is:%d \n", score);
}

interface.h

/** \FlyBird小游戏** \作者:Dog语言* \文件:interface.h* \日期:2020-8-18* \版本:V1.0.0**/
#ifndef INTERFACE_H
#define INTERFACE_H#define HEIGHT 20
#define WIDTH 36void InitialInterface(void);
void newinterface(void);
void birdmove(void);
void scoring(void);
void show_desk(void);#endif

http://chatgpt.dhexx.cn/article/URjkf4Mo.shtml

相关文章

飞翔的小鸟(FlyBird)游戏C语言编程(含撞柱子)

// 飞翔的小鸟.cpp #include "stdafx.h" #include <graphics.h> //图形库头文件 #include <stdlib.h> //Sleep #include <conio.h> //_getch()按键盘 #include <stdio.h> //C语言头文件 #include <time.h> //随机函数使…

【Unity】Fly Bird(游戏实战)(1)

对于Fly Bird 相信各位肯定不会陌生。&#xff08;在安卓5.0-7.0版本的系统中多次点击Android Version 就会出现这个游戏&#xff0c;快去试试吧~~ 7.0及以后就没有了~~就做不了示范了 ~~ 刚开始Unity&#xff0c;也是写的第一个游戏就是做一个Fly Bird. 先把用到的音频&…

Scratch(三十五):FlyBird

哈喽&#xff0c;大家好&#xff01;今天给大家展示的Scratch是FlyBird。接下来&#xff0c;我们一起看一下效果吧。 1、素材获取 2、bird的设置 当点击完小绿旗之后&#xff0c;bird就会有个上下浮动的控制&#xff0c;也就是变量“重力”的设置&#xff0c;接着就是开始位置…

Html5在线小游戏 在线玩压扁小鸟(flyBird)游戏源码

这个源码无需后台上传服务器&#xff0c;直接在线即可使用。 该游戏源码是基于HTML5和JavaScript开发的&#xff0c;运行在浏览器中&#xff0c;使得用户能够方便地进行游戏&#xff0c;而且不需要进行任何安装和下载操作。想要玩游戏的用户只需要访问指定链接即可开始游戏&am…

cocos游戏FlyBird

cocos creator游戏开发FlyBird 菜单界面Menu 首先建立一个场景&#xff08;scence&#xff09; 将你的背景图片添加入canvas并调整canvas的大小来适应你背景图片的大小&#xff0c;最好不要去图片大小&#xff0c;这样会使你的图片变得很丑 添加一个按钮控件 并给这个场景添…

java fly bird小游戏_JavaScript实现Fly Bird小游戏

3.1 小鸟 首先&#xff0c;创建小鸟的对象&#xff0c; bird.js 文件。 div:document.createElement("div"),showBird:function(parentObj) { this.div.style.width "40px"; this.div.style.height "28px"; this.div.style.backgroundImage &…

FLY BIRD

这是作品需要的角色…… 注:水管要多弄几个造型例如: (作者用的背景是blue sky(scratch素材库里面的)) 一下是水管的程序: 小鸟的也很简单:

Java之编写FlyBird小游戏

Java小游戏编写&#xff08;飞翔的小鸟&#x1f426;&#xff09; 概述&#xff1a;主要使用面向对象&#xff0c;线程&#xff0c;继承、ImageIO流等完成的一个小游戏 主要文件&#xff1a; &#x1f405;&#x1f389;&#x1f405;&#x1f389;&#x1f405;&#x1f389;…

介绍一款2023年新出的mysql管理工具: FlyBird Database Manager

FlyBird Database Manager 介绍 FlyBird Database Manager 是一款mysql 界面化管理工具&#xff0c; 使用go语言编写&#xff0c;天然支持Windows, MacOS, Linux等主流平台。 提供无需安装的命令行版本&#xff0c; 命令行中启动服务&#xff0c;以html支持UI界面,在浏览器中…

网络打印机无法连接的解决方法

&#xfeff;&#xfeff; 网络 打印机无法连接的解决方法。 1、首先确定计算机是否可以连接网络打印机&#xff0c;网络打印机都会有一个内网ip地址&#xff0c;可以先ping一下看通不通&#xff0c;如果不通说明计算机与网络打印机之间线路不通&#xff0c;可以用排除法看看是…

win10 系统连接不到网络打印机

查看其它同事的网上邻居里可以看到内容&#xff0c;但 本机空空如也&#xff01; 解决方法&#xff1a;打开控制面板&#xff1a;如下图所示&#xff1a;1&#xff1a;“程序“”->2&#xff1a;“启用或关闭windows功能“->3&#xff1a;勾选"SMB 1.0/CIFS文件共享…

windows10突然连不上打印机问题

问题描述 windows10打印机突然连接不上了&#xff0c;出现了错误&#xff1a; Active Directory 域服务当前不可用。 解决方案 在cmd中输入 services.msc 找到 发现这个服务没有运行&#xff0c;点击运行按钮&#xff0c;出现错误信息&#xff1a; win10错误0x800706b9…

共享网络打印机连接,以及解决无法连接打印机的问题

win10共享网络打印机&#xff0c;及连接打印机 1.共享2.连接补充一点 1.共享 打开WIN的远程连接。&#xff08;一方面是为了能方便使用远程桌面&#xff0c;这个以后会写到&#xff09;——我的电脑—右键—属性—远程设置。把两个都选上。然后搜索栏输入‘打印机’&#xff0…

解决:Win11无法连接网络打印机

&#xff08;一&#xff09;打开本地组策略。 1.1 按winR键盘组合键打开“运行”。在运行框中输入 “gpedit.msc”&#xff0c;回车键。 1.2 “开始”菜单中搜索&#xff1a;组策略&#xff0c;然后出现【编辑组策略】&#xff0c;点击进入。 &#xff08;二&#xff09;管理模…

关于Windows11无法连接打印机

刚买的W11电脑&#xff0c;发现办公室的共享打印机连接不了&#xff0c;显示无法连接。也看了很多解决办法&#xff0c;都没能解决。 然后发现了可能是W11家庭版的问题&#xff0c;微软系统更新后&#xff0c;就是会存在打印机连接不上的问题。这个网址就可以解决以上的问题。…

Win10无法连接打印机怎么办?不能使用打印机的解决方法

在我们平常的办公中&#xff0c;经常会需要使用到打印机打印文件。想要使用打印机是需要先将电脑与打印机连接的&#xff0c;但是有部分Win10用户遇到了无法连接打印机的情况&#xff0c;对于这种情况应该如何解决呢&#xff1f;下面来看看详细的操作方法吧&#xff01; Ghost…

Win11 22H2共享打印机连不上怎么办?

Win11 22H2共享打印机连不上怎么办&#xff1f;有用户使用电脑的时候&#xff0c;需要去进行打印机的连接&#xff0c;但是在连接的过程中&#xff0c;却出现了无法连接的情况。那么遇到这个问题之后怎么去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法&am…

windows无法连接到打印机?三个方法连接打印机(Win10系统)

在日常办公中&#xff0c;我们经常会用到打印机。一般情况下&#xff0c;打印机要与电脑连接才可以使用。有很多用户反馈&#xff0c;windows无法连接到打印机&#xff0c;这是怎么回事呢&#xff1f;请看文章是如何解决打印机无法连接到计算机的问题&#xff01; 操作环境&…

“windows无法连接到打印机”问题的解决

转载请注明出处&#xff1a;http://blog.csdn.net/dongdong9223/article/details/62045759 本文出自【我是干勾鱼的博客】 经常会出现“windows无法连接到打印机”这样的错误&#xff1a; 其实这是因为print spooler 自动关闭导致的&#xff0c;进入&#xff1a; 控制面板 -&…

windows无法连接到打印机

项目场景&#xff1a;windows无法连接到打印机 windows无法连接到打印机。本地打印后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机 问题描述 解决方案&#xff1a; 搜索服务&#xff0c;点击打开 搜索Print Spooler 查看状态是否运行&#xff0c;…