C语言——飞机游戏

目录

前言

一、飞机游戏的代码

二、代码解析

1、代码重构

1)主函数

2)其它函数

2、新的子弹

3、敌机

1)静止的敌机

2)敌机的移动

3)击中敌机

4、清屏功能

总结


前言

代码参考了《C语言课程设计与游戏开发实践教程》

游戏介绍:

        对我之前的博客 C语言——简单的飞机小游戏 升级,玩法和之前的没有区别,只是代码的实现不同,依旧是玩家通过输入 "W S A D" 控制飞机 " * " 的上下左右移动,同时可以通过空格键来让飞机发射激光击中敌机 " @ "。

一、飞机游戏的代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>//定义边界,游戏边界
#define HIGH 20
#define WIDTH 30// 全局变量
int position_x, position_y; // 飞机位置
int bullet_x, bullet_y;     // 子弹位置
int enemy_x, enemy_y;       // 敌机位置
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 HideCursor() // 用于隐藏光标
{CONSOLE_CURSOR_INFO cursor_info = {1, 0}; // 第二个值为0表示隐藏光标SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}void startup() // 数据初始化
{position_x = HIGH / 2;position_y = WIDTH / 2;bullet_x = -2;bullet_y = position_y;enemy_x = 0;enemy_y = position_y;score = 0;HideCursor(); // 隐藏光标
}void show() // 显示画面
{gotoxy(0, 0); // 光标移动到原点位置,以下重画清屏int i, j;for (i = 0; i < HIGH; i++){for (j = 0; j < WIDTH; j++){if ((i == position_x) && (j == position_y))printf("*"); //   输出飞机*else if ((i == enemy_x) && (j == enemy_y))printf("@"); //   输出敌机@else if ((i == bullet_x) && (j == bullet_y))printf("|"); //   输出子弹|else if (i == HIGH - 1)printf("-");else if (j == WIDTH - 1)printf("|"); // 输出边界elseprintf(" "); //   输出空格}printf("\n");}printf("得分:%d\n", score);
}void updateWithoutInput() // 与用户输入无关的更新
{if (bullet_x > -1)bullet_x--;if ((bullet_x == enemy_x) && (bullet_y == enemy_y)) // 子弹击中敌机{score++;      // 分数加1enemy_x = -1; // 产生新的飞机enemy_y = rand() % WIDTH;bullet_x = -2; // 子弹无效}if (enemy_x > HIGH) // 敌机跑出显示屏幕{enemy_x = -1; // 产生新的飞机enemy_y = rand() % WIDTH;}// 用来控制敌机向下移动的速度。每隔几次循环,才移动一次敌机// 这样修改的话,用户按键交互速度还是保持很快,但我们NPC的移动显示可以降速static int speed = 0;if (speed < 20)speed++;if (speed == 20){enemy_x++;speed = 0;}
}void updateWithInput() // 与用户输入有关的更新
{char input;if (kbhit()) // 判断是否有输入{input = getch(); // 根据用户的不同输入来移动,不必输入回车if (input == 'a')position_y--; // 位置左移if (input == 'd')position_y++; // 位置右移if (input == 'w')position_x--; // 位置上移if (input == 's')position_x++; // 位置下移if (input == ' ') // 发射子弹{bullet_x = position_x - 1; // 发射子弹的初始位置在飞机的正上方bullet_y = position_y;}}
}int main()
{startup(); // 数据初始化while (1)  //  游戏循环执行{show();               // 显示画面updateWithoutInput(); // 与用户输入无关的更新updateWithInput();    // 与用户输入有关的更新}return 0;
}

二、代码解析

1、代码重构

1)主函数

        对之前只是在主函数中实现的功能,我们首先来将需要实现的功能进行拆分,让它通过一个个函数来实现,最后通过主函数来实现功能的统一(实现预期效果)。

int main()
{startup(); // 数据初始化while (1)  //  游戏循环执行{show();               // 显示画面updateWithoutInput(); // 与用户输入无关的更新updateWithInput();    // 与用户输入有关的更新}return 0;
}

        将我们需要达到的预期效果分成若干个函数,让需要重复实现的放在循环中。

2)其它函数

        对主函数进行重构后,对之前小游戏进行功能的模块化(通过相应的函数来实现)。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>// 定义边界,游戏边界
#define HIGH 20
#define WIDTH 30// 全局变量
int position_x, position_y; // 飞机位置void startup() // 数据初始化
{position_x = HIGH / 2;position_y = WIDTH / 2;
}void show() // 显示画面
{system("cls");int i, j;for (i = 0; i < HIGH; i++){for (j = 0; j < WIDTH; j++){if ((i == position_x) && (j == position_y))printf("*"); //   输出飞机 *else if (i == HIGH - 1)printf("-");else if (j == WIDTH - 1)printf("|"); // 输出边界elseprintf(" "); //   输出空格}printf("\n");}
}void updateWithoutInput() // 与用户输入无关的更新
{}void updateWithInput() // 与用户输入有关的更新
{char input;if (kbhit()) // 判断是否有输入{input = getch(); // 根据用户的不同输入来移动,不必输入回车if (input == 'a')position_y--; // 位置左移if (input == 'd')position_y++; // 位置右移if (input == 'w')position_x--; // 位置上移if (input == 's')position_x++; // 位置下移}
}int main()
{startup(); // 数据初始化while (1)  //  游戏循环执行{show();               // 显示画面updateWithoutInput(); // 与用户输入无关的更新updateWithInput();    // 与用户输入有关的更新}return 0;
}

        到此我们就完成了对之前代码的重构,这里我没有使用之前的飞机模型,使用的是 " * " 来代替飞机。

2、新的子弹

        实现之前的功能之后我们来实现新的功能和对旧功能的优化。这一次我们让子弹发射后自动向前飞行。通过在打印飞机和边界的函数中添加新的分支来实现子弹的打印。

void show() // 显示画面
{system("cls");  //清屏函数int i, j;for (i = 0; i < HIGH; i++){for (j = 0; j < WIDTH; j++){if ((i == position_x) && (j == position_y))printf("*"); //   输出飞机 *else if ((i == bullet_x) && (j == bullet_y))printf("|"); //   输出子弹|else if (i == HIGH - 1)printf("-");else if (j == WIDTH - 1)printf("|"); // 输出边界elseprintf(" "); //   输出空格}printf("\n");}
}

3、敌机

        接下来就是敌机的实现了

1)静止的敌机

        首先我们来实现敌机的出现。

        依旧是在打印飞机的函数中增加新的分支来实现敌机 " @ " 的出现。(记得定义敌机相应的变量)

void show() // 显示画面
{system("cls");  //清屏函数int i, j;for (i = 0; i < HIGH; i++){for (j = 0; j < WIDTH; j++){if ((i == position_x) && (j == position_y))printf("*"); //   输出飞机*else if ((i == enemy_x) && (j == enemy_y))printf("@"); //   输出敌机@else if ((i == bullet_x) && (j == bullet_y))printf("|"); //   输出子弹|else if (i == HIGH - 1)printf("-");else if (j == WIDTH - 1)printf("|"); // 输出边界elseprintf(" "); //   输出空格}printf("\n");}
}

2)敌机的移动

        实现敌机的出现后我们来移动敌机,为了降低敌机的移动速度而不影响玩家输入相应的频率。这里通过定义静态变量speed来让每实现20次 updateWithoutInput() 函数,敌机飞行一次。

    // 用来控制敌机向下移动的速度。每隔几次循环,才移动一次敌机// 这样修改的话,用户按键交互速度还是保持很快,但我们NPC的移动显示可以降速static int speed = 0;if (speed < 20)speed++;if (speed == 20){enemy_x++;speed = 0;}

3)击中敌机

        通过判断飞机和子弹的位置来判断是否击中敌机,如果击中就通过随机数来实现新敌机的出现。

void updateWithoutInput() // 与用户输入无关的更新
{if (bullet_x > -1)bullet_x--;if ((bullet_x == enemy_x) && (bullet_y == enemy_y)) // 子弹击中敌机{score++;      // 分数加1enemy_x = -1; // 产生新的飞机enemy_y = rand() % WIDTH;bullet_x = -2; // 子弹无效}if (enemy_x > HIGH) // 敌机跑出显示屏幕{enemy_x = -1; // 产生新的飞机enemy_y = rand() % WIDTH;}// 用来控制敌机向下移动的速度。每隔几次循环,才移动一次敌机// 这样修改的话,用户按键交互速度还是保持很快,但我们NPC的移动显示可以降速static int speed = 0;if (speed < 20)speed++;if (speed == 20){enemy_x++;speed = 0;}
}

4、清屏功能

        到这里基本已经实现了我们预期的效果,但会发现闪烁非常严重,这个时候我们只需要将通过移动光标来让画面重新画过就可以了,同时实现光标的隐藏。

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}; // 第二个值为0表示隐藏光标SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

总结

我没有对这里使用到的知识点做出解释,相应的知识点请看这里

        清屏函数:C语言——函数的综合运用。自定义函数,gotoxy清屏函数与HideCursor隐藏光标,防闪屏,共同制作打飞机游戏。_void hidecursor功能_冰小九的博客-CSDN博客https://blog.csdn.net/neadsc/article/details/126722743?ops_request_misc=&request_id=&biz_id=102&utm_term=C%E8%AF%AD%E8%A8%80%E6%B8%85%E5%B1%8F%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-126722743.142%5Ev74%5Einsert_down2,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&spm=1018.2226.3001.4187

        随机数:C语言随机数的生成【详解】_星空之路Star的博客-CSDN博客https://blog.csdn.net/weixin_46022083/article/details/106661495?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167911124816800217231790%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167911124816800217231790&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-106661495-null-null.142%5Ev74%5Einsert_down2,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=%E9%9A%8F%E6%9C%BA%E6%95%B0&spm=1018.2226.3001.4187

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27483.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谈一谈游戏AI - 综述

成功者总是善于发现 “可学之处”&#xff0c;执着精进&#xff1b;失败者总是善于发现 “不可学之处”&#xff0c;怨天尤人。 郑重说明&#xff1a;本文适合对游戏开发感兴趣的小白初学者&#xff0c;本人力图将事物用简单的语言表达清楚&#xff0c;但水平有限&#xff0c;能…

安卓版ChatGPT要上线了!

Datawhale干货 最新&#xff1a;ChatGPT安卓版&#xff0c; 来源&#xff1a;机器之心 自发布以来&#xff0c;ChatGPT 一直受到高度关注&#xff0c;在全球范围内吸引了大量用户。有机构统计认为&#xff0c;早在今年 1 月&#xff0c;ChatGPT 的用户量就已经超过了一亿。彼时…

必看!大语言模型调研汇总!!

作者&#xff1a;guolipa 知乎 自从ChatGPT出现之后&#xff0c;各种大语言模型是彻底被解封了&#xff0c;每天见到的模型都能不重样&#xff0c;几乎分不清这些模型是哪个机构发布的、有什么功能特点、以及这些模型的关系。比如 GPT-3.0 和 GPT 3.5 就有一系列的模型版本…

一网打尽!国内外50多个大模型调研汇总

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

大语言模型调研汇总

自从ChatGPT出现之后,各种大语言模型是彻底被解封了,每天见到的模型都能不重样,几乎分不清这些模型是哪个机构发布的、有什么功能特点、以及这些模型的关系。比如 GPT-3.0 和 GPT 3.5 就有一系列的模型版本和索引,还有羊驼、小羊驼、骆驼 ...... 于是浅浅的调研了一下比较有…

总结从T5、GPT-3、Chinchilla、PaLM、LLaMA、Alpaca等近30个最新模型

自从ChatGPT出现之后&#xff0c;各种大语言模型是彻底被解封了&#xff0c;每天见到的模型都能不重样&#xff0c;几乎分不清这些模型是哪个机构发布的、有什么功能特点、以及这些模型的关系。比如 GPT-3.0 和 GPT 3.5 就有一系列的模型版本和索引&#xff0c;还有羊驼、小羊驼…

一网打尽!国内外大模型调研汇总

作者 | guolipa 整理 | NewBeeNLP https://zhuanlan.zhihu.com/p/614766286 大家好&#xff0c;这里是 NewBeeNLP。 自从ChatGPT出现之后&#xff0c;各种大语言模型是彻底被解封了&#xff0c;每天见到的模型都能不重样&#xff0c;几乎分不清这些模型是哪个机构发布的、有什…

学习笔记借助chatGPT生成excel统计公式

要求&#xff1a;通过Excel公式提取ExcelB列表格中邮箱名称&#xff08;之前的字符&#xff09; 知道老板要求后&#xff0c;我们就需要写出对应的提取公式&#xff0c;可是对于Excel公式使用不熟练的人来说&#xff0c;这个公式如何写呢&#xff1f;这时候我们就需要借助chatG…

《辉煌优配》6G技术推进下,CPO引领光通信发展新方向

3月1日&#xff0c;中国工业和信息化部部长金壮龙在国务院新闻办新闻发布会上表明&#xff0c;工信部将研究制定未来产业开展行动计划&#xff0c;加快布局人形机器人、元宇宙、量子科技等前沿范畴&#xff0c;全面推动6G技能研制。2月27日&#xff0c;2023年世界移动通讯大会&…

动态销售看板图表 | 汇总不同部门数据,一键切换部门

背景&#xff1a;公司有五十多个子部门&#xff0c;每个sheet存储着每个部门的所有数据&#xff08;不sheet表格结构需要保持一致&#xff09;&#xff0c;如果想将每个部门月至今的销售数据做成图表&#xff0c;怎么办&#xff1f;50多个sheet逐一添加图表&#xff1f;当然不&…

12. Excel数据可视化看板--动态销售月报看板

文章目录 1可视化看板作用1.1 形象直观&#xff0c;有利于提高效率1.2 透明度高&#xff0c;便于配合和监督1.3 降低成本&#xff0c;缩短生产周期1.4 传递现场的生产信息&#xff0c;统一思想1.5 杜绝现场管理中的漏洞1.6 绩效考核的公平化、透明化1.7 保证生产现场作业秩序&a…

33、Power Query-统计员工完成业绩的记录

本节通过一个实例来讲解之前的所学的行、列、表的构造。 需求如下图所示&#xff0c;要求&#xff1a;统计实际业绩大于等于计划业绩的数据记录&#xff08;完成业绩&#xff09;。 比如第一个员工“休闲海”&#xff0c;他就是这样的好员工&#xff0c;实际业绩大于等于计划业…

【干货】公司年终业绩分析报告,你的数据统计对么?

每年年终或新年伊始&#xff0c;公司管理层都要从各个角度比如部门、产品线等考察公司过去一年的业绩&#xff0c;作为数据分析团队&#xff0c;你需要向管理层准备这样的数据分析报告&#xff0c;而在此过程中&#xff0c;你可能会面临着这样的问题&#xff1a; * 公司的组织…

销售业绩-各区负责人大盘情况PPT汇报

文中业绩数据和人物-纯属虚构&#xff0c;仅供学习参考&#xff0c;不代表任何实际意义。 ----数据来源网上公开脱敏数据集 文章目录 广州各区负责人-销售业绩BI大盘情况一、PPT汇报1.广州-华南大区整体情况 总结 广州各区负责人-销售业绩BI大盘情况 一、PPT汇报 1.广州-华南…

AIGC浪潮来袭,奇点云“数智科技大会”洞见AI加速的数智未来

“进化&#xff0c;发生在每一个数字化场景。” 5月25日&#xff0c;以“数据进化论”为主题&#xff0c;由StartDT&#xff08;奇点云、GrowingIO&#xff09;主办的2023 StartDT Day数智科技大会在杭召开。企业客户、行业专家、技术专家与数万位参会伙伴相聚云上&#xff0c;…

大模型引爆算力缺口,智算中心是正“途”

中共中央、国务院印发的《数字中国建设整体布局规划》指出&#xff0c;要夯实数字中国建设基础&#xff0c;其中重要的一方面&#xff0c;就是系统优化算力基础设施布局&#xff0c;引导通用数据中心、超算中心、智能计算中心、边缘数据中心等合理梯次布局&#xff0c;加强传统…

关于大模型对未来影响的一点看法

人们总是高估了未来一到两年的变化&#xff0c;低估了未来十年的变革。 ---比尔盖茨 近来OpenAI的GPT技术可以说在全球都带来了巨大的影响&#xff0c;也让大家看到了什么叫大力出奇迹。chatGPT和GPT4的能力给了大家很大的震撼&#xff0c;其流畅自如、逻辑清晰、出众的能力&am…

从函数空间的角度重新理解傅里叶变换

文章目录 函数空间向量空间投影指数形式的傅里叶级数其他形式的投影傅里叶变换短时傅里叶变换(STFT)、Gabor变换与小波变换短时傅里叶变换Gabor变换小波变换不确定性原理 Paley-Wiener理论Paley-Wiener Condition 或者 Paley-Wiener CriterionPaley-Wiener Theorem陶哲轩(Terre…

小雨的三周年创作纪念日 —— # 大型立flag现场

写在最前面 听说写《我的创作纪念日》会有红包掉落&#xff01;让我来试试~ ლ(ڡლ) Tips 您发布的文章将会展示至 里程碑专区 &#xff0c;您也可以在 专区 内查看其他创作者的纪念日文章优质的纪念文章将会获得神秘打赏哦 机缘 最初成为创作者的初心&#xff0c;是大一时…

人工智能前沿——2022年最流行的十大AI技术

深度学习Tricks&#xff0c;第一时间送达 目录 1、语言识别 2、自然语言生成 3、机器学习平台 4、深度学习平台 5、决策管理 6、虚拟代理 7、AI优化硬件 8、机器人处理自动化 9、生物计量学 10、网络防御 >>>一起交流&#xff01;互相学习&#xff01;共同进…