问题标题: 飞机大战代码和其它游戏代码

0
1

0
已采纳
阮俊雄
阮俊雄
新手光能
新手光能

俄罗斯方块:

/*
← 左移
→ 右移
↓ 加速
↑ 旋转

连续消去1行得1分、2行得3分、3行得5分、4行得7分。
积分达到一定程度,会有换命的活动,命最多6条。
难度会随积分的上升逐渐上升,最多到6的难度。
*/

#include <iostream>
#include <cstdio>
#include <windows.h>
#include <vector>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")
using namespace std;

#define GameW 10
#define GameH 20
const int CtrlLeft = GameW*2+4 + 3;

void out(int x){
    cout<<"游戏方式:"<<endl;
    cout<<"← 左移     → 右移"<<endl;
    cout<<"↓ 加速     ↑ 旋转"<<endl;
    cout<<"游戏规则:"<<endl;
    cout<<"连续消去1行得1分、2行得3分、3行得5分、4行得7分。"<<endl;
    cout<<"积分达到一定程度,会有换命的活动,命最多6条。"<<endl;
    cout<<"难度会随积分的上升逐渐上升,最多到6的难度。"<<endl<<"下面游戏正式开始";
    return;
}
struct Point {
    Point(){}
    Point(int x, int y) {_x = x, _y = y;}
    int _x, _y;
};

HANDLE g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_hInput  = GetStdHandle(STD_INPUT_HANDLE);

Point g_ptCursor(0,0);
BOOL isChecking = FALSE;
BOOL g_bGameOver = FALSE;
int g_nGameBack[GameH][GameW], Case;
int nowKeyInfo = -1;
int g_nDiff = 1;
int g_nLife = 2;
int g_nScore = 0;

void SetCursor(COORD cd) {
    SetConsoleCursorPosition(g_hOutput, cd);
}
void SetCursor(int x, int y){
    COORD cd = {x, y};
    SetCursor(cd);
}
void SetBlockCursor(int x, int y){
    COORD cd = {2*x + 2, y + 1};
    SetCursor(cd);
}

void SetBack(int x, int y, BOOL bk) {
    SetBlockCursor(x, y);
    if (bk) 
        printf("%s", "■");
    else
        printf(" ");
}

bool Out(int x, int y) {
    return x < 0 || y < 0 || x >= GameW || y >= GameH; 
}

struct xBlock {
public:
    int len;
    int nowRotateID;
    BOOL mask[4][4][4];
    static vector <xBlock> List;

    xBlock() { len = 0; }
    xBlock(int l, char *str) {
        int i, j, k;
        len = l;
        memset(mask, FALSE, sizeof(mask));
        for(i = 0; i < l; i++) {
            for(j = 0; j < l; j++) {
                mask[0][i][j] = str[i*l + j] - '0';
            }
        }
        for(k = 1; k < 4; k++) {
            for(i = 0; i < len; i++) {
                for(j = 0; j < len; j++) {
                    mask[k][i][j] = mask[k-1][j][len-1-i];
                }
            }
        }
        nowRotateID = rand() % 4;
    }

    void rotate() {
        nowRotateID ++;
        if (nowRotateID >= 4)
            nowRotateID = 0;
    }

    BOOL getUnit(int x, int y, int roID) {
        if (roID == -1) {
            roID = nowRotateID;
        }
        return mask[roID][y][x];
    }
};

vector <xBlock> xBlock::List;

class Block {
public:
    int x, y;
    int ID;
    xBlock bk;

    void reset(xBlock *pbk) {
        bk = *pbk;

        x = 4, y = 0;
        ID = ++ Case;

        if(collide(0,0)) {
            lifeDown();
        }
        draw();
        
        *pbk = xBlock::List[rand() % xBlock::List.size()];
    }
    
    void lifeDown() {
        int i, j;
        for(i = 0; i < GameH; i++) {
            for(j = 0; j < GameW; j++) {
                SetBack(j, i, TRUE);
                Sleep(10);
            }
        }
        if(g_nLife) {
            g_nLife --;
            for(i = g_nLife; i < 6; i++) {
                SetCursor(CtrlLeft + i, 15);
                printf("%c", ' ');
            }
            for(i = GameH-1; i >= 0; i--) {
                for(j = GameW-1; j >= 0; j--) {
                    SetBack(j, i, FALSE);
                    Sleep(10);
                    g_nGameBack[i][j] = 0;
                }
            }
        }else {
            g_bGameOver = TRUE;
        }
    }

    void erase() {
        int i, j;
        for(i = 0; i < bk.len; i++) {
            for(j = 0; j < bk.len; j++) {
                if (bk.getUnit(j, i, -1)) {
                    if(!Out(j+x, i+y) && g_nGameBack[i+y][j+x]) {
                        SetBack(j+x, i+y, FALSE);
                        g_nGameBack[i+y][j+x] = 0;
                    }
                }
            }
        }
    }
    void draw() {
        int i, j;
        for(i = 0; i < bk.len; i++) {
            for(j = 0; j < bk.len; j++) {
                if (bk.getUnit(j, i, -1)) {
                    if(!Out(j+x, i+y) && !g_nGameBack[i+y][j+x]) {
                        SetBack(j+x, i+y, TRUE);
                        g_nGameBack[i+y][j+x]  = ID;
                    }
                }
            }
        }
    }
    void draw(int x, int y) {
        int i, j;
        for(i = 0; i < 4; i++) {
            for(j = 0; j < 4; j++) {
                SetCursor(x + 2*j, y + i);
                if (bk.getUnit(j, i, -1)) {    
                    printf("%s", "■");
                }else 
                    printf(" ");
            }
        }
    }
    bool collide(int dx, int dy, int roID = -1) {
        int i, j;
        for(i = 0; i < bk.len; i++) {
            for(j = 0; j < bk.len; j++) {
                if (bk.getUnit(j, i, roID)) {
                    Point ptPos(j + x + dx, i + y + dy);
                    if(Out(ptPos._x, ptPos._y)
                    || g_nGameBack[ptPos._y][ptPos._x] && ID != g_nGameBack[ptPos._y][ptPos._x]) {
                        return TRUE;
                    }
                }
            }
        }
        return FALSE;
    }

    void rotate(int nTimes = 1) {
        int nextro = (bk.nowRotateID + nTimes) % 4;
        if(collide(0, 0, nextro)) {
            return ;
        }
        Beep(12000, 50);
        erase();
        bk.nowRotateID = nextro;
        draw();
    }

    BOOL changepos(int dx, int dy) {
        if(collide(dx, dy)) {
            return FALSE;
        }
        erase();
        x += dx;
        y += dy;
        draw();
        return TRUE;
    }
};

void GameInit() {
    CONSOLE_CURSOR_INFO cursor_info;
    cursor_info.bVisible = FALSE;
    cursor_info.dwSize   = 100;
    SetConsoleCursorInfo(g_hOutput, &cursor_info);
    xBlock::List.push_back(xBlock(3, "010111000"));
    xBlock::List.push_back(xBlock(3, "110110000"));
    xBlock::List.push_back(xBlock(3, "111001000"));
    xBlock::List.push_back(xBlock(3, "111100000"));
    xBlock::List.push_back(xBlock(3, "110011000"));
    xBlock::List.push_back(xBlock(3, "011110000"));
    xBlock::List.push_back(xBlock(4, "1000100010001000"));
}

void DrawFrame(int x, int y, int nWidth, int nHeight) {
    int i;
    for(i = 0; i < nWidth; i++) {
        SetCursor(x + 2*i + 2, y);
        printf("%s", "一");
        SetCursor(x + 2*i + 2, y + nHeight+1);
        printf("%s", "┄");
    }
    for(i = 0; i < nHeight; i++) {
        SetCursor(x, y + i + 1);
        printf("%s", "┆");
        SetCursor(x + nWidth*2+2, y + i + 1);
        printf("%s", "┆");
    }        
    SetCursor(x, y);
    printf("%s", "┌");    
    SetCursor(x, y + nHeight+1);
    printf("%s", "└");
    SetCursor(x + nWidth*2+2, y);
    printf("%s", "┐");    
    SetCursor(x + nWidth*2+2, y + nHeight+1);
    printf("%s", "┘");
}

void MissionInit() {
    memset(g_nGameBack, FALSE, sizeof(g_nGameBack));
    Case = 1;
    int i;
    DrawFrame(0, 0, GameW, GameH);
    DrawFrame(GameW*2+4, 0, 4, GameH);
    SetCursor(CtrlLeft, 2);
    printf("Next");
    
    SetCursor(CtrlLeft, 8);
    printf("Speed");
    for(i = 0; i < g_nDiff; i++) {
        SetCursor(CtrlLeft + i, 9);
        printf("%c", 1);
    }

    SetCursor(CtrlLeft, 11);
    printf("Score");
    SetCursor(CtrlLeft, 12);
    printf("%d", g_nScore);

    SetCursor(CtrlLeft, 14);
    printf("Life");
    for(i = 0; i < g_nLife; i++) {
        SetCursor(CtrlLeft + i, 15);
        printf("%c", 3);
    }

    SetCursor(CtrlLeft-1, 19);
    printf("by Zty");
    SetCursor(CtrlLeft-1, 20);
    printf("Baidu A*");
}

void Check() {
    isChecking = TRUE;
    int i, j, k;
    vector <int> line;
    for(i = 0; i < GameH; i++) {
        for(j = 0; j < GameW; j++) {
            if(!g_nGameBack[i][j])
                break;
        }
        if(j == GameW) {
            line.push_back(i);
        }
    }
    if(line.size()) {
        int nCount = 7;
        while(nCount --) {
            for(i = 0; i < line.size(); i++) {
                for(j = 0; j < GameW; j++) {
                    SetBack(j, line[i], nCount&1);
                }
            }
            Sleep(70);
        }
        for(i = 0; i < line.size(); i++) {
            for(j = 0; j < GameW; j++) {
                g_nGameBack[line[i]][j] = 0;
            }
        }

        for(i = 0; i < GameW; i++) {
            int next = GameH-1;
            for(j = GameH-1; j >= 0; j--) {
                for(k = next; k >= 0; k--) {
                    if(g_nGameBack[k][i]) 
                        break;
                }
                next = k - 1;
                BOOL is = (k >= 0);
                SetBack(i, j, is);
                g_nGameBack[j][i] = is;
            }
        }

        g_nScore += 2*line.size()-1;
        SetCursor(CtrlLeft, 12);
        printf("%d", g_nScore);

        if( g_nScore >= g_nDiff * g_nDiff * 10) {
            if(g_nDiff <= 6)
                g_nDiff ++;
        }
        if( g_nScore >= 50 * (g_nLife+1)) {
            if(g_nLife <= 6)
                g_nLife ++;
        }
    }

    isChecking = FALSE;
}
int main() { 
    Block* obj = new Block();
    Block* buf = new Block();
    

    BOOL bCreateNew = FALSE;
    int nTimer = GetTickCount();
    int LastKeyDownTime = GetTickCount();


    GameInit();
    MissionInit();
    
    buf->bk = xBlock::List[rand() % xBlock::List.size()];
    while(1) {
        if(!bCreateNew) {
            bCreateNew = TRUE;
            obj->reset(&buf->bk);
            if(g_bGameOver)
                break;
            buf->draw(CtrlLeft - 1, 4);
        }
        if (GetTickCount() - nTimer >= 1000 / g_nDiff) {
            nTimer = GetTickCount();
            if (!obj->collide(0, 1))
                obj->changepos(0, 1);
            else {
                Check();
                bCreateNew = FALSE;
            }
        }
        if (GetTickCount() - LastKeyDownTime >= 100) {
            if(FALSE == isChecking) {
                LastKeyDownTime = GetTickCount();
                if (GetAsyncKeyState(VK_UP)) {
                    obj->rotate();
                }
                if (GetAsyncKeyState(VK_LEFT)) {
                    obj->changepos(-1, 0);
                }
                if (GetAsyncKeyState(VK_RIGHT)) {
                    obj->changepos(1, 0);
                }
                if (GetAsyncKeyState(VK_DOWN)) {
                    if( FALSE == obj->changepos(0, 2) )
                        obj->changepos(0, 1);
                }
            }
        }
    }
    SetCursor(8, 10);
    printf("Game Over");

    SetCursor(0, GameH+3);
    printf("按ESC键退出游戏");

    while(1) {
        if (GetAsyncKeyState(VK_ESCAPE))
            break;
    }
    return 0;
}

2
蒋智航
蒋智航
高级天翼
高级天翼
#include<iostream>

#include<windows.h>

#include<conio.h>

#include<time.h>

#include<string>

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

}



//把第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()

{

    drawFrame(0, 0, 48, 24, '=', '|');//    draw map frame;

    drawFrame(49, 0, 79, 4, '-', '|');//        draw output frame

    drawFrame(49, 4, 79, 9, '-', '|');//        draw score frame

    drawFrame(49, 9, 79, 20, '-', '|');//   draw operate frame

    drawFrame(49, 20, 79, 24, '-', '|');//  draw other message frame

    SetPos(52, 6);

    cout<<"得分:";

    SetPos(52, 7);

    cout<<"称号:";

    SetPos(52,10);

    cout<<"操作方式:";

    SetPos(52,12);

    cout<<"  a,s,d,w 控制战机移动。";

    SetPos(52,14);

    cout<<"  p 暂停游戏。";

    SetPos(52,16);

    cout<<"  e 退出游戏。";

}



//在[a, b)之间产生一个随机整数

int random(int a, int b)

{

    int c=(rand() % (a-b))+ a;

    return c;

}
void color(int b)         //颜色函数 

{

    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; 

    SetConsoleTextAttribute(hConsole,b) ;

} 




//在两个坐标包括的矩形框内随机产生一个坐标

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<<"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<<"简单敌人有着较慢的移动速度。";

    int j=11;

    cout<<">>";

    while(1) {

        if( _kbhit() ) {    

            char x=_getch();

            switch (x) {

              case 'w' : {  

                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 's' : {  

                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;

              }

            }

        }

    }

}

/*================== the Game Class ==================*/



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()

{

    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!='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, 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/5;

    SetPos(60, 6);

    cout<<score;



    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="绝地武士守护";
            else if(x=0)
            title="缔造者之神守护"; 

        cout<<title;

    }

    rankf = rank;

}



void Game::Playing()

{




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

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

    cout<<"击落敌机:"<<score/5<<" 架";

    SetPos(31, 12);

    cout<<"得  分:"<<score<<" 分";

    SetPos(31, 13);

    cout<<"获得称号:"<<title;

    SetPos(30, 16);

    Sleep(1000);

    cout<<"继续? 是(y)| 否(n)";

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;

}



/*================== the main function ==================*/

int main()

{

    //游戏准备

    srand((int)time(0));    //随机种子

    HideCursor();   //隐藏光标



    Game game;

    int a = drawMenu();

    if(a == 2)

        game.rank = 20;

    system("cls");

    drawPlaying();

    game.Playing();

}

 

0
0
0
赵毅恒
赵毅恒
资深守护
资深守护
#include<iostream>

#include<windows.h>

#include<conio.h>

#include<time.h>

#include<string>

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

}



//把第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()

{

    drawFrame(0, 0, 48, 24, '=', '|');//    draw map frame;

    drawFrame(49, 0, 79, 4, '-', '|');//        draw output frame

    drawFrame(49, 4, 79, 9, '-', '|');//        draw score frame

    drawFrame(49, 9, 79, 20, '-', '|');//   draw operate frame

    drawFrame(49, 20, 79, 24, '-', '|');//  draw other message frame

    SetPos(52, 6);

    cout<<"得分:";

    SetPos(52, 7);

    cout<<"称号:";

    SetPos(52,10);

    cout<<"操作方式:";

    SetPos(52,12);

    cout<<"  a,s,d,w 控制战机移动。";

    SetPos(52,14);

    cout<<"  p 暂停游戏。";

    SetPos(52,16);

    cout<<"  e 退出游戏。";

}



//在[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<<"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. 牛X的敌人";

    drawRow(20, 0, 79, '-');

    drawRow(22, 0, 79, '-');

    SetPos(47, 11);

    cout<<"简单的敌人:";

    SetPos(51, 13);

    cout<<"简单敌人有着较慢的移动速度。";

    int j=11;

    cout<<">>";

    while(1) {

        if( _kbhit() ) {    

            char x=_getch();

            switch (x) {

              case 'w' : {  

                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 's' : {  

                if( j == 11 ) {

                  SetPos(12, j);

                  cout<<" ";        

                  j = 13;

                  SetPos(12, j);

                  cout<<">>";

                  SetPos(51, 13);

                   cout<<"              ";

                   SetPos(47, 11);

                   cout<<"牛X的敌人:";

                   SetPos(51, 13);

                   cout<<"牛X的敌人移动速度较快。";

                }

                break;

              }

              case 'k' : {  

                if (j == 8) return 1; else return 2;

              }

            }

        }

    }

}

/*================== the Game Class ==================*/



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()

{

    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!='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, 1);

                cout<<"P掉了";

                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/5;

    SetPos(60, 6);

    cout<<score;



    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="哎呦,不错哦";
            else if(x=0)
            title="这是疯啦!?"; 

        cout<<title;

    }

    rankf = rank;

}



void Game::Playing()

{




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

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

    cout<<"击落敌机:"<<score/5<<" 架";

    SetPos(31, 12);

    cout<<"得  分:"<<score<<" 分";

    SetPos(31, 13);

    cout<<"获得称号:"<<title;

    SetPos(30, 16);

    Sleep(1000);

    cout<<"继续? 是(y)| 否(n)";

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;

}



/*================== the main function ==================*/

int main()

{

    //游戏准备

    srand((int)time(0));    //随机种子

    HideCursor();   //隐藏光标



    Game game;

    int a = drawMenu();

    if(a == 2)

        game.rank = 20;

    system("cls");

    drawPlaying();

    game.Playing();

}

 

0
0
余思成
余思成
高级守护
高级守护
#include <iostream>

#include <list>

#include <cstdio>

#include <string>

#include <vector>

#include <ctime>

#include <algorithm>

#include <conio.h>

#include <windows.h>

using namespace std;



class Node { 

public:

    int x, y;

    Node(int x1, int y1); 

};



class UserData { 

public:

    string name;

    long long score;

    int gt;

    int gr; 

    UserData(string s, long long sc,int gametime,int grade); 

    friend bool operator < (UserData a, UserData b); 

};



#define RIGHT 0x4d

#define LEFT 0x4b  

#define UP 0x48  

#define DOWN 0x50 

#define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY

#define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY

#define ORANGE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY

#define PURPLE FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY

#define RED  FOREGROUND_RED | FOREGROUND_INTENSITY

const int STARTX = 8; 

const int STARTY = 4; 

const int RANGEX = 60; 

const int RANGEY = 20;

int point=10; 

const int ENDX = STARTX + RANGEX; 

const int ENDY = STARTY + RANGEY; 

bool isSnake[RANGEY + 10 ][RANGEX + 10];

int speed; 

int sysj;

int gametime;

list<Node> snake;

int curDiraction; //蛇的当前前进方向, 1上, 2下, 3左, 4右

int score; //当前分数

int grade;

int snakeLen; //蛇的长度

int foodx, foody; //食物坐标

int gox, goy; //蛇头坐标

int mj;

void GoTo(short x, short y); //定位光标

void DrawBoard(); //绘制边框

void ShowInformation(); //展示游戏信息

void Init(); //初始化游戏

void RunSnake(int x, int y); //绘制蛇身

void Try(int& x, int& y); //试走

bool IsGoodCoord(int x, int y); //前进坐标是否合法

void AddFood(); //增加食物

void EartFood(); //吃食物

void InitSnake(); //初始化蛇身

bool EndGame(); //结束游戏

bool StartGame(); //启动游戏

bool GameMenu(); //游戏菜单

void ShowRanking(); //排行榜

void ShowAbout(); //相关信息

void InputData(); //输入玩家名字



int main() {

    system("title 贪吃蛇小游戏 by 李凯昱");

    while (true) {

        if (!GameMenu()) return 0;

    }

    return 0;

}



Node::Node(int x1, int y1) { //构造Node对象

    x = x1; y = y1; 

}



bool operator < (UserData a, UserData b) { //重载运算符,按分数由大到小排列

    if(a.score != b.score)

    return a.score > b.score;

    if(a.gt !=b.gt)

    return a.gt > b.gt;

    else

    return a.gr > b.gr;

}

UserData::UserData(string s, long long sc,int gametime_,int _grade) { //构造UserData对象

    name = s; score = sc; gt=gametime_; gr=_grade;

}



void color(WORD A)

{

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), A);

} 



void Color(int score_)

{

    if(score_%4==1)

    {

        color(PURPLE);

    }

    else if(score_%4==2)

    {

        color(RED);

    }

    else if(score_%4==3)

    {

        color(YELLOW);

    }

    else if(score_%4==0) 

    {

        color(CYAN);

    }

}



void GoTo(short x, short y) { //定位光标

    COORD coord = { x, y };

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}



void ShowInformation() { //输出游戏信息

    color(YELLOW);

    GoTo(78, 5);

    printf("贪吃蛇游戏");

    GoTo(78,18);

    gametime=(clock()-mj)/1000;

    grade=snakeLen-3; 

    printf("生存时间:%3d 秒",(clock()-mj)/1000);

    GoTo(78, 8);

    printf("游戏规则:");

    GoTo(78, 10);

    printf("请按 ↑ ↓ ← →  来控制您的蛇吃东西");

    GoTo(78, 12);

    printf("吃的越多,蛇就越长,您的等级也将越高");

    GoTo(78, 14);

    printf("当蛇吃到自己或撞上墙时,游戏结束。");

    GoTo(78,16);

    printf("自动前进时间:%3dms",speed);

    GoTo(78, 20);

    printf("当前等级: %8d", snakeLen-3);

    GoTo(78, 23);

    printf("您的分数: %d", score);

    color(CYAN);

    printf("+%d=%d",score/3,score*3/2);

    color(YELLOW);

    GoTo(78,25);

    printf("剩余时间:%d秒",10+(snakeLen-3)*4-gametime);

    sysj=10+(snakeLen-3)*4-gametime; 

}



void DrawBoard() { //绘制墙体



    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获得输出句柄



    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; //光标信息

    SetConsoleCursorInfo(hOut, &cursor_info); //隐藏光标



    COORD size = { 120, 30 };

    SetConsoleScreenBufferSize(hOut, size); //重设缓冲区大小



    SMALL_RECT rc = { 0 , 0, 120, 30 };

    SetConsoleWindowInfo(hOut, true, &rc); //重设窗口大小



    SetConsoleTextAttribute(hOut, CYAN);



    for (int i = STARTX - 2; i <= ENDX + 2; i += 2) { //横向墙体

        GoTo(i, STARTY - 1);

        printf("■");

        GoTo(i, ENDY + 1);

        printf("■");

    }

    for (int i = STARTY - 1; i <= ENDY + 1; ++i) { //竖向墙体

        GoTo(STARTX - 2, i);

        printf("■");

        GoTo(ENDX + 2, i);

        printf("■");

    }

}

void draw()

{

    char m=snakeLen+62;

    Color(score);

    cout<<"■";

 } 

void Init() { //初始化游戏

    system("cls");

    memset(isSnake, 0, sizeof(isSnake));

    speed = 200;

    curDiraction = 4;

    score = 0;

    DrawBoard();

    InitSnake();

    ShowInformation();

    AddFood();

    mj=clock();

    point=10;

    sysj=10;

}



void RunSnake(int x, int y) { //绘制蛇身

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);

    score += snakeLen + 1;

    if (x == foodx && y == foody) {

        EartFood();

        AddFood();

        return;

    }

    snake.push_front(Node(x, y));

    isSnake[y][x] = true;

    GoTo(x, y);

    draw();

    Node back = snake.back();

    snake.pop_back();

    isSnake[back.y][back.x] = false;

    GoTo(back.x, back.y);

    printf(" ");

}



void Try(int& x, int& y) { //试走

    int key, cnt = 100;

    while (cnt--) { //多次检测键盘状态

        if (_kbhit()) {

            key = getch();

            switch (key) {

            case UP: 

                if (curDiraction == 1 || curDiraction == 2) break;

                --y; curDiraction = 1; return;

            case DOWN: 

                if (curDiraction == 1 || curDiraction == 2) break;

                ++y; curDiraction = 2; return;

            case LEFT: 

                if (curDiraction == 3 || curDiraction == 4) break;

                x -= 2; curDiraction = 3; return;

            case RIGHT: 

                if (curDiraction == 3 || curDiraction == 4) break;

                x += 2; curDiraction = 4; return;

            }

        }

    }

    if (curDiraction == 1) --y; //用户没有输入时

    else if (curDiraction == 2) ++y;

    else if (curDiraction == 3) x -= 2;

    else x += 2;

}



bool IsGoodCoord(int x, int y) { //判断光标是否合法

    if (x <= ENDX && y <= ENDY && x >= STARTX && y >= STARTY)

        return true;

    else

        return false;

}



void AddFood() { //增加食物

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);

    srand((unsigned)time(NULL));

    while (true) {

        foodx = (rand()%ENDX) + 1;

        foody = (rand()%ENDY) + 1;

        if (foodx&1) foodx++;

        if (!isSnake[foody][foodx] && IsGoodCoord(foodx, foody)) break;

    }

    GoTo(foodx, foody);

    int a=rand()%5;

    if(a>=4) 

    printf("★");

    else if(a<=1) 

    printf("○");

    else

    printf("▲");

}



void EartFood() { //吃东西

    point+=4;

    int sb=gametime=(clock()-mj)/1000;

    sysj=point-sb;

    score+=score/2;

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);

    snake.push_front(Node(foodx, foody));

    isSnake[foody][foodx] = true;

    ++snakeLen;

    if (speed >= 55) speed -= 5;



    GoTo(foodx, foody);

    draw();

    AddFood(); 

}



void InitSnake() { //初始化蛇身

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);

    snakeLen = 3, gox = 18, goy = 14;

    snake.clear();

    snake.push_front(Node(12, 14));

    snake.push_front(Node(14, 14));

    snake.push_front(Node(16, 14));

    for (int i = 12; i <= 16; i += 2) {

        GoTo(i, 14);

        draw();

        isSnake[14][i] = true;

    }

}

bool EndGame() { //结束游戏

    system("cls");

    DrawBoard();

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);

    GoTo(28, 10);

    printf("您的本局游戏得分: %d分", score);

    GoTo(32, 18);

    printf("....你挂了....");

    GoTo(27, 20);

    printf("是否继续游戏: 是(1), 否(0)");

    GoTo(27, 22);

    char key = getch();

    while (true) {

        if (key == '1') return false;

        else if (key == '0') 

        {GoTo(ENDX+1,ENDY+2);

        exit(0);return true;

        }

        else key = getch();

    }

}



bool StartGame() { //启动游戏



    Init();



    while (IsGoodCoord(gox, goy) && !isSnake[goy][gox]&&sysj>0) { //当试走合法时

        RunSnake(gox, goy);

        ShowInformation();

        Try(gox, goy);

        Sleep(speed);

    }

    InputData(); 

    return true;

}



bool GameMenu() { //游戏菜单

    system("cls");

    DrawBoard();

    GoTo(STARTX + 22, STARTY + 4);

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);

    printf("欢迎进入贪吃蛇游戏!");

    GoTo(STARTX + 24, STARTY + 10);

    printf("1: 新游戏");

    GoTo(STARTX + 24, STARTY + 12);

    printf("2: 排行榜");

    GoTo(STARTX + 24, STARTY + 14);

    printf("3: 关于游戏");

    GoTo(STARTX + 24, STARTY + 16);

    printf("4: 退出游戏");



    while (true) {

        if (_kbhit()) {

            char key = getch();

            switch (key) {

            case '1':

                if (!StartGame()) return false; 

                else return true;

            case '2':

                ShowRanking(); return true;

            case '3':

                ShowAbout(); return true;

            case '4':

                GoTo(1,ENDY+2);

                return false;

            default:

                return true;

            }

        }

    }

}



void ShowRanking() { //展示排行榜

    vector<UserData> vu;

    FILE *fp = fopen("GameData.txt", "r");

    if (fp == NULL) fp = fopen("GameData.txt", "w+");

    char name[20];

    int len = 0;

    while (fscanf(fp, "%s", name) != EOF) {

        ++len;

        int score,g=grade;

        fscanf(fp, "%d%d%d%*c", &score,&gametime,&g);

        vu.push_back(UserData(string(name), score,gametime,grade));

    }

    fclose(fp);

    sort(vu.begin(), vu.end()); //对得分进行排名

    system("cls");

    DrawBoard();

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);

    GoTo(STARTX + 8, STARTY + 2);

    printf("用户");

    GoTo(STARTX + 20, STARTY + 2);

    printf("分数");

    GoTo(STARTX + 32, STARTY + 2);

    printf("生存时间");

    GoTo(STARTX + 44, STARTY + 2);

    printf("排行");

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);



    for (int i = 0; i < len && i < 10; ++i) { //打印前十名用户数据

        char const *p = vu[i].name.c_str();

        Color(vu[i].score);

        GoTo(STARTX + 8, STARTY + 4 + i);

        printf("%s", p);

        GoTo(STARTX + 20, STARTY + 4 + i);

        printf("%d分", vu[i].score);

        GoTo(STARTX + 32, STARTY + 4 + i);

        printf("%d秒", vu[i].gt);

        GoTo(STARTX + 44, STARTY + 4 + i);

        printf(" %d", i + 1);

    }



    GoTo(STARTX + 4, ENDY - 2);

    printf("-----------------  按'1'返回游戏菜单  ---------------");

    while (true) {

        if (_kbhit()) {

            char key = getch();

            if (key == '1') break;

        }

    }

}



void ShowAbout() { //展示游戏相关

    system("cls");

    DrawBoard();

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);



    GoTo(STARTX + 4, STARTY + 2);

    printf("-------------------  贪吃蛇游戏  -------------------");

    GoTo(STARTX + 10, STARTY + 4);

    printf("制作人: ");

    GoTo(STARTX + 10, STARTY + 6);

    printf("李凯昱");

    GoTo(STARTX + 10,STARTY + 8);

    printf("贪吃蛇游戏");

    GoTo(STARTX + 10,STARTY + 10);

    printf("游戏规则:");

    GoTo(STARTX + 10,STARTY + 12);

    printf("请按 ↑ ↓ ← →  来控制您的蛇吃东西");

    GoTo(STARTX + 10,STARTY + 14);

    printf("吃的越多,蛇就越长,您的等级也将越高");

    GoTo(STARTX + 10,STARTY + 16);

    printf("当蛇吃到自己或撞上墙时,游戏结束。");



    GoTo(STARTX + 4, ENDY - 2);

    printf("-----------------  按'1'返回游戏菜单  ---------------");

    while (true) {

        if (_kbhit()) {

            char key = getch();

            if (key == '1') break;

        }

    }

}



void InputData() { //用户输入名字

    char name[20];

    if(score>=1000)

    {

    GoTo(STARTX + 10, STARTY + 10);

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RED);

    printf("请输入你的名字: ");

    COORD coord = { STARTX + 10, STARTY + 12 };

    SetConsoleCursorPosition(GetStdHandle(STD_INPUT_HANDLE), coord);

    while (true) { //忽略非法字符

        scanf("%s", name);

        if (name[0] != 0 && name[0] != ' ') break; 

    }FILE *fp = fopen("Gamedata.txt", "a");

    if (fp == NULL) fp = fopen("GameData.txt", "w+");

    fprintf(fp, "%s %d %d \n", name, score,gametime);

    fclose(fp);

    }

    else 

    {

        GoTo(STARTX + 20, STARTY + 10);

        cout<<"哟!这分数也能上榜??"<<endl; 

        Sleep(1000);

     }  

    EndGame(); 



}

 

0
0
0
吴楚安
吴楚安
新手守护
新手守护

//贪食蛇1.1

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
#include<fstream>
using namespace std;
ifstream fin("lever.txt");
ofstream fout("lever.txt");
struct node{
    int x,y;
}snake[10000]={false},food;
int point;
bool zuobi=false;
bool used[77][22]={false};
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
bool map[77][22]={false}
int m=77;
int n=22;
int way=0,df,sleep;
int snake_length=5;
bool pf=true,keep=true;
HANDLE hout =GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
void data_input()
{
    for(int i=1;i<=22;i++)
    {
        for (int j=1;j<=77;j++)
        {
            fin>>map[i][j];
        }
    }
}
int max(int x,int y)
{
    if (x>y)
    {
        return x; 
    }
    return y;
}
void is_vailid()
{
    if (snake[0].x>m||snake[0].x<1||snake[0].y>n||snake[0].y<1) keep=false; 
    if (used[snake[0].x][snake[0].y]) keep=false;
}
void game_end()
{
    system("cls");
    cout<<"game over"<<endl;
    cout<<"游戏结束"<<endl;
    cout<<"point="<<snake_length<<endl;
    cout<<"你的分数="<<snake_length<<endl;
    freopen("data.txt","r",stdin); 
    cin>>point;
    fclose(stdin); 
    cout<<"The highest in history point="<<max(snake_length,point)<<endl;
    cout<<"历史最高分="<<max(snake_length,point)<<endl;
    cout<<"按多次任意键继续.......";
    freopen("data.txt","w",stdout);
    cout<<max(snake_length,point);
    return;
}
int random_x()
{
    srand(time(0));
    return rand()%77+1;
}
int random_y()
{
    srand(time(0));
    return rand()%22+1;
}
void tp(int x,int y)
{
    coord.X=x;
    coord.Y=y;
    SetConsoleCursorPosition(hout,coord);
    return;
}
void uses_contrl()
{
    sleep=(1000/df);
        if (zuobi) snake_length++;
    if (kbhit())
        {
            char ch=getch();
            if (ch==97)
            {
                ch=getch();
                if (ch==97);
                if (ch==119)
                {
                    zuobi=not zuobi;
                    //pf=true;
                }
            }
            if (ch==102)
            {
                sleep=20;
            }
            if (ch==-32)
            {
                ch=getch();
                if (ch==72)
                {
                    if(way==0 || way==2) way=3;
                }
                if (ch==77)
                {
                    if(way==1 || way==3) way=0;
                }
                if (ch==75)
                {
                    if(way==1 || way==3) way=2;
                }
                if (ch==80)
                {
                    if(way==0 || way==2) way=1;
                }
            }
        }
//    Sleep(200);
}
void put_food()
{
    if (not pf) return;
    number0:
    food.x=random_x();
    food.y=random_y();
    if (used[food.x][food.y]) goto number0;
     tp(food.x,food.y);
    cout<<"$";    
    pf=false;
}
void move()
{
    //tp(70,20);
    //cout<<snake[0].x<<" "<<snake[0].y<<" ";
    int x = snake[snake_length-1].x;
    int y = snake[snake_length-1].y;
    tp(x,y);
    cout<<" ";
    used[x][y]=false;
    for (int i=snake_length-2;i>=0;i--)
    {
        snake[i+1]=snake[i];
    }
    snake[0].x+=dir[way][0];
    snake[0].y+=dir[way][1];
    tp(snake[0].x,snake[0].y);
    used[snake[1].x][snake[1].y]=true;
    cout<<"@";
    if (food.x==snake[0].x&&food.y==snake[0].y)
    {
        pf=true;
        snake_length++;
    }
    tp(snake[1].x,snake[1].y);
    cout<<"*";
    tp(20,23);
    cout<<"snake length="<<snake_length<<"-----------";
    cout<<"蛇长="<<snake_length;
    return;
}
void print_snake()
{
    tp(snake[0].x,snake[0].y);
    cout<<"@";
    for (int i=1;i<=snake_length-1;i++)
    {
        tp(snake[i].x,snake[i].y);
        cout<<"*";
    }
}
void print_wall()
{
    cout<<" -----------------------------------------------------------------------------"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<"|                                                                             |"<<endl;
    cout<<" ----------------------------------------------------------------------------- "<<endl;
    void data_input()
{
    for(int i=1;i<=22;i++)
    {
        for (int j=1;j<=77;j++)
        {
            if (map[i][j])
            {
                tp(i,j);
                cout<<"^";
            }
        }
    }
    return;
}   
void game_start()
{
    data_input();
    cout<<"input difficulty then enter(1~10)(1 is most easy)(10 is most difficult)"<<endl<<endl;
    cout<<"输入难度然后按下回车(1~10)(1最简单)(10最难)"<<endl<<endl; 
    cin>>df;
    sleep=(1000/df);
    system("cls");
    cout<<"the game will start in 5 second"<<endl<<endl;
    cout<<"游戏将在5秒内开始"<<endl<<endl;
    Sleep(5000);
    system("cls"); 
    print_wall();
    for (int i=0;i<=snake_length;i++)
    {
        snake[i].x=snake_length-i;
        snake[i].y=1;
    }
    print_snake();
    while(1)
    {
        uses_contrl();
        move();
        is_vailid();
        put_food();
        Sleep(sleep);
        if (not keep)
        {
            game_end();
            return; 
        }
    }
}
int main()
{
    cout<<"wellcome to paly Retro Snaker game 1.0"<<endl<<endl;
    cout<<"欢迎体验贪吃蛇小游戏1.0"<<endl<<endl; 
    cout<<"design and coding by WuChu'an"<<endl<<endl;
    cout<<"设计和编码:吴楚安"<<endl<<endl;
    cout<<"press 'o' display operation mode,press other key Continue" <<endl<<endl;
    cout<<"按'o'显示操作方式,按其它键继续"<<endl<<endl;
    while (1)
    {
        if (kbhit())
        {
            if (getch()==111)
            {
                cout<<"uses up、down、left、right key to contrl the way 'f'speed up"<<endl<<endl;
                cout<<"用上下左右键控制方向,'f'键加速."<<endl<<endl; 
                cout<<"'a'键暂停,再按一次继续。     'a' suspend press agian Continue"<<endl<<endl;
                break;
            }
            else break;
        }
    } 
//    int chose;
//    cin>>chose;
//    if(chose==1) 
    game_start();
    if (not keep) 
    { 
        getch();
        getch(); 
        getch(); 
        getch(); 
        getch(); 
        return 0;
    } 
    fclose(stdout);
    return 0;
}

 

0
我要回答