基于C语言的飞机作战游戏系统设计与实现

known 发布于 2025-08-25 阅读(308)

摘 要:C语言是国内高校电子信息类相关专业入门语言,也是相关专业毕业生胜任专业领域岗位的必备技能之一。C语言虽重要但难学,编程应用难是主要原因。游戏开发作为C语言的重要应用领域,具有比其他应用领域更简便、易学的优点。文章介绍了基于C语言的飞机作战游戏,该游戏实现了字母键和键盘方向键控制飞机上下左右移动、空格键发射子弹消灭敌机、实时记录得分、闯关升级等基本功能。文章从创建项目到主要功能实现都做了详细说明,同时也分享了所有关键代码,期望能对相关人员有所帮助。

关键词:编程应用;字母键;飞机作战;关键代码

中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2024)17-0111-05

0 引 言

计算机编程语言是计算机科学和软件工程领域的重要组成部分[1-4]。C语言是面向过程的结构化编程语言[5],它既能胜任系统软件开发,又能进行应用软件开发;既具有高级语言符合人的思维、功能强大且易学易懂的特点,又具有能够控制硬件且程序执行效率高的突出优点。游戏开发是C语言重要应用领域[6]。飞机作战是一款非常经典的飞行射击类游戏,玩家通过操纵战斗机上下左右移动,利用射击按钮发射子弹攻击敌机,敌机不断从屏幕上方出现,玩家需要及时发射子弹将其击落。本文介绍基于C语言的飞机作战游戏系统完整开发流程和关键代码,系统不依赖其他任何图形化编程软件或插件,涵盖了飞机作战游戏的所有重要元素。

1 功能概述

本游戏系统完全采用C语言编写,实现了飞机作战游戏所有主要功能,具体如下:

1)方向键和游戏键同时控制飞机移动。本系统实现了键盘方向键和游戏键(ASDW,不区分大小写)[7]同时控制飞机移动的功能,满足不同习惯用户需求。

2)游戏开始倒计时。进入游戏界面后用户按任意键开始游戏并有开始倒计时,初次体验的用户可以先查看界面中的游戏说明再开始游戏,老用户可以直接开始游戏,节省等待时间。

3)游戏无延时、不屏o0J5ha7a3GX/pVFgzsN6/wcJZM1gGSflM2G0UfR6aPs=闪且有升级功能。本系统采用句柄函数和实时函数解决屏闪、延时等问题,运行相对流畅;本系统设计了升级功能,当用户使用初始子弹消灭一定数量的敌机之后,子弹威力会逐步加强,敌机的下落速度也逐级加快。

4)用户得分实时更新。

5)战机生命次数可调可控。

2 系统流程

本系统基于C语言和Visual Studio平台,系统设计完成并测试通过后会自动生成.exe格式可执行文件,双击.exe可执行文件或单击网页上程序运行链接即可开始游戏。进入游戏主界面后游戏处于暂停状态,单击任意键开始游戏,玩家通过操纵飞机躲闪敌机进攻并通过发射子弹消灭敌机得分。如果战机被敌机碰撞三次则游戏失败,战机在三次生命有效期内每消灭20架敌机则火力升级一档,伴随敌机攻击速度也加快一档,当消灭100架敌机则游戏通关,系统流程如图1所示。

3 系统实现

3.1 创建项目

具体步骤如下:

1)打开Visual Studio平台,单击文件(F)菜单—新建(N)—项目(P)。在弹出的对话框左侧选择“Visual C++”,然后在右侧选择“Win32控制台应用程序”,输入项目名称“plane”,选择项目保存路径并单击“确定”。

2)在弹出的程序向导对话框中单击“下一步”,在设置对话框中勾选“空项目”,并取消勾选“安全开发生命周期检查”,单击“完成”即完成空项目创建。

3)右键单击plane项目下的源文件—添加—新建项,为项目新建名为“aircraft.c”的源文件。

3.2 句柄函数解决屏闪[8]

在基于C语言的飞机作战游戏中,战机和敌机的实时移动依赖于主函数中的无限循环函数。为了消除残影,一般使用system(“cls”)命令函数进行清屏,但是清屏函数会导致游戏画面出现闪烁。本系统定义了gotoxy光标定位函数代替清屏函数,解决了闪屏问题,并定义了hidecursor函数实现光标隐藏。函数的具体代码如下:

void gotoxy(int x,int y){//光标定位函数,代替system("cls")清屏

HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);

COORD cor;

cor.X=x;

cor.Y=y;

SetConsoleCursorPosition(handle,cor);

}

void hidecursor(){//隐藏光标解决屏闪问题,如使用上面的函数会产生屏闪,则再调用这个函数:

CONSOLE_CURSOR_INFO cursor={1,0};

HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorInfo(handle,&cursor);

}

3.3 游戏主界面和倒计时

飞机作战游戏主界面包含游戏区和游戏说明区两部分,开始游戏前,游戏区显示“按任意键开始游戏!”提示字样,按任意键开始游戏时会有3秒倒计时提示;游戏说明区说明游戏操作方法:按空格键射子弹,ASDW或键盘方向键移动战机,运行效果如图2所示。Intruction是游戏主界面功能函数,startTime是实现倒计时功能函数,Show是定义战机、敌机和子弹函数。详细代码如下:

void Intruction(){

gotoxy(WIDTH+2,HEIGHT/2-5); printf("游戏说明:\n");

gotoxy(WIDTH+2,HEIGHT/2-3); printf("ADWS或方向键移动飞机!\n");

gotoxy(WIDTH+2,HEIGHT/2-1); printf("使用空格键发射子弹!\n");

for(i=0;i<=WIDTH;i++){

gotoxy(i,HEIGHT); printf("-");

}

for(i=0;i<=HEIGHT;i++){

gotoxy(WIDTH,i); printf("");

}

}

void startTime(){//游戏倒计时功能

gotoxy(WIDTH/2-10,HEIGHT/2-2); printf("按任意键开始游戏!\n");

system("pause>nul");

gotoxy(WIDTH/2-10,HEIGHT/2); printf("游戏开始倒计时:3\n");

Sleep(1000);

gotoxy(WIDTH/2-10,HEIGHT/2); printf("游戏开始倒计时:2\n");

Sleep(1000);

gotoxy(WIDTH/2-10,HEIGHT/2); printf("游戏开始倒计时:1\n");

Sleep(1000);

}

void Show(){//游戏界面

gotoxy(0,0); hidecursor();

for(i=0;i

for(j=0;j

if(gameMap[i][j]==0) printf(" ");

else if(gameMap[i][j]==1) printf("*");

else if(gameMap[i][j]==2) printf("^");

else if(gameMap[i][j]==3) printf("$");

}

printf("\n");

}

}

3.4 字母键和方向键控制战机移动[9]

本系统设计了planeMove函数实现战机移动功能。函数里面使用kbhit()函数判断玩家是否按下键盘[5],如果键盘有按键按下则使用getch函数实时获取键盘按键,通过条779eb34cf8de53ac2fe92a0ad5bc0ffa件判断语句实现玩家通过键盘方向键或ASDW字母键控制战机上下左右移动。详细代码如下:

void planeMove(){

int left,right;

left=plx-bulletWidth/2;

right=plx+bulletWidth/2;

if(kbhit()){

ch=getch();

if(ch==a ch==A ch==75){

if(left>0){ gameMap[ply][plx]=0; plx--; gameMap[ply][plx]=1; }

}

else if(ch==d ch==D ch==77){

if(right

}

else if(ch==w ch==W ch==72){

if(ply>0){gameMap[ply][plx]=0; ply--; gameMap[ply][plx]=1; }

}

else if(ch==s ch==S ch==80){

if(ply

}

else if(ch== ){

if(left<0) left=0;

if(right>WIDTH-1) right=WIDTH-1;

for(i=left;i<=right;i++)gameMap[ply-1][i]=2;

}

}

}

3.5 敌机的产生和移动等功能实现

本系统定义EplaneMove函数实现敌机移动等功能。首先,函数通过for循环产生EnNums架敌机,在循环函数中先判断敌机与战机坐标是否相同,相同则表示战机被击中,战机生命减少一次;再判断敌机是否降落到游戏区底部,降落至底部则敌机消失,同时调用随机函数生成新的敌机。其次,敌机下落是通过保持敌机横坐标不变、纵坐标+1来实现。最后,通过双重for循环判断战机子弹是否消灭敌机来判断是否得分。函数具体代码如下:

void EplaneMove(){

for(m=0;m

if(EPlane[m].eny==ply && EPlane[m].enx==plx){

DieTime--;

if(DieTime<=0){

printf("Game Over!\n"); system("pause");

Sleep(2000); exit(0);

}else{plx=WIDTH/2; ply=HEIGHT-2; gameMap[ply][plx]=1; }

}

else if(EPlane[m].eny>=HEIGHT-1){

gameMap[EPlane[m].eny][EPlane[m].enx]=0;

EPlane[m].enx=rand()%WIDTH; EPlane[m].eny=rand()%3;

gameMap[EPlane[m].eny][EPlane[m].enx]=3;continue;

}

gameMap[EPlane[m].eny][EPlane[m].enx]=0;

EPlane[m].eny++;

gameMap[EPlane[m].eny][EPlane[m].enx]=3;

for(i=0;i

for(j=0;j

if(gameMap[i][j]==2){

for(k=0;k

if(EPlane[k].eny==i && EPlane[k].enx==j){

score++;

if(score>100){

gotoxy(WIDTH/2-10,HEIGHT/2-2);

printf("恭喜通关!\n"); system("pause");

Sleep(2000); exit(0);

}

if(score%20==0 &&bulletWidth<5){bulletWidth+=2; WTime-=50; }

gameMap[EPlane[k].eny][EPlane[k].enx]=0;

EPlane[k].enx=rand()%WIDTH; EPlane[k].eny=rand()%3;

gameMap[EPlane[k].eny][EPlane[k].enx]=3;

gameMap[i][j]=0;//子弹与敌机相遇子弹也消失

}

}

gameMap[i][j]=0;

if(i>0) gameMap[i-1][j]=2;

}

} } } }

3.6 主函数和实时得分功能实现

玩家控制“*”代表的战机,使用空格键发射子弹消灭“$”代表的敌机即可得分,得分会在游戏说明区域实时更新。得分达到20的整数倍时,子弹威力逐步升级,同时敌机下降速度也逐渐加快。当用户控制的飞机被敌机撞击时便会失去一条命,如果被敌机撞击三次则游戏失败。当用户在战机三次生命有效期内消灭100架敌机,即得到100分时即通关成功!在主函数中调用相关功能函数,完成程序设计。主函数完整代码如下,系统运行效果如图3所示。

void main(){

gameInit();

Intruction();

startTime();

while(1){

Sleep(WTime); Show();

planeMove(); EplaneMove();

gotoxy(WIDTH+2,HEIGHT/2+1);

printf("得分%d:\n",score);

}

}

4 程序说明

具体说明如下:

1)获取键盘按键动作函数kbhit()和实时获取键盘字符函数getch()都调用conio.h头文件[10]。

2)随机数函数srand((int)time(NULL))和rand()都调用time.h头文件。

3)HANDLE、COORD和CONSOLE_CURSOR_INFO等句柄操作要导入windows.h头文件。

4)本系统采用句柄函数HANDLE解决屏闪问题,采用实时函数getch()代替键盘缓存函数getchar()解决延时问题。

5)gameInit是对定义变量进行初始化的函数,由于篇幅限制,本文未给出,读者可自行给对象赋初值。

5 结 论

C语言的应用领域涵盖操作系统开发、应用软件开发、嵌入式开发、网络架构系统开发和游戏开发。掌握编程语言的关键在于学以致用。综合考虑,游戏开发是C语言最容易实现的应用领域。学习者只要掌握C语言中键盘控制对象的基本方法并勤加练习,很容易掌握C语言游戏开发技能。

参考文献:

[1] 周金芝,杨明,仝海燕,等.C语言程序设计智能化教学改革探究 [J].六盘水师范学院学报,2022,34(2):88-96.

[2] 沈旭,孟巍,彭正超.多人在线版贪吃蛇3D游戏App设计与开发 [J].计算技术与自动化,2019,38 (4):126-132.

[3] 佟子豪,乔秀明,马新宇.基于银河编辑器的即时战略游戏设计 [J].智能计算机与应用,2022,12(7):178-180+184.

[4] 车万翔,窦志成,冯岩松,等.大模型时代的自然语言处理:挑战、机遇与发展 [J].中国科学:信息科学,2023,53(9):1645-1687.

[5] 明日科技.C语言从入门到精通:第6版 [M].北京:清华大学出版社,2023.

[6] 徐士雯.VR游戏化教学在中职课堂中的研究与应用——以C语言冒泡排序算法为例 [D].大连:辽宁师范大学,2023.

[7] 赵启升,李存华.C语言程序设计——游戏案例驱动 [M].南京:南京大学出版社,2021.

[8] 李雨哲,孙炼.基于C语言的贪吃蛇游戏设计 [J].河南科技,2020(7):31-33.

[9] 崔旭.面向知识建构的在线协作编程学习过程设计研究 [J].长春:东北师范大学,2022.

[10] 李晓蕾,王守佳,刘钰周,等.基于Funcode平台的《华夏宝藏》游戏设计与开发 [J].现代计算机,2023,29(10):98-103.

作者简介:陈赵云(1982.05—),男,汉族,江西丰城人,讲师,硕士研究生,研究方向:物联网技术应用、Web系统开发。

收稿日期:2024-02-04

DOI:10.19850/j.cnki.2096-4706.2024.17.021

Design and Implementation of Aircraft Combat Game System Based on C Language

CHEN Zhaoyun

(School of Electronics and Information Engineering, Heyuan Polytechnic, Heyuan 517000, China)

Abstract: C language is the introductory language for electronic information related majors in domestic colleges and universities and it is one of the prerequisite skills for graduates of related majors to be competent in professional field positions. C language is important but difficult to learn, and the difficulty of programming application is the main reason. Game development, as an important application field of C language, has the advantage of being more convenient and easy to learn than other application fields. This paper introduces an aircraft combat game based on C language, and the game realizes basic functions such as using letter keys and keyboard direction keys to control the movement of the aircraft to move up and down, left and right, firing bullets with the space key to eliminate enemy aircraft, recording scores in real time, and passing and upgrading the level. This paper makes a detailed description from the creation of project to the realization of the main functions, and it also shares all the key codes, hoping to be helpful to the relevant personnel.

Keywords: programming application; letter key; aircraft combat; key code

标签:  敌机 

免责声明

本文来自网络,不代表本站立场。如有不愿意被转载的情况,请联系我们。

iidomino cuppor