0
点赞
收藏
分享

微信扫一扫

小游戏(1)

全栈顾问 2022-02-17 阅读 71

今天,我们做一个打飞机的游戏

(需要函数)

代码如下(很多啊):

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <string>
using namespace std;
int hp;

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);
}

//把第y行,(x1, x2) 之间的坐标填充为 ch
void drawRow(int y, int x1, int x2, char ch) {
    SetPos(x1, y);
    for (int i = 0; i <= (x2 - x1); i++)
        cout << ch;
}

//在a, b 纵坐标相同的前提下,把坐标 (a, b) 之间填充为 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 << "error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";
        system("pause");
    }
}

//把第x列,(y1, y2) 之间的坐标填充为 ch
void drawCol(int x, int y1, int y2, char ch) {
    int y = y1;
    while (y != y2 + 1) {
        SetPos(x, y);
        cout << ch;
        y++;
    }
}

//在a, b 横坐标相同的前提下,把坐标 (a, b) 之间填充为 ch
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 << "error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";
        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() {
    HideCursor();
    drawFrame(0, 0, 48, 24, '=', '|');
    drawFrame(49, 0, 79, 4, '=', '|');
    drawFrame(49, 4, 79, 9, '-', '|');
    drawFrame(49, 20, 79, 24, '=', '|');
    drawFrame(49, 9, 79, 20, '-', '|');
    SetPos(52, 6);
    cout << "得分:";
    SetPos(52, 7);
    cout << "称号:";
    SetPos(52, 10);
    cout << "操作方式:";
    SetPos(52, 12);
    cout << "  a,s,d,w 控制战机移动。";
    SetPos(52, 14);
    cout << "  k 发射。";
    SetPos(52, 16);
    cout << "  e 退出游戏。";
    SetPos(52, 18);
    cout << "  p 暂停游戏。";
}

//在(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() {
    HideCursor();
    SetPos(30, 1);
    cout << "P l a n e  W a r";
    drawRow(3, 0, 79, '-');
    drawRow(5, 0, 79, '-');
    SetPos(28, 4);
    cout << "w 和 s 选择, 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 << "简单敌人有着较慢的移动速度,容易对付。";
    SetPos(24, 21);
    cout << "       长润出品,禁止抄袭";
    int j = 11;
    SetPos(12, j);
    cout << "->";
    drawFrame(44, 9, 89, 15, '=', '|');

    while (1) {
        if ( _kbhit() ) {
            char x = _getch();
            switch (x) {
                case 'w' : {
                    if ( j == 13) {
                        HideCursor();
                        SetPos(12, j);
                        cout << " ";
                        j = 11;
                        SetPos(12, j);
                        cout << "->";
                        SetPos(51, 13);
                        cout << "            ";
                        SetPos(47, 11);
                        cout << "简单的敌人:";
                        SetPos(51, 13);
                        cout << "简单敌人有着较慢的移动速度,容易对付。";
                    }
                    break;
                }
                case 's' : {
                    if ( j == 11 ) {
                        HideCursor();
                        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' : {
                    HideCursor();
                    if (j == 8)
                        return 1;
                    else
                        return 2;
                }
            }
        }
    }
}

/*
DWORD WINAPI MusicFun(LPVOID lpParamte)
{
    //DWORD OBJ;
    sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);
    return 0;
}
*/

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 initThisBullet( COORD );
        //void initThisEnemy( Frame );

        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() {
    hp = 100;
    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 - 1;
    for (int i = 6; i <= 8; i++)
        position[i].Y = centren.Y;
    position[5].Y = centren.Y - 2;
    position[9].Y = centren.Y - 3;
}

void Game::drawPlane() {
    for (int i = 0; i < 9; i++) {
        SetPos(position[i]);
        if (i == 5)
            cout << "|";
        if (i == 0)
            cout << "O";
        if (i == 2 || i == 3 || i == 1 || i == 4)
            cout << "=";
        if (i == 6 || i == 8 || i == 7)
            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 != 'p')
        c = _getch();
    SetPos(61, 2);
    cout << "         ";
}

void Game::planeMove(char x) {
    if (x == 'a')
        if (position[1].X != 1)
            for (int i = 0; i <= 9; i++)
                position[i].X -= 2;

    if (x == 's')
        if (position[7].Y != 23)
            for (int i = 0; i <= 9; i++)
                position[i].Y += 1;

    if (x == 'd')
        if (position[4].X != 47)
            for (int i = 0; i <= 9; i++)
                position[i].X += 2;

    if (x == 'w')
        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 -= 1;
            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, 2);
                system("color 04");
                cout << "击中";
                drawFrame(enemy[i], '*', '*');
                Sleep(100);
                hp -= 20;
                SetPos(54, 22);
                cout << "HP  ";
                if (hp == 80)
                    cout << "■■■■       ";
                if (hp == 60)
                    cout << "■■■         ";
                if (hp == 40)
                    cout << "■■            ";
                if (hp == 20)
                    cout << "■       /Warning/";
                if (hp == 0)
                    cout << "\b\b\b\b       /坠毁/            ";
                system("color 0F");
                if (hp == 0) {
                    SetPos(62, 2);
                    cout << "坠毁";
                    GameOver();
                }
                SetPos(62, 2);
                cout << "    ";
                drawThisEnemyToNull( enemy[i] );
                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 >= 150 && flag_rank == 0) {
        rank -= 5;
        flag_rank = 1;
    }

    else if ( score >= 300 && flag_rank == 1) {
        rank -= 5;
        flag_rank = 2;
    } else if ( score >= 500 && flag_rank == 2) {
        rank -= 5;
        flag_rank = 3;
    } else if ( score >= 750 && flag_rank == 3) {
        rank -= 5;
    }
    if ( score >= 1000) {
        system("color 02");
        SetPos(61, 2);
        cout << "通关!!!";
        Sleep(1000);
        title = "\b\b\b\b\b\b\b\b\b\b恭喜你,通关成功!!!";
        system("color 0F");
        GameOver();
    }
    int x = rank / 5;
    SetPos(60, 6);
    cout << score;
    x++;
    if ( rank != rankf ) {
        SetPos(60, 7);
        if ( x == 5)
            title = "菜鸟飞行员";
        else if ( x == 4)
            title = "初级飞行员";
        else if ( x == 3)
            title = "中级飞行员";
        else if ( x == 2 )
            title = "高级飞行员";
        else if ( x == 1)
            title = "王牌飞行员";
        cout << title;
    }
    rankf = rank;
}

void Game::Playing() {
    //HANDLE MFUN;
    //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);
    SetPos(54, 22);
    cout << "HP  ■■■■■";
    drawEnemy();
    drawPlane();

    int flag_bullet = 0;
    int flag_enemy = 0;

    while (1) {
        Sleep(8);
        if (_kbhit()) {
            char x = _getch();
            if ('a' == x || 's' == x || 'd' == x || 'w' == x) {
                drawPlaneToNull();
                planeMove(x);
                drawPlane();
                judgePlane();
            } else if ('p' == x)
                Pause();
            else if ( 'k' == x)
                Shoot();
            else if ( 'e' == x) {
                //CloseHandle(MFUN);
                GameOver();
                break;
            }

        }
        /* 处理子弹 */
        if ( 0 == flag_bullet ) {
            bulletMove();
            drawBulletToNull();
            drawBullet();
            judgeEnemy();
        }
        flag_bullet++;
        if ( 5 == flag_bullet )
            flag_bullet = 0;

        /* 处理敌人 */
        if ( 0 == 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);
    HideCursor();
    string str = "Game Over!";
    for (int i = 0; i < str.size(); i++) {
        Sleep(80);
        cout << str[i];
    }
    Sleep(1000);
    system("cls");
    HideCursor();
    drawFrame(p1, p2, '=', '|');
    p1.Y -= 3;
    p2.Y = p1.Y + 2;
    drawFrame(p1, p2, '-', '|');
    SetPos(31, 11);
    cout << "击落敌机:" << score / 5 << " 架";
    SetPos(31, 12);
    cout << "得  分:" << score;
    SetPos(31, 13);
    cout << "获得称号:" << title;
    SetPos(32, 7);
    cout << "CR出品,禁止抄袭";
    SetPos(29, 16);
    Sleep(1000);
    cout << "  继续? 是(y)| 否(n)";
    HideCursor();
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() {
    //游戏准备
    srand((int)time(0));    //随机种子
    HideCursor();    //隐藏光标

    Game game;
    int a = drawMenu();
    if (a == 2)
        game.rank = 20;
    system("cls");
    drawPlaying();
    game.Playing();
}

也是有很多关卡供大家选择啊

好玩就点个关注吧

下一期:勇者世界

举报

相关推荐

0 条评论