用C语言实现FlappyBird
在《FlappyBird》这款游戏中,玩家需要用一根手指来操控小鸟往上飞,不断的点击屏幕就会不断的往高处飞。放松手指,则会快速下降。所以玩家要控制小鸟一直向前飞行,然后注意躲避途中高低不平的管子得分。 在这里,我们主要使用C语言中的printf和scanf函数实现一个简单的FlappyBird游戏 整体思路在开始游戏之前,我们先了解一些辅助函数 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 HideCursor() //隐藏光标 { CONSOLE_CURSOR_INFO cursor_info = { 1,0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } 主函数我们使用一个简单的游戏框架,来减小游戏实现的难度 int main() { startup(); //初始化变量 while (1) { show(); //显示画面 updateWithoutInput();//与用户无关的更新 updateWithInput();//与用户输入有关的更新 } return 0; } 全局变量的定义//游戏画面大小 int high; //行 int width; //列 //小鸟的坐标 int bird_x; //行 int bird_y; //列 //障碍物的相关坐标 int bar1_y; //障碍物与左边界的距离 int bar1_xTop; //上边障碍物底部与上边界的距离 int bar1_xDown; //下边障碍物顶部与上边界的距离 int score; //得分 数据的初始化//游戏界面大小 high = 15; width = 25; //小鸟的初始位置 bird_x = high / 2; bird_y = width / 4; //障碍物的初始位置 bar1_y = width - 1; bar1_xTop = high / 4; bar1_xDown = high / 2; //得分 score = 0; 显示画面每一次循环,都需要重新输出一次画面,在这里,我们使用 @ 表示小鸟, * 表示障碍物 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_xTop) || (i > bar1_xDown))) //输出障碍物 { //只有在合适的列时才需要去判断是否需要输出*,所以需要利用&&的性质,第一个条件成立之后才去判断第二个条件 printf("*"); } else { printf(" "); } } printf("n"); } printf("得分:%dn",score); 与用户无关的更新实现小鸟的下落和障碍物的移动bird_x++; //小鸟向下落 bar1_y--; //小鸟只是在上下移动,障碍物向左移动 判断游戏的得分与失败if (bird_y == bar1_y) //障碍物与小鸟在同一列 { if ((bird_x >= bar1_xTop) && (bird_x <= bar1_xDown)) //得分 { score++; } else //不能撞墙 { printf("游戏失败!!!"); return -1; } } else { if (bird_x > high) //小鸟不能落到high以下 { printf("游戏失败!!!"); return -1; } } 重新生成障碍物if (bar1_y <= 0) //新生成一个障碍物 { bar1_y = width - 1; //随机生成障碍物与开口大小 int upside = rand() % (int)(high * 0.6) + 1; //防止上侧障碍物出现在边界 bar1_xTop = upside; int opening = rand() % (int)(high * 0.2) + 2; //开口大小随机,且开口不能太小 while ((bar1_xDown = bar1_xTop + opening) > high - 2) //防止下侧障碍物过小 { opening = rand() % (int)(high * 0.2) + 2; } } 与用户输入有关的更新游戏在运行的过程中,用户需要输入空格来使小鸟向上跳动 if (_kbhit()) { input = _getch(); if (input == ' ' && bird_x > 0) { bird_x = bird_x - 2; } } 关于_kbhit()和_getch()函数可以在《使用c语言实现飞机游戏》中getch函数部分查看,链接:https://blog.csdn.net/lw13572259173/article/details/81662103 完整代码#include #include #include #include #include //辅助函数 void gotoxy(int x,int y) //将光标调整到(x,&cursor_info); } //全局变量的定义 //游戏画面大小 int high; int width; //小鸟的坐标 int bird_x; int bird_y; //障碍物的相关坐标 int bar1_y; int bar1_xTop; int bar1_xDown; int score; void startup() //数据初始化 { //游戏界面大小 high = 15; width = 25; //小鸟的初始位置 bird_x = high / 2; bird_y = width / 4; //障碍物的初始位置 bar1_y = width - 1; bar1_xTop = high / 4; bar1_xDown = high / 2; //得分 score = 0; } void show() //显示画面 { gotoxy(0,0); //将光标调整到(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_xTop) || (i > bar1_xDown))) //输出障碍物 { printf("*"); } else { printf(" "); } } printf("n"); } printf("得分:%dn",score); } int updateWithoutInput()//与用户无关的更新 { bird_x++; bar1_y--; if (bird_y == bar1_y) { if ((bird_x >= bar1_xTop) && (bird_x <= bar1_xDown)) { score++; } else { printf("游戏失败!!!"); return -1; } } else { if (bird_x > high) { printf("游戏失败!!!"); return -1; } } if (bar1_y <= 0) { bar1_y = width - 1; int upside = rand() % (int)(high * 0.6) + 1; bar1_xTop = upside; int opening = rand() % (int)(high * 0.2) + 2; while ((bar1_xDown = bar1_xTop + opening) > high - 2) { opening = rand() % (int)(high * 0.2) + 2; } } Sleep(150); return 0; } void updateWithInput()//与用户输入有关的更新 { char input; if (_kbhit()) { input = _getch(); if (input == ' ' && bird_x > 0) { bird_x = bird_x - 2; } } } int main() { srand((unsigned)time(NULL)); HideCursor(); again: startup(); //初始化变量 while (1) { show(); //显示画面 int ret = updateWithoutInput();//与用户无关的更新 if (ret == -1) { system("CLS"); printf("1.重新开始n0.退出n请选择:"); int input = 0; scanf("%d",&input); if (input) { goto again; } else return 0; } updateWithInput();//与用户输入有关的更新 } return 0; } 效果演示在这里,我们从游戏失败之后重新开始演示 总结到这里,我们的FlappyBird游戏已经实现完了,多有不足之处,任需要继续改进。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |