C语言——简单的飞机小游戏

目录

前言

一、先看代码

二、代码解析

1、飞机图案的打印

2、控制飞机移动

getch() 函数

kbhit() 函数

3、发射激光

4、打击靶子

总结


前言

代码参考了《C语言课程设计与游戏开发实践教程》

飞机小游戏介绍:

玩家通过输入"WSAD,空格"来控制飞机的上下左右移动和发射激光,击落随机出现的目标。这里我们先实现简单的飞机移动,发射激光和打击目标后靶子消失。

一、先看代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

int main()
{
	int i, j;
	int X = 5;
	int y = 10;		// 飞机的初始位置
	int speed = 1;	// 飞机的移动速度
	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 -= speed; // 位置左移
			if (input == 'd')
				y += speed; // 位置右移
			if (input == 'w')
				X -= speed; // 位置上移
			if (input == 's')
				X += speed; // 位置下移
			if (input == ' ')
				isFire = 1;
		}
	}

	return 0;
}

可以先将代码运行,然后再看注释来理解这个代码。接下来我会对这段代码进行解释。

二、代码解析

1、飞机图案的打印

        这个就是我们飞机的样子,可以理解为是在 3*5 的空间中用空格和 " * " 来表示。当我们理解这个后,就可以知道怎么来输出这个飞机图案了。

        首先,将光标通过 for 循环来移动到需要打印飞机图案的行和列(这里我让光标移动到第5行,第10列的位置);接下来就是打印第一行的飞机图案( printf("  *\n"); );做完这些后你会发现光标已经到飞机图案第二行所在的行的最前面,这个时候就要用 for 循环来让光标移动到飞机第二行图案的前面,其他的位置用空格来占位,打印飞机的第二行符号( printf("*****\n"); );做完这些后按同样的方法将飞机最后一行的符号打印出来( printf(" * * \n"); )。这样我们的飞机图案就出来了。代码如下:

        // 下面输出一个比较复杂的飞机图案
		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");

2、控制飞机移动

        上面我们实现了飞机的图案打印,接下来我们来实现飞机的移动。这里我们使用 getch() 函数来实现玩家从键盘输入字符 "WSAD" 来控制飞机的移动。

getch() 函数

getch()——从控制台读取一个字符,但不显示在 屏幕 上,想了解更多看这里

这里我们使用 getch() 函数来输入字符是为了不出现所输入的字符。

kbhit() 函数

kbhit() 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。

想了解更多看这里

 代码如下:

		if (kbhit()) // 判断是否有输入
		{
			input = getch(); // 根据用户的不同输入来移动,不必输入回车
			if (input == 'a')
				y -= speed; // 位置左移
			if (input == 'd')
				y += speed; // 位置右移
			if (input == 'w')
				X -= speed; // 位置上移
			if (input == 's')
				X += speed; // 位置下移
		}

3、发射激光

        实现飞机移动后我们来实现飞机的发射激光。这里我们让玩家按下空格键后飞机发射 " | " 表示激光。同上面飞机的移动,只需在原来的 for 循环中再加一个 if() 判断玩家是否按下了空格键。如果按下我们就让之前定义用来表示飞机是否发射激光的变量变为 1 。通过 0(飞机没有发射激光) 和 1(飞机发射激光) 表示飞机是否发射激光。

代码如下:

		if (kbhit()) // 判断是否有输入
		{
			input = getch(); // 根据用户的不同输入来移动,不必输入回车
			if (input == 'a')
				y -= speed; // 位置左移
			if (input == 'd')
				y += speed; // 位置右移
			if (input == 'w')
				X -= speed; // 位置上移
			if (input == 's')
				X += speed; // 位置下移
			if (input == ' ')
				isFire = 1;
		}

4、打击靶子

        实现飞机发射激光后,就要来实现飞机打靶了。先定义一个靶子 ny 表示靶子在第一行, 第  ny 列。同上面打印飞机的图案,我们来打印靶子 " + " 。

代码如下:

		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 循环,if 判断,getch() 函数输入的知识。

这里我只让靶子生成一次,接下来就是对这个小游戏的升级了,下次再见。 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开朗碳基生物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值