C语言实现飞机游戏(2)

本文实例为大家分享了C语言实现飞机游戏的具体实现代码,供大家参考,具体内容如下

本节我们将在上一节的基础上对飞机游戏进行改造完善。

基本框架

从本节起,为了避免把所有代码都放进main函数而使得代码看起来臃肿,我们将通过以下基本框架来实现游戏内容。

//全局变量定义
int main(){
    startup(); //游戏初始化
    while(1) //游戏循环体
    {
        show(); //显示界面
        updateWithoutInput(); //与输入无关的更新
        updateWithInput(); //与输入有关的更新
    }
    return 0;
}

代码重构

现在我们要对上一节的代码通过基本框架来重构一遍。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//全局变量
int position_x,position_y; //飞机坐标
int high,width; //画面尺寸

void startup() //数据初始化
{
    high = 20;
    width = 30;
    position_x = high/2;
    position_y = width/2;
}

void show() //显示画面
{
    system("cls"); //清屏函数,linux使用clear命令
    int i,j;
    for(i=0; i<high; i++){
        for(j=0; j<width; j++){
            if((i==position_x)&&(j==position_y))
                printf("*"); //输出飞机 * 
            else
                printf(" "); //输出空格
        }
        printf("\n");
    }
}

void updateWithoutInput() //与输入无关的更新
{
}

void updateWithInput() //与输入有关的更新
{
    char input;
    if(kbhit()) //判断是否有输入
    {
        input = getch();
        if(input=='a')
            position_y --;
        if(input=='d')
            position_y ++;
        if(input=='w')
            position_x --;
        if(input=='s')
            position_x ++;        
    }
}

int main(){
    startup();
    while(1){
        show();
        updateWithoutInput();
        updateWithInput();
    }
    return 0;
}

新款子弹

之前我们实现的激光是覆盖整条线的,对于敌人来说比较不友好(反正挨打的是敌人),那么为了保证游戏体验(并没有),我们在此给游戏加一个新款子弹。

可以设置初始化子弹坐标:

// 子弹在飞机上方
bullet_x = position_x - 1;
// 子弹 y 坐标不变
bullet_y = position_y;

// 每次循环子弹往上飞 1
bullet_x --; 

所以我们需要在 show() 函数 与 update 中加入控制子弹的代码:

// 定义子弹坐标变量
int bullet_x,bullet_y;

//初始化子弹
bullet_x = -1;
bullet_y = position_y;

// 写在输出循环中
if ...
else if ((i==bullet_x)&&(j==bullet_y))
    printf("|"); //输出子弹
else ...

// 子弹前进
void updateWithoutInput()
{
    if(bullet_x > -1)
        bullet_x --;
}

// 写在用户输入判断中
if(input == ' ')
{    
    // 子弹在飞机上方
    bullet_x = position_x - 1;
    // 子弹 y 坐标不变
    bullet_y = position_y;
}

敌机【终于来了】

用“@”表示敌机,用 enemy_x 和 enemy_y 表示敌机坐标,使用和加入子弹大致一样的方法加入敌机。

注意:敌机的移动不能和子弹那样,不然每回你只能看到一个大黑耗子跑过去了。

// 敌机位置
int enemy_x,enemy_y;

// 数据初始化
enemy_x = 0;
enemy_y = position_y;

// 加入输出循环
if ...
else if ((i==enemy_x)&&(j==enemy_y))
    printf("@");
else ...

// 控制敌机移动
static int speed = 0;
if(speed<10)
    speed ++;
if(speed == 10){
    enemy_x ++;
    speed = 0;
}

可以看到,在实现敌机移动时,我们为了避免出现大黑耗子嗖一下就过去的问题使用了 static 关键字来定义一个静态变量 speed 从而实现敌机缓慢移动。

由 static 定义的局部变量在每次循环不会重新定义它的值,第一次循环会根据语句把 speed 定义为 0 ,而在之后的循环中不会重新执行该赋值语句。

每次循环判断当其值小于 10 时则加一,并继续以后语句。若其值等于 10 ,则将敌机 x 坐标加一(也就是敌机移动),并重新将 speed 归零。

击杀与得分

没错,在完成以上代码之后你就会发现:

屏幕上出现了两个锁血挂!!
怎么打都打不死,而且一个飞着飞着就没了!

所以我们需要增加击杀功能,当然还有得分(击杀获得)。

而且在每次击杀以后都要生成新的敌机(其实就是敌机坐标重新赋值)。

// 加入updateWithoutInput更新循环
if((bullet_x == enemy_x)&&(bullet_y == enemy_y))
{ //子弹击中敌机
    score ++; //得分加一
    // 敌机刷新
    enemy_x = -1;
    enemy_y = rand() % width;
    bullet_x = -2; //子弹无效,如果你希望子弹能穿透的话可以去掉
}
if(enemy_x > high) // 敌机飞出边界
{
    // 敌机刷新
    enemy_x = -1;
    enemy_y = rand() % width;
    // 可选,敌机出界得分减一
    score --;
}

// 定义得分并显示
int score;
// 显示部分加在 show() 函数尾部
printf("得分: %d\n", score);

清屏升级

在实现以上代码后,我们发现游戏时屏幕闪烁很严重,这里提供优化清屏的方法。

//清屏前移动光标
#include <windows.h>

void gotoxy(int x, int y){
    HANDLE handle = GetStdHandle(STD_UOTPUT_HANDLE);
    CROOD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle, pos);
}
//解决光标闪烁
void HideCursor(){
    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; //第二个值为0表示隐藏光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现打飞机小游戏

    本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下 编译环境:vs2019 需求: 在同一个平面内,控制大炮发射的三个方向,空格发射炮弹,敌军和友军飞机会一直随机在天上飞过,击中天上飞行的敌军飞机加一分,击中友军飞机减一分 思路: 先初始化程序,再画出说明和地图,接着进入无限循环,循环中分别实现飞机不停地在天上飞.通过awd空格键控制游戏内容.符合游戏条件时加分三个主要步骤. 做法: 首先要实现飞机的动画效果,本质是要在控制台上输出三条x轴上输出一个字符串,并要让这三

  • C语言版飞机大战游戏

    C语言版飞机大战,供大家参考,具体内容如下 不多说直接上代码 #include<iostream> #include<windows.h> #include<conio.h> #include<time.h> #include<string> using namespace std; /*=============== all the structures ===============*/ typedef struct Frame { COOR

  • C语言之飞机大战游戏

    本文实例为大家分享了C语言之飞机大战游戏的具体代码,供大家参考,具体内容如下 技术原型 1.void gotoxy(int x, int y) 函数,该函数可以使光标去到(x,y)的位置进行打印: 2.链表,用于存储状态: 3.windows.h中有非阻塞输入,_kbhit(): 4.随机生成数: 5.视觉暂留: 6.碰撞检测: 7.清屏函数: 8.设置边界: 技术路线 1.设置一个边界: 2.维护一个子弹的列表: 3.维护一个敌机的列表: 4.初始化飞机的位置: 5.每隔一秒钟生成一架敌机,生

  • C语言实践设计开发飞机游戏

    目录 一.前言 二.从设计初始菜单界面开始 三.游戏操作指南——guide函数 四.游戏的主体gamebody() ①简化通用的游戏框架 ②头文件一览 ③清屏函数的实现 ④光标隐藏函数 ⑤Initgame函数 ⑥show函数的实现 ⑦与用户输入有关的更新- updateWithinput ⑧与用户输入无关的更新-updateWithoutinput ⑨组合而成的gamebody函数 ⑩不足与展望 一.前言 [设计难度 : ★☆☆☆☆ [参考书籍:<C语言课程设计与游戏开发实践教程> [主要涉及

  • C语言实现打飞机游戏

    本文实例为大家分享了C语言实现打飞机游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #define U 1 #define D 2 #define L 3 #define R 4 typedef struct node //己方飞机的节点 { int x; int y; struct node *next; }node

  • C语言实现飞机小游戏

    本文实例为大家分享了C语言实现飞机小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<windows.h> int zdj_x,zdj_y; int zd_x,zd_y; int dj_x,dj_y; int speed; int map[21][41]; int score; int H=20,C=40; //墙是1:飞机2:子弹3:敌机4: void start()//设置初始值 { zdj_x=15; zdj_y=20; zd_x

  • C语言控制台实现打飞机小游戏

    本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下 初学C语言总觉得不能做些什么好玩的,这个小游戏只需 "一点点" (千真万确)C语言知识就能完成! 总计不到200行的非空白代码(没有强行压缩行数) 操作说明: 1.W.S.A.D 控制 上 .下.左.右 方向,空格 攻击 2.每击中一架敌机增加1分,界面下方显示实时分数 3.撞到敌机后显示 game over! 2.5秒(时间可更改) 子弹连发 移动的同时发射子弹 飞机撞上敌机结束游戏 可通过更改相关变量的

  • C语言实现飞机游戏(1)

    本文实例为大家分享了C语言实现飞机游戏的具体代码,供大家参考,具体内容如下 本节我们将在上一节 弹跳小球 实现基础上完成简单的飞机游戏. scanf 控制飞机移动 我们可以使用 scanf 函数来检测输入,分别使用 a , s , d , w .来控制 x , y 坐标来实现飞机移动. #include <stdio.h> #include <stdlib.h> int main(){     int i,j;     int x = 5;     int y = 10;     

  • C语言实现飞机大战小游戏完整代码

    大一课设做的飞机大战,可以进行登入和注册,这个是利用单链表做的,源代码已经给出,这个是最基本的飞机大战模式,我设置了几个功能,比如排行榜之类的.排行榜是用结构体数组做的,已及冒泡排序,并且在文件里保存信息.比较简单. 这个是注册页面规范: 这个是登入页面: 游戏菜单:  飞机大战页面:  话不多说,直接上代码 以下是源代码  #include"stdio.h" #include"windows.h" //用于获取窗口的句柄与屏幕控制 #include"co

  • C语言实现飞机游戏(2)

    本文实例为大家分享了C语言实现飞机游戏的具体实现代码,供大家参考,具体内容如下 本节我们将在上一节的基础上对飞机游戏进行改造完善. 基本框架 从本节起,为了避免把所有代码都放进main函数而使得代码看起来臃肿,我们将通过以下基本框架来实现游戏内容. //全局变量定义 int main(){     startup(); //游戏初始化     while(1) //游戏循环体     {         show(); //显示界面         updateWithoutInput(); /

  • C语言实现飞机游戏(豪华版)的示例代码

    目录 前言 一.飞机显示与控制 二.发射子弹 三.击中敌机 四.多台敌机 五.发射散弹 前言 这是飞机游戏的第三版,我们已经实现了基础版和进阶版的飞机游戏  ,但是存在的问题很明显:已经发射出去的子弹会随着飞机位置的实时改变而改变,并且不能实现连发.如果第一次看此文章,可能有部分代码(例如基本游戏框架,清屏功能,键盘控制,数据处理)不了解其功能,建议看看之前写的博客用c实现最简单的飞机游戏和用c实现进阶版飞机游戏 应用数组,可以更方便地记录复杂的数据,实现更复杂的显示.逻辑判断与控制.本篇文章利

  • C语言实现飞机游戏(进阶版)的示例代码

    目录 前言 一.代码重构 二.新式子弹代替激光 三.优化敌方战机 四.增加积分模块 五.更好的清屏功能 前言 没有学习函数,以上功能都在main()中实现是有点痛苦的.在学了函数之后会模块化重构相应的游戏,大家经历过上面的痛苦才能真正理解函数的好处.如果只是被动地学习语法知识,做些简单的算法题,是很难体会到函数封装的重要性的. 我们前面制作的用c语言实现一个最简单的飞机游戏但存在如下缺陷: 可能会遇到子弹运动时无法输入 键盘控制比较卡 不按键时敌人不会自动移动等问题,且敌人只出现一次 屏幕图标闪

随机推荐