C语言实现简单的打飞机小游戏
编译环境:vs2019
需求:
在同一个平面内,控制大炮发射的三个方向,空格发射炮弹,敌军和友军飞机会一直随机在天上飞过,击中天上飞行的敌军飞机加一分,击中友军飞机减一分
思路:
先初始化程序,再画出说明和地图,接着进入无限循环,循环中分别实现飞机不停地在天上飞、通过awd空格键控制游戏内容、符合游戏条件时加分三个主要步骤。
做法:
首先要实现飞机的动画效果,本质是要在控制台上输出三条x轴上输出一个字符串,并要让这三个字符串看起来在同时移动。这里我借助了写赌马大赛的经验:在第一次无限循环内分别循环输出第1、2、3条的字符串表示走出第一步,然后再自增三个字符串x轴坐标数值,第二次无限循环清除上一次字符串移动痕迹,并再分别输出三条字符串,表示走出第二步。由于内层for循环没有休眠函数,这样看起来就是三个字符串同时移动的效果。这样就可以通过无限循环表示三架飞机不停地移动了。
接下来是通过getch函数改变大炮炮口指向方向(一个字符),在炮口指向切换的同时,炮弹初始化的位置也同样会改变,当按下空格时,炮弹(一个字符)会从他的初始化位置沿设定好的路线不停移动,当横纵轴坐标与飞机坐标相匹配时判断是否为敌军飞机|—0>,是则得分加一,否则得分减一。
此外程序里还有很多细节,这里不一一赘述。
难点:
看起来让三个字符串同时移动。这是一种算法,学会了就应该应该像记住基础知识一样牢牢记住他。明白了原理之后,比较容易掌握。
说明:
这是一个简单的小程序,实现该程序中相同的效果有着很多种方法,而我则大量地使用了数组来存放、统计和使用各种不同的数据,其实类似效果还可以通过单链表来实现。在我目前的认知中使用数组和直接输出字符串的写法有着简洁明了的优点。但同时也导致出一个显示效果上比较致命的缺陷。
注意:
由于编译器原因程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的 “_”。
运行效果:
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string.h>
void HideCursor(); //隐藏光标
void gotoxy(int x, int y); //光标定位
#define R 26 //飞机每次随机尾x坐标最大值
#define N 20 //通关分数
int ax[3] = {
0 }; //三个飞机尾坐标,全局
int y[3] = {
3,7,11 }; //三个y轴,全局,查表法确定飞机的y轴位置
//因为炮弹的飞行距离是一次加两个格子,为了奇偶对应这里的y轴必须都是偶数
int i; //循环用变量
int fd[3]; //控制飞机种类
void cshcxhs() //初始化函数
{
system("title 打飞机小游戏"); //标题
system("mode con cols=100 lines=30"); //宽100,高30
HideCursor(); //光标隐藏
gotoxy(46, 12); //介绍游戏规则
printf("游戏规则:");
gotoxy(36, 14);
printf("w a d键控制方向,空格键发射炮弹");
gotoxy(26, 16);
printf("击中敌军飞机 |---0> 加一分,击中友军飞机 >>>>>> 减一分");
gotoxy(40, 18);
printf("累计得分 %d 结束游戏",N);
Sleep(2800);
system("cls");
int k; //循环用变量
gotoxy(40, R); //初始化炮台
for (k = 0; k < 17; k++)
printf("_");
gotoxy(46,<