怎么用C语言实现开发飞机游戏
怎么用C语言实现开发飞机游戏
这篇“怎么用C语言实现开发飞机游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用C语言实现开发飞机游戏”文章吧。
一、前言
[设计难度 : ★☆☆☆☆
[参考书籍:《C语言课程设计与游戏开发实践教程》
[主要涉及知识:函数封装 + 循环判断语句
[程序运行效果图:
[主要的游戏功能:
通过按键’w’,‘s’,‘a’,'d’分别实现飞机的上下左右移动
按空格键发射子弹
按ESC实现游戏暂停
按q键返回菜单界面
实现子弹和敌机位置的自动更新
敌机的生成速度和下落速度随分数的增加而变快
实时打印得分和生命值。生命值为0时游戏结束
以下为飞机游戏全部的代码,大家可以直接拷贝运行:
#define_CRT_SECURE_NO_WARNINGS#include
如果觉得还挺有意思的,那就继续保持着轻松的心情看下去吧!
二、从设计初始菜单界面开始
一个基本的游戏初始选择框架:
intmain(){intinput=0;do{menu();printf("[请选择:>");scanf("%d",&input);switch(input){casexxx:casexxx:casexxx:default:}}while(input);return0;}
我们根据游戏所包含的功能设计好相应的menu选项以及其对应的case事件即可。作为我们飞机游戏的第一个简单版本,我们先不考虑其他的模式和功能,仅包含PLAY
(游戏)功能、GUIDE
(操作说明)、EXIT
(退出游戏)三种功能。根据这个思路,我们写下这样的menu函数
voidmenu(){printf("*****************\n");printf("**飞机游戏**\n");printf("**-------------**\n");printf("**1.PLAY**\n");printf("**2.GUIDE**\n");printf("**0.EXIT**\n");printf("*****************\n");}
为了增加代码的可读性
,我们在头文件处创建枚举变量。
enumOption//枚举增加代码可读性{EXIT,//printf("%d",EXIT);的结果为0PLAY,//printf("%d",PLAY);的结果为1GUIDE,//printf("%d",GUIDE);的结果为2};
每个枚举常量都是有值的,第一个枚举成员的值默认为0(不人为修改的话),之后的随前一个递增。这恰好与我们的menu中功能序号相对应,于是我们可以用枚举变量作为case的整形常量表达语句,最终写出的主函数是这样的:
intmain(){intinput=0;srand((unsignedint)time(NULL));//初始化rand函数,只需要初始化一次即可,所以放在主函数内do{menu();printf("[请选择:>");scanf("%d",&input);switch(input){casePLAY:gamebody();break;caseGUIDE:guide();break;caseEXIT:printf("成功退出游戏!\n");break;default:printf("输入错误,请重新选择\n");}}while(input);return0;}
三、游戏操作指南——guide函数
说明按键对应的功能,很简单就不赘述了
voidguide(){printf("******************\n");printf("**游戏操作指南**\n");printf("**--------------**\n");printf("**w->上移**\n");printf("**s->下移**\n");printf("**a->左移**\n");printf("**d->右移**\n");printf("**q->返回**\n");printf("**ESC->暂停**\n");printf("**空格->射击**\n");printf("******************\n\n\n");}
四、游戏的主体gamebody()
①简化通用的游戏框架
voidgamebody(){Initgame();//初始化游戏函数while(1){show();//展示函数updateWithInput();//与用户输入有关的更新,updateWithoutInput();//与用户输入无关的更新,如子弹、敌机的移动}}
以这个游戏框架为基础,我们建立起我们的设计逻辑
②头文件一览
在正式介绍gamebody函数之前,我们先看看定义在头文件的全局变量以及他们的作用
#define_CRT_SECURE_NO_WARNINGS#include
③清屏函数的实现
我们的游戏画面完全是靠printf函数打印出来的,因此清屏函数是必不可少的。
直接使用system("cls")
函数会造成屏幕画面闪烁严重,因此我们可以自行封装一个gotoxy
函数,函数的功能是将光标移到原点,从原点开始重新绘制
,相当于实现清屏的效果。虽然还是会闪烁,但防屏闪效果有了显著提升。
首先给大家介绍几个平时不常用的函数:
①SetConsoleCursorPosition
头文件:#include
参数①:hConssoleOutput → 指向屏幕缓冲区的句柄
参数②:dwCursorPosition → 指定包含新光标位置的COORD结构
函数功能:设置光标在指定的控制台屏幕缓冲区中的位置
COORD结构体:
②GetStdHandle函数
头文件:#include
参数①:nStdHandle 指定返回句柄的标准设备,nStdHandle有以下三种选择
val | Meanig |
---|---|
STD_INPUT_HANDLE | Standard input handle |
STD_OUTPUT_HANDLE | Standard output handle |
STD_ERROR_HANDLE | Standard error handle |
函数功能:获取标准输入、标准输出或标准错误设备的句柄
什么是句柄?
将①②函数组合后就可以构造出我们需要的gotoxy函数了
voidgotoxy(intx,inty){HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);COORDpos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);}
④光标隐藏函数
光标一直闪烁会影响我们的游戏体验,所以我们封装一个HideCursor函数。光标的信息定义在CONSOLE_CURSOR_INFO结构体中,其具体定义如下:
dwSize
结构体成员指定这光标的大小,bVisible
决定光标是否可见,因此我们只需对将它设置为false即可。实际的修改还需要借助SetConsoleCursorInfo
函数
参数①:标准输出设备的句柄,我们可以用上面提到的GetStdHandle函数获取
参数②:CONSOLE CURSOR INFO结构体类型的指针,该结构体包含屏幕缓冲区新规范 有了上面的知识,我们可以写下这样的代码:
voidHideCursor(){CONSOLE_CURSOR_INFOcursor_info={1,0};//将“是否可见”设置为falseSetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}
⑤Initgame函数
因为我们使用了全局变量,并且要求设计出来的游戏能能够重复的play,所以我们在每次游戏开始时都要对全局变量进行必要的 初始化
voidInitgame(){for(inti=0;i 遍历canvas数组,根据canvas数组中的内容决定打印什么: backspace → 空格 enemy → 敌机(@) bullet → 子弹(|) voidshow(){gotoxy(0,0);//在打印之前先清屏for(inti=0;i [设计难点: 当我们键盘没有输入的时候,函数不执行效果·; 当我们按下相应的游戏按键而不需要按下回车时,数据就可以被读取 现在介绍两个大家平时可能不常用到的函数来满足我们上面的设计要求: 即使没有按下回车键, 有了上面的基础知识储备,我们来实现updateWithinput函数 intupdateWithinput(){if(_kbhit()){intinput=_getch();switch(input){case'w':if(y>0)//先要加以判断,防止飞机飞出游戏边界y--;break;case's':if(y 我们将updateWithoutinput函数拆分成对子弹位置更新的函数和对敌机位置更新的函数。子弹的位置是实时更新的: voidbullet_update(){for(inti=0;i 与子弹稍微不同的一点是敌机的位置更新受“标准速度”的限制,我们通过 intenemy_update(){staticintenemy_speed=0;staticintenemy_time=0;intflag=0;if(enemy_speed voidgamebody(){system("cls");Initgame();HideCursor();while(1){show();bullet_update();if(updateWithinput()||enemy_update()){show();printf("[本次游戏结束:>");system("pause");break;}}} 以上就是关于“怎么用C语言实现开发飞机游戏”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注恰卡编程网行业资讯频道。⑥show函数的实现
⑦与用户输入有关的更新- updateWithinput
_kbhit
函数用来监测键盘是否有输入,如果有输入则返回一个非0值。_getch
函数可以从控制台中读取字符⑧与用户输入无关的更新-updateWithoutinput
循环
实现敌机的速度控制,但每次仍需要检测是否和子弹相撞。由于敌机是向y增大的方向上运动的,若for正向循环则,则敌机一直被往前推,视觉上是“瞬移”的效果,所以我们需要反向遍历。⑨组合而成的gamebody函数
推荐阅读
-
windows安装touble c
近期有些网友想要了解windows?安装touble的相关情况,小编通过整理给您分享一下。为什么现在还需要TurboC?在当今V...
-
C/C++如何获取CAN信号
C/C++如何获取CAN信号本篇内容主要讲解“C/C++如何获取C...
-
C语言怎么通过二分查找实现猜数字游戏
C语言怎么通过二分查找实现猜数字游戏本文小编为大家详细介绍“C语言...
-
C语言数据结构中的线性表怎么使用
C语言数据结构中的线性表怎么使用这篇文章主要介绍“C语言数据结构中...
-
C语言的数据结构怎么理解
C语言的数据结构怎么理解这篇文章主要介绍了C语言的数据结构怎么理解...
-
C语言与C++中内存管理的方法
C语言与C++中内存管理的方法这篇文章主要介绍了C语言与C++中内...
-
C语言链式队列与循环队列怎么实现
C语言链式队列与循环队列怎么实现这篇文章主要介绍了C语言链式队列与...
-
C语言冒泡排序怎么实现
C语言冒泡排序怎么实现这篇文章主要介绍了C语言冒泡排序怎么实现的相...
-
C语言如何实现斐波那契数列
C语言如何实现斐波那契数列这篇文章主要介绍了C语言如何实现斐波那契...
-
C语言如何实现无符号数和有符号数间的运算
C语言如何实现无符号数和有符号数间的运算本篇内容主要讲解“C语言如...