zhiyin

该代码段展示了一个使用C++语言开发的飞机大战游戏的基本框架,包括游戏界面的绘制、飞机、子弹和敌机的移动、碰撞检测以及得分系统等功能。游戏通过控制台实现,使用了WindowsAPI进行屏幕输出和用户输入处理。
摘要由CSDN通过智能技术生成

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <string>
#include <stdlib.h>
using namespace std;
typedef struct Frame {
    COORD position[2];
    int flag;
} Frame;
void SetPos (COORD a) {
    HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition (out, a);
}
void SetPos(int i, int j) {
    COORD pos = { i, j };
    SetPos (pos);
}
void HideCursor () {
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info);
}
void drawRow (int y, int x1, int x2, char ch) {
    SetPos (x1, y);
    for (int i = 0; i <= (x2 - x1); i++) {
        cout << ch;
    }
}
void drawRow(COORD a, COORD b, char ch) {
    if (a.Y == b.Y) {
        drawRow (a.Y, a.X, b.X, ch);
    } else {
        SetPos (0, 25);
        cout << "错误:无法填充行,因为两个坐标的纵坐标(x)不相等!";
        MessageBox (NULL, "错误:无法填充行,因为两个坐标的纵坐标(x)不相等!", "温馨提示", MB_OK);
        system ("Pause");
    }
}
void drawCol (int x, int y1, int y2, char ch) {
    int y = y1;
    while (y != y2 + 1) {
        SetPos (x, y);
        cout << ch;
        y++;
    }
}
void drawCol (COORD a, COORD b, char ch) {
    if (a.X == b.X) {
        drawCol (a.X, a.Y, b.Y, ch);
    } else {
        SetPos (0, 25);
        cout << "错误:无法填充列,因为两个坐标的横坐标(y)不相等";
        MessageBox (NULL, "错误:无法填充列,因为两个坐标的横坐标(y)不相等", "温馨提示", MB_OK);
        system("Pause");
    }
}
//左上角坐标、右下角坐标、用row填充行、用col填充列
void drawFrame (COORD a, COORD  b, char row, char col) {
    drawRow (a.Y, a.X + 1, b.X - 1, row);
    drawRow (b.Y, a.X + 1, b.X - 1, row);
    drawCol (a.X, a.Y + 1, b.Y - 1, col);
    drawCol (b.X, a.Y + 1, b.Y - 1, col);
}
void drawFrame (int x1, int y1, int x2, int y2, char row, char col) {
    COORD a = { x1, y1 };
    COORD b = { x2, y2 };
    drawFrame (a, b, row, col);
}
void drawFrame(Frame frame, char row, char col) {
    COORD a = frame.position[0];
    COORD b = frame.position[1];
    drawFrame (a, b, row, col);
}
void drawPlaying () {
    drawFrame(0, 0, 48, 24, '=', '|');
    drawFrame(49, 0, 79, 4, '-', '|');
    drawFrame(49, 4, 79, 9, '-', '|');
    drawFrame(49, 9, 79, 20, '-', '|');
    drawFrame(49, 20, 79, 24, '-', '|');
    SetPos(52, 6);
}
//在[a, b)之间产生一个随机整数
int random(int a, int b) {
    int c = (rand() % (a - b)) + a;
    return c;
}
//在两个坐标包括的矩形框内随机产生一个坐标
COORD random (COORD a, COORD b) {
    int x = random (a.X, b.X);
    int y = random (a.Y, b.Y);
    COORD c = { x, y };
    return c;
}
bool judgeCoordInFrame (Frame frame, COORD spot) {
    if (spot.X >= frame.position[0].X) {
        if (spot.X <= frame.position[1].X) {
            if (spot.Y >= frame.position[0].Y) {
                if (spot.Y <= frame.position[0].Y) {
                    return true;
                }
            }
        }
    }
    return false;
}
void printCoord (COORD a) {
    cout << "( " << a.X << " , " << a.Y << " )";
}
void printFrameCoord (Frame a) {
    printCoord (a.position[0]);
    cout << " - ";
    printCoord (a.position[1]);
}
int drawMenu () {
    SetPos (30, 1);
    cout << "打飞机游戏";
    drawRow (3, 0, 79, '-');
    drawRow (5, 0, 79, '-');
    SetPos (28, 4);
    cout << "1/2 选择,k确定";
    SetPos (15, 11);
    cout << "1. 简单";
    SetPos (15, 13);
    cout << "2. 困难";
    drawRow (20, 0, 79, '-');
    drawRow (22, 0, 79, '-');
    SetPos (47, 11);
    cout << "    简单:";
    SetPos (51, 13);
    cout << "移动速度较慢";
    int j = 11;
    SetPos (12, j);
    cout << ">>";
    while (true) {
        if (_kbhit ()) {
            char x = _getch ();
            switch (x) {
                case '1': {
                    if (j == 13) {
                        SetPos (12, j);
                        cout << " ";
                        j = 11;
                        SetPos (12, j);
                        cout << ">>";
                        SetPos (51, 13);
                        cout << "";
                        SetPos (47, 11);
                        cout << "    简单:";
                        SetPos (51, 13);
                        cout << "移动速度较慢";
                    }
                    break;
                }
                case '2': {
                    if (j == 11) {
                        SetPos (12, j);
                        cout << " ";
                        j = 13;
                        SetPos (12, j);
                        cout << ">>";
                        SetPos (51, 13);
                        cout << "";
                        SetPos (47, 11);
                        cout << "    困难:";
                        SetPos(51, 13);
                        cout << "移动速度较快";
                    }
                    break;
                }
                case 'k': {
                    if (j == 8) {
                        return 1;
                    } else {
                        return 2;
                    }
                }
            }
        }
    }
}
class Game {
public:
    COORD position[10];
    COORD bullet[10];
    Frame enemy[8];
    int score;
    int rank;
    int rankf;
    string title;
    int flag_rank;    
    Game();
    void initPlane ();
    void initBullet ();
    void initEnemy ();
    void planeMove (char);
    void bulletMove ();
    void enemyMove ();
    void drawPlane ();
    void drawPlaneToNull ();
    void drawBullet ();
    void drawBulletToNull ();
    void drawEnemy ();
    void drawEnemyToNull ();
    void drawThisBulletToNull (COORD);
    void drawThisEnemyToNull (Frame);
    void Pause ();
    void Playing ();
    void judgePlane ();
    void judgeEnemy ();
    void Shoot ();
    void GameOver ();
    void printScore ();
};
Game::Game () {
    initPlane ();
    initBullet ();
    initEnemy ();
    score = 0;
    rank = 25;
    rankf = 0;
    flag_rank = 0;
}
void Game::initPlane () {
    COORD centren = { 39, 22 };
    position[0].X = position[5].X = position[7].X = position[9].X = centren.X;
    position[1].X = centren.X - 2;
    position[2].X = position[6].X = centren.X - 1;
    position[3].X = position[8].X = centren.X + 1;
    position[4].X = centren.X + 2;
    for (int i = 0; i <= 4; i++) {
        position[i].Y = centren.Y;
    }
    for (int i = 6; i <= 8; i++) {
        position[i].Y = centren.Y + 1;
    }
    position[5].Y = centren.Y - 1;
    position[9].Y = centren.Y - 2;
}
void Game::drawPlane () {
    for (int i = 0; i < 9; i++) {
        SetPos (position[i]);
        if (i != 5) {
            cout << "O";
        } else if (i == 5) {
            cout << "|";
        }
    }
}
void Game::drawPlaneToNull () {
    for (int i = 0; i < 9; i++) {
        SetPos (position[i]);
        cout << " ";
    }
}
void Game::initBullet () {
    for (int i = 0; i < 10; i++) {
        bullet[i].Y = 30;
    }
}
void Game::drawBullet () {
    for (int i = 0; i < 10; i++) {
        if (bullet[i].Y != 30) {
            SetPos (bullet[i]);
            cout << "^";
        }
    }
}
void Game::drawBulletToNull () {
    for (int i = 0; i < 10; i++) {
        if (bullet[i].Y != 30) {
            COORD pos = { bullet[i].X, bullet[i].Y + 1 };
            SetPos (pos);
            cout << " ";
        }
    }
}
void Game::initEnemy () {
    COORD a = { 1, 1 };
    COORD b = { 45, 15 };
    for (int i = 0; i < 8; i++) {
        enemy[i].position[0] = random (a, b);
        enemy[i].position[1].X = enemy[i].position[0].X + 3;
        enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
    }
}
void Game::drawEnemy () {
    for (int i = 0; i < 8; i++) {
        drawFrame (enemy[i].position[0], enemy[i].position[1], '-', '|');
    }
}
void Game::drawEnemyToNull () {
    for (int i = 0; i < 8; i++) {
        drawFrame (enemy[i].position[0], enemy[i].position[1], ' ', ' ');
    }
}
void Game::Pause () {
    SetPos (61, 2);
    cout << "               ";
    SetPos (61, 2);
    cout << "游戏暂停中……";
    char c = _getch();
    while (c != ' ') {
        c = _getch ();
    }
    SetPos (61, 2);
    cout << "         ";
}
void Game::planeMove (char x) {
    if (x == 75) {
        if (position[1].X != 1) {
            for (int i = 0; i <= 9; i++) {
                position[i].X -= 2;
            }
        }
    } else if (x == 80) {
        if (position[7].Y != 23) {
            for (int i = 0; i <= 9; i++) {
                position[i].Y += 1;
            }
        }
    } else if (x == 77) {
        if (position[4].X != 47) {
            for (int i = 0; i <= 9; i++) {
                position[i].X += 2;
            }
        }
    } else if (x == 72) {
        if (position[5].Y != 3) {
            for (int i = 0; i <= 9; i++) {
                position[i].Y -= 1;
            }
        }
    }
}
void Game::bulletMove () {
    for (int i = 0; i < 10; i++) {
        if (bullet[i].Y != 30) {
            bullet[i].Y--;
            if (bullet[i].Y == 1) {
                COORD pos = { bullet[i].X, bullet[i].Y + 1 };
                drawThisBulletToNull (pos);
                bullet[i].Y = 30;
            }
        }
    }
}
void Game::enemyMove () {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 2; j++) {
            enemy[i].position[j].Y++;
        }
        if (24 == enemy[i].position[1].Y) {
            COORD a = { 1, 1 };
            COORD b = { 45, 3 };
            enemy[i].position[0] = random (a, b);
            enemy[i].position[1].X = enemy[i].position[0].X + 3;
            enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
        }
    }
}
void Game::judgePlane () {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 9; j++) {
            if (judgeCoordInFrame (enemy[i], position[j])) {
                SetPos (62, 1);
                cout << "坠毁";
                drawFrame (enemy[i], '+', '+');
                Sleep (1000);
                GameOver ();
                break;
            }
        }
    }
}
void Game::drawThisBulletToNull (COORD c) {
    SetPos (c);
    cout << " ";
}
void Game::drawThisEnemyToNull (Frame f) {
    drawFrame(f, ' ', ' ');
}
void Game::judgeEnemy () {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 10; j++) {
            if (judgeCoordInFrame (enemy[i], bullet[j])) {
                score += 5;
                drawThisEnemyToNull(enemy[i]);
                COORD a = { 1, 1 };
                COORD b = { 45, 3 };
                enemy[i].position[0] = random(a, b);
                enemy[i].position[1].X = enemy[i].position[0].X + 3;
                enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
                drawThisBulletToNull(bullet[j]);
                bullet[j].Y = 30;
            }
        }
    }
}
void Game::Shoot () {
    for (int i = 0; i < 10; i++) {
        if (bullet[i].Y == 30) {
            bullet[i].X = position[5].X;
            bullet[i].Y = position[5].Y - 1;
            break;
        }
    }
}
void Game::printScore () {
    if (score == 120 && flag_rank == 0) {
        rank -= 3;
        flag_rank = 1;
    } else if (score == 360 && flag_rank == 1) {
        rank -= 5;
        flag_rank = 2;
    } else if (score == 480 && flag_rank == 2) {
        rank -= 5;
        flag_rank = 3;
    }
    int x = rank / 3;
    SetPos (60, 6);
    cout << score;
    if (rank != rankf) {
        SetPos (60, 7);
        if (x == 6) {
            title = "青铜飞行员";
        } else if (x == 5) {
            title = "黄金飞行员";
        } else if (x == 4) {
            title = "星钻飞行员";
        } else if (x == 3) {
            title = "皇冠飞行员";
        } else if (x == 2) {
            title = "战神飞行员";
        }
        cout << title;
    }
    rankf = rank;
}
void Game::Playing () {
    drawEnemy ();
    drawPlane ();
    int flag_bullet = 0;
    int flag_enemy = 0;
    while (true) {
        Sleep (8);
        if (_kbhit ()) {
            char x = _getch ();
            if (75 == x || 80 == x || 77 == x || 72 == x) {
                drawPlaneToNull ();
                planeMove (x);
                drawPlane ();
                judgePlane ();
            } else if (' ' == x) {
                Pause ();
            } else if ('k' == x) {
                Shoot();
            } else if (27 == x) {
                exit (0);
            }
        }
        if (!flag_bullet) {
            bulletMove ();
            drawBulletToNull ();
            drawBullet ();
            judgeEnemy ();
        }
        flag_bullet++;
        if (5 == flag_bullet) {
            flag_bullet = 0;
        }
        if (!flag_enemy) {
            drawEnemyToNull ();
            enemyMove ();
            drawEnemy ();
            judgePlane ();
        }
        flag_enemy++;
        if (flag_enemy >= rank) {
            flag_enemy = 0;
        }
        printScore ();
    }
}
void Game::GameOver () {
    system("cls");
    COORD p1 = { 28,9 };
    COORD p2 = { 53,15 };
    drawFrame (p1, p2, '=', '|');
    SetPos (36, 12);
    string str = "Game Over!";
    for (int i = 0; i < str.size(); i++) {
        Sleep (80);
        cout << str[i];
    }
    Sleep (1000);
    system ("cls");
    drawFrame (p1, p2, '=', '|');
    SetPos (31, 11);
    string s = "击落敌机:";
    for (int i = 0; i < s.size (); i++) {
        Sleep (80);
        cout << s[i] ;
    }
    Sleep (80);
    cout << score / 5;
    Sleep (80);
    cout << "架" << endl;
    SetPos (31, 12);
    s = "得  分:";
    for (int i = 0; i < s.size (); i++) {
        Sleep (80);
        cout << s[i];
    }
    Sleep (80);
    cout << score << endl;
    SetPos (31, 13);
    s = "获得称号:";
    for (int i = 0; i < s.size (); i++) {
        Sleep (80);
        cout << s[i];
    } 
    Sleep (80);
    cout << title << endl;
    SetPos (30, 16);
    s = "继续? 是(y)| 否(n)";

    for (int i = 0; i < s.size (); i++) {
        Sleep (80);
        cout <<s[i];
    }
    cout << endl;
as:
    char x = _getch ();
    if (x == 'n') {
        exit (0);
    } else if (x == 'y') {
        system ("cls");
        Game game;
        int a = drawMenu ();
        if (a == 2) {
            game.rank = 20;
        }
        system ("cls");
        drawPlaying ();
        game.Playing ();
    } else {
        goto as;
    }
}
int main() {
    MessageBox (NULL, "欢迎来到飞机大战游戏!", "温馨提示", MB_OK);
    system ("COLOR B1");
    printf (">>                        游戏须知:\n\n\n");
    printf ("            1.请用方向键(↑↓←→)来控制玩家机的移动!\n\n\n");
    printf ("            2.请用‘k’键来发射子弹!\n\n\n");
    printf ("            3.若敌机碰到了玩家机,玩家输!\n\n\n");
    printf ("            4.若玩家机发射的子弹碰到了敌机,敌机将会被击落,玩家得5分!\n\n\n");
    printf ("            5.暂停游戏,请按空格键,恢复,请按空格键!\n\n\n");
    printf ("            6.退出游戏,请按Esc键!\n\n\n");
    printf ("            7.游戏愉快!\n\n\n");
    printf ("            ");
    system ("pause");
    system ("cls");
    srand ((int)time (0));
    HideCursor ();
    Game game;
    int a = drawMenu ();
    if (a == 2) {
        game.rank = 20;
    }
    system ("cls");
    drawPlaying ();
    game.Playing ();
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值