利用C语言实现一个最简单的飞机游戏
作者:畅游星辰大海 时间:2022-12-11 15:17:22
前言
在前面弹跳小球的基础上实现一个简单的飞机游戏,主要包括飞机的显示、控制移动、显示复杂图案、发射激光、打靶练习等功能。
目前的飞机还很简单,大家不要着急,一步一步来,在后面会实现更复杂的飞机游戏效果。比如
如何让靶子移动起来?
如何统计和显示击中得分?
如何实现 * * 效果?
一、利用scanf控制飞机移动
第一步利用scanf输入不同的字符,按a、s、d、w键后改变坐标2、y的值,从而控制飞机*字符上下左右移动,如图
最基础的代码如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
int x=5;
int y=10;
char input;
while(1)
{
system("cls");
//输出飞机上面的空行
for(i=0;i<x;i++)
printf("\n");
//输出飞机左边的空格
for(j=0;j<y;j++)
printf(" ");
printf("*");//输出飞机
printf("\n");
scanf("%c",&input);
if(input=='a');
y--;
if(input=='d');
y++;
if(input=='w');
x--;
if(input=='s');
x++;
}
return 0;
}
二、getch控制飞机移动
scanf()函数要求每输入一个字符按回车键后才能执行,交互效果不好,因此第二步使用一个新的输入函数getch()(#include<conio.h>),不需要回车就可以得到输入的控制字符。另外,kbhit()函数在用户有键盘输入时返回1,否则返回 0;在没有键盘输入时 if(kbhit())下面的语句不会运行,从而避免出现用户不输入,游戏就暂停的情况。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int i,j;
int x=5;
int y=10;
char input;
while(1)
{
system("cls");
for(i=0;i<x;i++)
printf("\n");//输出飞机上面的空行
for(j=0;j<y;j++)
printf(" ");//输出飞机左边的空格
printf("*");//输出飞机
printf("\n");
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int i,j;
int x=5;
int y=10;
char input;
while(1)
{
system("cls");
for(i=0;i<x;i++)
printf("\n");//输出飞机上面的空行
for(j=0;j<y;j++)
printf(" ");//输出飞机左边的空格
printf("*");//输出飞机
printf("\n");
if(kbhit()) // 判断是否有输入
{
input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == 'a')
y--; // 位置左移
if (input == 'd')
y++; // 位置右移
if (input == 'w')
x--; // 位置上移
if (input == 's')
x++; // 位置下移
}
}
return 0;
}
}
return 0;
}
三、显示复杂的飞机图案
四、发射激光
按空格键后让飞机发射激光 * ,即在飞机上方显示一列竖线'|'。第四步定义变量isFire,用来记录飞机是否处于发射 * 的状态。
当isFire等于1时,将在飞机的正上方输出激光竖线。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int i,j;
int x=5;
int y=10;
char input;
int isFire;
while(1)
{
system("cls");
if(isFire==0)
{
for(i=0;i<x;i++)
printf("\n");
}
else
{
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
printf(" ");
printf(" |\n");
}
isFire=0;
}
//下面输出一个复杂的飞机图案
for(j=0;j<y;j++)
printf(" ");// 输出飞机上面的空行
printf(" *\n");//头
for(j=0;j<y;j++)
printf(" ");//头下一行左边的空格
printf("*****\n");//身子
for(j=0;j<y;j++)
printf(" ");
printf(" * * \n");
if(kbhit()) // 判断是否有输入
{
input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == 'a')
y--; // 位置左移
if (input == 'd')
y++; // 位置右移
if (input == 'w')
x--; // 位置上移
if (input == 's')
x++; // 位置下移
if (input == ' ')
isFire = 1;
}
}
return 0;
}
五、打靶练习
第五步在第一行通过定义一个变量ny,增加一个靶子‘十‘,控制飞机发射激光击中它,变量isKilled 用来存储是否被击。
isKilled 等于0显示靶子;
isKilled 等于1时不再显示靶子
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int i,j;
int x = 5;
int y = 10;
char input;
int isFire = 0;
int ny = 5; // 一个靶子,放在第一行,ny列上
int isKilled = 0;
while (1)
{
system("cls"); // 清屏函数
if (!isKilled) // 输出靶子
{
for (j=0;j<ny;j++)
printf(" ");
printf("+\n");
}
if (isFire==0) // 输出飞机上面的空行
{
for(i=0;i<x;i++)
printf("\n");
}
else // 输出飞机上面的激光竖线
{
for(i=0;i<x;i++)
{
for (j=0;j<y;j++)
printf(" ");
printf(" |\n");
}
if (y+2==ny) // +2是因为激光在飞机的正中间,距最左边2个坐标
isKilled = 1; // 击中靶子
isFire = 0;
}
// 下面输出一个复杂的飞机图案
for (j=0;j<y;j++)
printf(" ");
printf(" *\n");
for (j=0;j<y;j++)
printf(" ");
printf("*****\n");
for (j=0;j<y;j++)
printf(" ");
printf(" * * \n");
if(kbhit()) // 判断是否有输入
{
input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == 'a')
y--; // 位置左移
if (input == 'd')
y++; // 位置右移
if (input == 'w')
x--; // 位置上移
if (input == 's')
x++; // 位置下移
if (input == ' ')
isFire = 1;
}
}
return 0;
}
来源:https://blog.csdn.net/m0_73222051/article/details/127212717
标签:C语言,飞机游戏
0
投稿
猜你喜欢
C# memcached缓存使用实例代码
2022-01-15 02:17:11
SpringBoot向容器注册bean的方法详解
2023-09-02 10:58:22
Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)
2021-10-05 14:46:23
代码分析c++中string类
2023-04-24 17:15:29
Java父线程(或是主线程)等待所有子线程退出的实例
2022-10-23 16:25:50
Android编程中的5种数据存储方式
2022-04-22 07:05:09
C# 基于udp广播收集局域网类所有设备信息
2022-04-28 00:17:23
深入解析JVM对dll文件和对类的装载过程
2023-06-14 23:23:33
Springboot打包为Docker镜像并部署的实现
2023-06-05 23:11:52
C# Assembly.Load案例详解
2021-11-06 03:20:33
C#编程自学之数据类型和变量一
2023-07-30 02:45:49
SWT(JFace)体验之打开多个Form
2021-11-29 03:19:15
mybatis QueryWrapper的条件构造之apply、last、select解析
2022-02-12 17:32:51
java打印指定年月的日历
2023-11-11 19:21:19
Android进阶从字节码插桩技术了解美团热修复实例详解
2022-05-27 18:06:07
springboot 集成redission 以及分布式锁的使用详解
2023-06-20 06:48:43
java中的SpringBoot框架
2022-02-10 16:50:05
C#中感叹号(!) 的作用总结
2021-10-14 15:08:12
Android自定义view实现仿抖音点赞效果
2021-11-04 11:58:19
java的多线程高并发详解
2022-06-28 10:12:06