【C语言】飞机大战游戏还原,源码在文末,应用“循环”与“数组”实现游戏开发,一起玩一下经典小游戏吧

简介: 众所周知昂,飞机大战,重在大战嘛,你这一颗子弹一架敌机,打的那是一点儿激情也没有。所以我们这章内容,就来对前文做修改,运用上数组手法,给它盘圆咯在二维数组中存储游戏画面数据,元素为0时输出“ (空格)”,元素为1时输出大灰机“ * ”,元素为2输出子弹“¥”元素为3时输出敌机“@”定义二维数组存储游戏画面中元素的数组暂且定为4.基础功能的实现在飞机大战中,用人类语言来描述相关内容,则有以下这些,积分计算(包括击毁敌机,未击毁,飞机升级子弹,多架敌机产生……)这些我们都要一一实现多架敌机产生这块儿,

“前情概要”

首先先补充写游戏时的注意事项,在之前的文章中,复刻了一个飞机大战游戏,于是我心血来潮想给它补一个边界的样式,直观点看出边界的位置

但后面我发现,右边框和下边框始终无法显示

而后寻找“世外高人”指点,真的一语点破昂

image.gif编辑

补充:在进行循环时,先检查循环的范围!如上述代码

for(i=0;i<high;i++)
for(j=0;j<width;j++)

image.gif

这开头两句皆是 “<”,而我定义的high为20,width为30,此时的i和j仅能分别达到19和29,这就导致了程序的无法完整运行正确。

确定问题所在后,把范围稍加修改将"<"改为“<=”,如果不确定自己的长宽数值大小,可以将数值改为对应的变量名,让程序自己判断即可。

这不就好看多了

image.gif编辑

本文章关键内容

飞机大战进阶

众所周知昂,飞机大战,重在大战嘛,你这一颗子弹一架敌机,打的那是一点儿激情也没有。

image.gif编辑

所以我们这章内容,就来对前文做修改,运用上数组手法,给它盘圆咯

在二维数组中存储游戏画面数据,元素为0时输出“  (空格)”,元素为1时输出大灰机“ * ”,元素为2输出子弹“¥”元素为3时输出敌机“@”

1.定义二维数组

存储游戏画面中元素的数组暂且定为:

data[high][width] = {0};    //元素为0时输出“  (空格)”,元素为1时输出大灰机“ * ”

image.gif

飞机位置的数组则为:

play[px][py] =1;

image.gif

2.清屏防闪烁的实现

voidgotoxy(intx,inty)    //将光标移动到(x,y)位置{
HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);    //获取标准输出设备句柄COORDpos={x,y};      //坐标位置SetConsoleCursorPosition(handle,pos);   //设置控制台光标位置}
......
voidshow()
{
gotoxy(0,0);
    ......
}

image.gif

3.实现0,1不同输出

此处与之前直接使用i,j循环判断差不多,只不过是把条件给改了一下,原:

for(i=0;i<=high;i++)
    {
printf("#");
for(j=0;j<=width;j++)
        {
if((i==position_x)&&(j==position_y))
printf("*");    //输出飞机*elseif((i==enemy_x)&&(j==enemy_y))
printf("@");    //输出敌机elseif((i==bullet_x)&&(j==bullet_y))
printf("$");    //输出子弹elseif((i==0)||(i==high))
printf("#");
elseif(j==width)
printf("#");
elseprintf(" ");    //输出空格        }

image.gif

现:

for(i=0;i<high;i++)
{
for(j=0;j<width;j++)
    {
if(data[i][j]==0)
printf(" ");        //0输出空格—elseif(data[i][j]==1)
printf("*");        //1输出飞机*elseif(data[i][j]==2)
printf("¥");       //输出子弹¥elseif(data[i][j]==3) 
printf("@");        //输出敌机@    }
printf("\n");
}
printf("得分:%3d\n",score);
sleep(20)

image.gif

4.基础功能的实现

在飞机大战中,用人类语言来描述相关内容,则有以下这些,积分计算(包括击毁敌机,未击毁,飞机升级子弹,多架敌机产生……)这些我们都要一一实现

多架敌机产生这块儿,我们就需要掏一个新的二维数组出来

并且可以进行宏定义#define enemynum 5;

有关积分:积分达到一定程度时,增加敌机速度;积分增大到一定程度时子弹增多……

可以通过一个循环判断进行实现,运用之前所学到的除法计数,每%5=0或者%10=0,就进行相关数值的自增或自减

失败条件:敌机与我机碰撞

这个可以使用“==”对两者飞机坐标判断,相等即为碰撞

if((px==ex[k])&&(py==ey[k])
{
printf("失败!\n");
Sleep(3000);
system("pause");
exit(0);
}

image.gif

5.飞机移动

不同于使用循环判断,数组的飞机移动,代码量更大,得细致的看,一不小心就会有纰漏。

以一个方向位置左移为示例,其他方向类似:

if(input=='a'&&py>0)
{
data[px][py] =0;
py--;                //位置左移data[px][py] =1;
}

image.gif

此处为止,目前的代码也差不多了,在这其中,我认为还可添加生命值这一特点,举一反三的代码,实现这一功能或许不难,后续尝试修改,如果我这只小白摸索出来了,那再进行本文的内容补充修改,各位博主,就来欣赏代码的全貌吧⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<windows.h>#define high 25     //游戏画面尺寸#define width 45#define enemynum 5  //敌机个数//全局变量intpx,py;      //飞机位置intex[enemynum],ey[enemynum];      //敌机位置intdata[high][width] = {0};        /*二维数组存储游戏画布中的元素0为空格,1为飞机,2为子弹,3为敌机*/intscore;      //得分intBW;         //子弹宽度intemsd;       //敌机移动速度voidgotoxy(intx,inty)
{
HANDLEhandle=GetStdHandle(STD_OUTPUT_HANDLE);
COORDpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
voidHideCursor()
{
CONSOLE_CURSOR_INFOcursor_info={1,0};  //0表示隐藏光标SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
voidstart()        //数据初始化{
px=high-1;
py=width/2;
data[px][py] =1;
intk;
for(k=0;k<enemynum;k++)
    {
ex[k] =rand()%2;
ey[k] =rand()%width;
data[ex[k]][ey[k]] =3;
    }
score=0;
BW=0;
emsd=20;
}
voidshow()         //显示画面{
gotoxy(0,0);    //光标移动到原点位置,以下重画清屏inta,b;
for(a=0;a<high;a++)
    {
for(b=0;b<width;b++)
        {
if(data[a][b]==0)
printf(" ");        //输出空格elseif(data[a][b]==1)
printf("*");        //输出飞机elseif(data[a][b]==2)
printf("¥");        //输出子弹elseif(data[a][b]==3)
printf("@");        //输出敌机        }
printf("\n");
    }
printf("得分:%d\n",score);
Sleep(20);
}
voidwithout()
{
inta,b,k;
for(a=0;a<high;a++)
    {
for(b=0;b<width;b++)
        {
if(data[a][b]==2)
            {
for(k=0;k<ex[k];k++)
                {
if((a==ex[k])&&(b==ey[k]))
                    {
score++;
if(score%5==0&&emsd>3)
emsd--;
if(score%5==0)
BW++;
data[ex[k]][ey[k]] =0;
ex[k] =rand()%2;
ey[k] =rand()%width;
data[ex[k]][ey[k]] =3;
data[a][b] =0;
                    }
                }
//子弹向上移动data[a][b] =0;
if(a>0)
data[a-1][b] =2;
            }
        }
    }
staticintspeed=0;
if(speed<emsd)
speed++;
for(k=0;k<enemynum;k++)
    {
if((px==ex[k])&&(py==ey[k]))
        {
printf("失败!\n");
Sleep(3000);
system("pause");
exit(0);
        }
if(ex[k]>high)
        {
data[ex[k]][ey[k]] =0;
ex[k] =rand()%2;
ey[k] =rand()%width;
data[ex[k]][ey[k]] =3;
score--;
        }
if(speed==emsd)
        {
for(k=0;k<enemynum;k++)
            {
data[ex[k]][ey[k]] =0;
ex[k]++;
speed=0;
data[ex[k]][ey[k]] =3;
            }
        }
    }
}
voidwith()
{
charinput;
if(kbhit())
    {
input=getch();
if(input=='a'&&py>0)
        {
data[px][py] =0;
py--;                //位置左移data[px][py] =1;
        }
elseif(input=='d'&&py>0)
        {
data[px][py] =0;
py++;                //位置左移data[px][py] =1;
        }
elseif(input=='w'&&py>0)
        {
data[px][py] =0;
px--;                //位置左移data[px][py] =1;
        }
elseif(input=='s'&&py>0)
        {
data[px][py] =0;
px++;                //位置左移data[px][py] =1;
        }
elseif(input==' ')
        {
intleft=py-BW;
intright=py+BW;
if(left<0)
left=0;
if(right>width-1)
right=width-1;
intk;
for(k=left;k<=right;k++)
data[px-1][k] =2;
        }
    }
}
intmain()
{
start();
while(1)
    {
show();
without();
with();
HideCursor()
    }
return0;
}

image.gif

目测就是这样了,在末尾再补充一点,测试时我发现有光标闪烁,所以还是加上了HideCursor(),这样子看着舒服多了,不过缺点还是有的,就是这个子弹的碰撞体有点无语,当子弹升级为多个时,旁边边缘的子弹可能无法消灭敌机。嗯。。。

相关文章
|
1月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
77 18
|
1月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
52 13
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
57 18
|
1月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
51 6
|
1月前
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
57 5
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
51 19
|
2月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
187 6
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
78 1
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。

热门文章

最新文章