C语言 打飞机 小游戏

本文介绍了使用C语言在VS2019环境下实现打飞机小游戏的过程。游戏规则包括控制大炮射击,击中敌军飞机加分,击中友军飞机减分。难点在于模拟飞机的移动效果,通过无限循环和数组实现。程序存在一些限制,如不同编译器的兼容问题,以及代码复用性和效率问题。作者期待能从他人那里获取改进的建议。
摘要由CSDN通过智能技术生成
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,<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值