利用C语言实现一个最简单的飞机游戏
作者:畅游星辰大海 发布时间:2022-12-11 15:17:22
标签:C语言,飞机游戏
前言
在前面弹跳小球的基础上实现一个简单的飞机游戏,主要包括飞机的显示、控制移动、显示复杂图案、发射激光、打靶练习等功能。
目前的飞机还很简单,大家不要着急,一步一步来,在后面会实现更复杂的飞机游戏效果。比如
如何让靶子移动起来?
如何统计和显示击中得分?
如何实现 * * 效果?
一、利用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


猜你喜欢
- 本文实例为大家分享了Unity使用射线实现贴花系统,供大家参考,具体内容如下老规矩,直接上代码:using System.Collectio
- 一、AQS介绍队列同步器AbstractQueuedSynchronizer(简称AQS),AQS定义了一套多线程访问共享资源的同步器框架,
- 本文实例为大家分享了Java操作qq邮箱发送邮件的具体代码,供大家参考,具体内容如下今天尝试了使用QQ邮箱的POP3/IMAP/SMTP/E
- 关于unicode和utf的关系,可以简单的记忆:Unicode是一个编码组织、一个编码规范、在java中指utf-16;utf是Unico
- ErrorPageFilter的实际应用Spring框架错误页过滤器springboot提供了一个ErrorPageFilter,用来处理当
- Java去掉指定字符串的开头的指定字符/** * 去掉指定字符串的开头的指定字符 *
- 内部类的介绍定义在另外一个类中的类,叫内部类成员内部类1..new 创建成员内部类必须先创建外部类的实例,然后通过.new 创建内部类的对象
- 1)首先启动hadoop2个进程,进入hadoop/sbin目录下,依次启动如下命令[root@node02 sbin]# pwd/usr/
- 一、项目简述功能包括: 登录注册,办理借阅。借阅记录,预约借阅,借出未还, 借阅逾期,学生管理,图书管理,书库分类查询搜索。二、项目运行环境
- ApplicationContext简述ApplicationContext代表IOC容器,在SpringIOC容器中读取Bean配置创建B
- 实现效果:注意:using system.io; 往Form1上添加控件picturebox,再添加imagelist,并设置imageli
- 前言以下内容科班同学学过UML和数据库的应该比较熟悉数据模型:数据模型是对数据库特征的抽象,也就是用户从数据库中看到的模型,例如一张数据表或
- 这篇做了一个简单的时间轴控件。右侧的数据就是一个简单的字符串。问题还是有的,当右侧的文字长度不一样的时候就会有问题了。现在可以修改一下适配右
- 以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求
- 一:@@的意思是以@标注的字符出,其中所有的符号均为字符串符号,没有什么特殊字符,如''什么的,均默认为字符串
- 本文实例讲述了C#使用List类实现动态变长数组的方法。分享给大家供大家参考。具体如下:C#中的list可以当做数组使用,而且无需定义长度,
- 引言Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期
- 今天启动springboot项目时失败了解决检查原因发现是启动类的MapperScan("")的值写到类名了,改成类所在
- 简单介绍equals方法是java.lang.Object类的方法有两种用法说明:一、对于字符串变量来说,使用“==”和“equals()”
- 这个工具比较简单,用于配合另外一个工具进行文件传送,废话少说,上代码import java.net.URL;import java.net.