问题标题: 酷町堂:求游戏代码!!!

0
0

0
已采纳
时梓繁
时梓繁
修练者
修练者

#include<iostream> 

#include<windows.h> 

#include<conio.h> 

#include<time.h> 

#include<string> 

using namespace std; 

 

/*=============== all the structures ===============*/ 

 

typedef struct Frame 

    COORD position[2]; 

    int flag; 

}Frame; 

 

 

/*=============== all the functions ===============*/ 

 

void SetPos(COORD a)// set cursor  

    HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE); 

    SetConsoleCursorPosition(out, a); 

 

void SetPos(int i, int j)// set cursor 

    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. 冷酷的敌人"; 

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

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

    SetPos(47, 11); 

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

    SetPos(51, 13); 

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

    SetPos(24, 21); 

    cout<<"制作:LJF神犇"; 

    int j=11; 

    SetPos(12, j); 

    cout<<">>"; 

 

    //drawFrame(45, 9, 79, 17, '=', '|'); 

 

    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; 

                    } 

            } 

        } 

    } 

 

/* 

DWORD WINAPI MusicFun(LPVOID lpParamte)

{

    //DWORD OBJ;

    sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);

    return 0;

}

*/ 

 

 

/*================== 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="王牌飞行员"; 

        cout<<title; 

    } 

    rankf = rank; 

 

void Game::Playing() 

    //HANDLE MFUN; 

    //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);  

 

    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)制作:最牛的LJF"; 

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
何沐阳
何沐阳
初级光能
初级光能

#include<iostream> 

#include<windows.h> 

#include<conio.h> 

#include<time.h> 

#include<string> 

using namespace std; 

 

/*=============== all the structures ===============*/ 

 

typedef struct Frame 

    COORD position[2]; 

    int flag; 

}Frame; 

 

 

/*=============== all the functions ===============*/ 

 

void SetPos(COORD a)// set cursor  

    HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE); 

    SetConsoleCursorPosition(out, a); 

 

void SetPos(int i, int j)// set cursor 

    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. 冷酷的敌人"; 

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

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

    SetPos(47, 11); 

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

    SetPos(51, 13); 

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

    SetPos(24, 21); 

    cout<<"制作:LJF神犇"; 

    int j=11; 

    SetPos(12, j); 

    cout<<">>"; 

 

    //drawFrame(45, 9, 79, 17, '=', '|'); 

 

    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; 

                    } 

            } 

        } 

    } 

 

/* 

DWORD WINAPI MusicFun(LPVOID lpParamte)

{

    //DWORD OBJ;

    sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);

    return 0;

}

*/ 

 

 

/*================== 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="王牌飞行员"; 

        cout<<title; 

    } 

    rankf = rank; 

 

void Game::Playing() 

    //HANDLE MFUN; 

    //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);  

 

    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)制作:最牛的LJF"; 

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
何沐阳
何沐阳
初级光能
初级光能

cc#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
张梓沫
张梓沫
资深守护
资深守护

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

 

 

 

}

贪吃蛇1

#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 40
#define HEIGH 12
enum direction{//方向
LEFT,
RIGHT,
UP,
DOWN
};
struct Food{//食物
int x;
int y;
};
struct Node{//画蛇身
int x;
int y;
struct Node *next;
};
struct Snake{//蛇属性
int lenth;//长度
enum direction dir;//方向
};
struct Food *food; //食物
struct Snake *snake;//蛇属性
struct Node *snode,*tail;//蛇身
int SPEECH=200;
int score=0;//分数
int smark=0;//吃食物标记
int times=0;
int STOP=0;
void Initfood();//产生食物
void Initsnake();//构造snake
void Eatfood();//头部前进
void Addnode(int x, int y);//增加蛇身
void display(struct Node *shead);//显示蛇身坐标
void move();//蛇移动
void draw();//画蛇
void Homepage();//主页
void keybordhit();//监控键盘按键
void Addtail();//吃到食物
void gotoxy(int x, int y)//定位光标
{
    COORD pos;
    pos.X = x - 1;
    pos.Y = y - 1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void Initsnake()//构造snake
{
int i;
snake=(struct Snake*)malloc(sizeof(struct Snake));
tail=(struct Node*)malloc(sizeof(struct Node));
food = (struct Food*)malloc(sizeof(struct Food));
snake->lenth=5;//初始长度 5
snake->dir=RIGHT;//初始蛇头方向 右
for(i=2;i<=snake->lenth+2;i++)//增加 5 个结点
{
Addnode(i,2);
}
}
void Initfood()//产生食物
{
struct Node *p=snode;
int mark=1;
srand((unsigned)time(NULL));//以时间为种子产生随机数
while(1)
{
food->x=rand()%(WIDTH-2)+2;//食物X坐标
food->y=rand()%(HEIGH-2)+2;//食物Y坐标
while(p!=NULL)
{
if((food->x==p->x)&&(food->y==p->y))//如果食物产生在蛇身上
{//则重新生成食物
mark=0;//食物生成无效
break;
}
p=p->next;
}
if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物
{
gotoxy(food->x,food->y);
printf("%c",3);
break;
}
mark=1;
p=snode;
}
}
void move()//移动
{
struct Node *q, *p=snode;
if(snake->dir==RIGHT)
{
Addnode(p->x+1,p->y);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==LEFT)
{
Addnode(p->x-1,p->y);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==UP)
{
Addnode(p->x,p->y-1);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
if(snake->dir==DOWN)
{
Addnode(p->x,p->y+1);
if(smark==0)
{
while(p->next!=NULL)
{
q=p;
p=p->next;
}
q->next=NULL;
free(p);
}
}
}
void Addnode(int x, int y)//增加蛇身
{
struct Node *newnode=(struct Node *)malloc(sizeof(struct Node));
struct Node *p=snode;
newnode->next=snode;
newnode->x=x;
newnode->y=y;
snode=newnode;//结点加到蛇头
if(x<2||x>=WIDTH||y<2||y>=HEIGH)//碰到边界
{
STOP=1;
gotoxy(10,19);
printf("撞墙,游戏结束,任意键退出!\n");//失败
_getch();
free(snode);//释放内存
free(snake);
exit(0);
}
while(p!=NULL)//碰到自身
{
if(p->next!=NULL)
if((p->x==x)&&(p->y==y))
{
STOP=1;
gotoxy(10,19);
printf("撞到自身,游戏结束,任意键退出!\n");//失败
_getch();
free(snode);//释放内存
free(snake);
exit(0);
}
p=p->next;
}
}
void Eatfood()//吃到食物
{
Addtail();
score++;
}
void Addtail()//增加蛇尾
{
struct Node *newnode=(struct Node *)malloc(sizeof(struct Node));
struct Node *p=snode;
tail->next=newnode;
newnode->x=50;
newnode->y=20;
newnode->next=NULL;//结点加到蛇头
tail=newnode;//新的蛇尾
}
void draw()//画蛇
{
struct Node *p=snode;
int i,j;
while(p!=NULL)
{
gotoxy(p->x,p->y);
printf("%c",2);
tail=p;
p=p->next;
}
if(snode->x==food->x&&snode->y==food->y)//蛇头坐标等于食物坐标
{
smark=1;
Eatfood();//增加结点
Initfood();//产生食物
}
if(smark==0)
{
gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点
printf("%c",' ');//如果吃到食物,不清楚尾结点
}
else
{
times=1;
}
if((smark==1)&&(times==1))
{
gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点
printf("%c",' ');//如果吃到食物,不清楚尾结点
smark=0;
}
gotoxy(50,12);
printf("食物: %d,%d",food->x,food->y);
gotoxy(50,5);
printf("分数: %d",score);
gotoxy(50,7);
printf("速度: %d",SPEECH);
gotoxy(15,14);
printf("按o键加速");
gotoxy(15,15);
printf("按p键减速");
gotoxy(15,16);
printf("按空格键暂停");
}
void HideCursor()//隐藏光标
{
 CONSOLE_CURSOR_INFO cursor_info = {1, 0};
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void Homepage()//绘主页
{
int x,y;
HideCursor();//隐藏光标
printf("----------------------------------------\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("|\t\t\t\t       |\n");
printf("----------------------------------------\n");
gotoxy(5,13);
printf("任意键开始游戏!按W.A.S.D控制方向");
_getch();
Initsnake();
Initfood();
gotoxy(5,13);
printf("                                ");
}
void keybordhit()//监控键盘
{
char ch;
if(_kbhit())
{
ch=getch();
switch(ch)
{
case 'W':
case 'w':if(snake->dir==DOWN)//如果本来方向是下,而按相反方向无效
{
 break;
}
else
snake->dir=UP;break;
case 'A':
case 'a':if(snake->dir==RIGHT)//如果本来方向是右,而按相反方向无效
{
 break;
}
else
snake->dir=LEFT;break;
case 'S':
case 's':if(snake->dir==UP)//如果本来方向是上,而按相反方向无效
{
 break;
}
else
snake->dir=DOWN;break;
case 'D':
case 'd':if(snake->dir==LEFT)//如果本来方向是左,而按相反方向无效
{
 break;
}
else
snake->dir=RIGHT;break;
case 'O':
case 'o':
if(SPEECH>=150)//速度加快
{
SPEECH=SPEECH-50;
}
break;
case 'P':
case 'p':
if(SPEECH<=400)//速度减慢
{
SPEECH=SPEECH+50;
}
break;
case ' '://暂停
gotoxy(15,18);
printf("游戏已暂停,按任意键恢复游戏");
system("pause>nul");
gotoxy(15,18);
printf("                           ");
break;
default:break;
}
}
}
int main(void)//程序入口
{
Homepage();
while(!STOP)
{
keybordhit();//监控键盘按键
move();//蛇的坐标变化
draw();//蛇的重绘
Sleep(SPEECH);//暂时挂起线程
}
return 0;
}贪吃蛇2

#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
// 刷新当前屏幕
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     //  清屏
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }
 
        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}贪吃蛇3

#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;
    }俄罗斯方块1

#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
using namespace std;
int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };
 
void initialWindow(HANDLE hOut);//初始化窗口
void initialPrint(HANDLE hOut);//初始化界面
void gotoXY(HANDLE hOut, int x, int y);//移动光标
void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
int main()
{
    int map[21][12];
    int blockA[4][4];//候选区的方块
    int blockB[4][4];//下落中的方块
    int positionX, positionY;//方块左上角的坐标
    bool check;//检查方块还能不能下落
    char key;//用来存储按键
    int val;//用来控制下落速度
    int fraction;//用来存储得分
    int checkpoint;//用来存储关卡
    int times;
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
    initialWindow(hOut);
initial:
    gotoXY(hOut, 0, 0);
    initialPrint(hOut);
    check = true;
    val = 50;
    fraction = 0;
    checkpoint = 1;
    times = val;
    for (int i = 0; i < 20; ++i)
    {
        for (int j = 1; j < 11; ++j)
        {
            map[i][j] = 0;
        }
    }
    for (int i = 0; i < 20; ++i)
    {
        map[i][0] = map[i][11] = 1;
    }
    for (int i = 0; i < 12; ++i)
    {
        map[20][i] = 1;
    }
 
    srand((unsigned)time(NULL));
    roundBlock(hOut, blockA);
    while (true)
    {
        if (check)
        {
            eliminateRow(hOut, map, val, fraction, checkpoint);
            check = false;
            positionX = -3;
            positionY = 4;
            if (collisionDetection(blockA, map, positionX, positionY))
            {
                for (int i = 0; i < 4; ++i)
                {
                    for (int j = 0; j < 4; ++j)
                    {
                        blockB[i][j] = blockA[i][j];
                    }
                }
                roundBlock(hOut, blockA);
            }
            else
            {
                gameOver(hOut, blockA, map);
                goto initial;
            }
        }
        printBlock(hOut, blockB, positionX, positionY);
        if (_kbhit())
        {
            key = _getch();
            switch (key)
            {
            case 72:
                myUp(hOut, blockB, map, positionX, positionY);
                break;
            case 75:
                myLeft(hOut, blockB, map, positionX, positionY);
                break;
            case 77:
                myRight(hOut, blockB, map, positionX, positionY);
                break;
            case 80:
                switch (myDown(hOut, blockB, map, positionX, positionY))
                {
                case 0:
                    check = false;
                    break;
                case 1:
                    check = true;
                    break;
                case 2:
                    gameOver(hOut, blockB, map);
                    goto initial;
                default:
                    break;
                }
                break;
            case 32:
                myStop(hOut, blockA);
                break;
            case 27:
                exit(0);
            default:
                break;
            }
        }
        Sleep(20);
        if (0 == --times)
        {
            switch (myDown(hOut, blockB, map, positionX, positionY))
            {
            case 0:
                check = false;
                break;
            case 1:
                check = true;
                break;
            case 2:
                gameOver(hOut, blockB, map);
                goto initial;
            default:
                break;
            }
            times = val;
        }
    }
    cin.get();
    return 0;
}
 
void initialWindow(HANDLE hOut)
{
    SetConsoleTitle("俄罗斯方块");
    COORD size = { 80, 25 };
    SetConsoleScreenBufferSize(hOut, size);
    SMALL_RECT rc = { 0, 0, 79, 24 };
    SetConsoleWindowInfo(hOut, true, &rc);
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(hOut, &cursor_info);
}
 
void initialPrint(HANDLE hOut)
{
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    for (int i = 0; i < 20; ++i)
    {
        cout << "■                    ■☆                      ☆" << endl;
    }
    gotoXY(hOut, 26, 0);
    cout << "☆☆☆☆☆☆☆☆☆☆☆";
    gotoXY(hOut, 0, 20);
    cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
    gotoXY(hOut, 26, 1);
    cout << "分    数:      ";
    gotoXY(hOut, 26, 2);
    cout << "关    卡:      ";
    gotoXY(hOut, 26, 4);
    cout << "下一方块:";
    gotoXY(hOut, 26, 9);
    cout << "操作方法:";
    gotoXY(hOut, 30, 11);
    cout << "↑:旋转 ↓:速降";
    gotoXY(hOut, 30, 12);
    cout << "→:右移 ←:左移";
    gotoXY(hOut, 30, 13);
    cout << "空格键:开始/暂停";
    gotoXY(hOut, 30, 14);
    cout << "Esc 键:退出";
    gotoXY(hOut, 26, 16);
    cout << "关    于:";
    gotoXY(hOut, 30, 18);
    cout << "俄罗斯方块V1.0";
    gotoXY(hOut, 35, 19);
    cout << "作者:徐云皓";
}
 
void gotoXY(HANDLE hOut, int x, int y)
{
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hOut, pos);
}
 
void roundBlock(HANDLE hOut, int block[4][4])
{
    clearBlock(hOut, block, 5, 15);
    switch (rand() % 19)
    {
    case 0:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block00[i][j];
            }
        }
        break;
    case 1:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block01[i][j];
            }
        }
        break;
    case 2:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block02[i][j];
            }
        }
        break;
    case 3:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block03[i][j];
            }
        }
        break;
    case 4:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block04[i][j];
            }
        }
        break;
    case 5:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block05[i][j];
            }
        }
        break;
    case 6:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block06[i][j];
            }
        }
        break;
    case 7:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block07[i][j];
            }
        }
        break;
    case 8:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block08[i][j];
            }
        }
        break;
    case 9:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block09[i][j];
            }
        }
        break;
    case 10:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block10[i][j];
            }
        }
        break;
    case 11:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block11[i][j];
            }
        }
        break;
    case 12:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block12[i][j];
            }
        }
        break;
    case 13:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block13[i][j];
            }
        }
        break;
    case 14:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block14[i][j];
            }
        }
        break;
    case 15:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block15[i][j];
            }
        }
        break;
    case 16:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block16[i][j];
            }
        }
        break;
    case 17:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block17[i][j];
            }
        }
        break;
    case 18:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block18[i][j];
            }
        }
        break;
    default:
        break;
    }
    printBlock(hOut, block, 5, 15);
}
 
bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
{
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1)
            {
                return false;
            }
        }
    }
    return true;
}
 
void printBlock(HANDLE hOut, int block[4][4], int x, int y)
{
    switch (block[0][0])
    {
    case 10:
    case 11:
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
        break;
    case 12:
    case 13:
    case 14:
    case 15:
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 16:
    case 17:
    case 18:
    case 19:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 20:
    case 21:
    case 22:
    case 23:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
        break;
    case 24:
    case 25:
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 26:
    case 27:
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
        break;
    case 28:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
        break;
    default:
        break;
    }
    for (int i = 0; i < 4; ++i)
    {
        if (i + x >= 0)
        {
            for (int j = 0; j < 4; ++j)
            {
                if (block[i][j] == 1)
                {
 
                    gotoXY(hOut, 2 * (y + j), x + i);
                    cout << "■";
                }
            }
        }
    }
}
 
void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
{
    for (int i = 0; i < 4; ++i)
    {
        if (i + x >= 0)
        {
            for (int j = 0; j < 4; ++j)
            {
                if (block[i][j] == 1)
                {
                    gotoXY(hOut, 2 * (y + j), x + i);
                    cout << "  ";
                }
            }
        }
    }
}
 
void gameOver(HANDLE hOut, int block[4][4], int map[21][12])
{
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoXY(hOut, 9, 8);
    cout << "GAME OVER";
    gotoXY(hOut, 8, 9);
    cout << "空格键:重来";
    gotoXY(hOut, 8, 10);
    cout << "ESC键:退出";
    char key;
    while (true)
    {
        key = _getch();
        if (key == 32)
        {
            return;
        }
        if (key == 27)
        {
            exit(0);
        }
    }
}
 
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
{
    if (collisionDetection(block, map, x + 1, y))
    {
        clearBlock(hOut, block, x, y);
        ++x;
        return 0;
    }
    if (x < 0)
    {
        return 2;
    }
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            if (block[i][j] == 1)
            {
                map[x + i][y + j] = 1;
                SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
                gotoXY(hOut, 2 * (y + j), x + i);
                cout << "■";
            }
        }
    }
    return 1;
}
 
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    if (collisionDetection(block, map, x, y - 1))
    {
        clearBlock(hOut, block, x, y);
        --y;
    }
}
 
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    if (collisionDetection(block, map, x, y + 1))
    {
        clearBlock(hOut, block, x, y);
        ++y;
    }
}
 
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    switch (block[0][0])
    {
    case 10:
        if (collisionDetection(block01, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block01[i][j];
                }
            }
        }
        break;
    case 11:
        if (collisionDetection(block00, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
        }
        else if (collisionDetection(block00, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block00, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            ++y;
        }
        else if (collisionDetection(block00, map, x, y - 2))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            y = y - 2;
        }
        else if (collisionDetection(block00, map, x, y + 2))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            y = y + 2;
        }
        break;
    case 12:
        if (collisionDetection(block03, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
        }
        else if (collisionDetection(block03, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block03, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
            ++y;
        }
        break;
    case 13:
        if (collisionDetection(block04, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
        }
        else if (collisionDetection(block04, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block04, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
            ++y;
        }
        break;
    case 14:
        if (collisionDetection(block05, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
        }
        else if (collisionDetection(block05, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block05, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
            ++y;
        }
        break;
    case 15:
        if (collisionDetection(block02, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
        }
        else if (collisionDetection(block02, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block02, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
            ++y;
        }
        break;
 
    case 16:
        if (collisionDetection(block07, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
        }
        else if (collisionDetection(block07, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block07, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
            ++y;
        }
        break;
    case 17:
        if (collisionDetection(block08, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
        }
        else if (collisionDetection(block08, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block08, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
            ++y;
        }
        break;
    case 18:
        if (collisionDetection(block09, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
        }
        else if (collisionDetection(block09, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block09, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
            ++y;
        }
        break;
    case 19:
        if (collisionDetection(block06, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
        }
        else if (collisionDetection(block06, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block06, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
            ++y;
        }
        break;
    case 20:
        if (collisionDetection(block11, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
        }
        else if (collisionDetection(block11, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block11, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
            ++y;
        }
        break;
    case 21:
        if (collisionDetection(block12, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
        }
        else if (collisionDetection(block12, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block12, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
            ++y;
        }
        break;
    case 22:
        if (collisionDetection(block13, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
        }
        else if (collisionDetection(block13, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block13, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
            ++y;
        }
        break;
    case 23:
        if (collisionDetection(block10, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
        }
        else if (collisionDetection(block10, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block10, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
            ++y;
        }
        break;
    case 24:
        if (collisionDetection(block15, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
        }
        else if (collisionDetection(block15, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block15, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
            ++y;
        }
        break;
    case 25:
        if (collisionDetection(block14, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
        }
        else if (collisionDetection(block14, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block14, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
            ++y;
        }
        break;
    case 26:
        if (collisionDetection(block17, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
        }
        else if (collisionDetection(block17, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block17, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
            ++y;
        }
        break;
    case 27:
        if (collisionDetection(block16, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
        }
        else if (collisionDetection(block16, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block16, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
            ++y;
        }
        break;
    default:
        break;
    }
}
 
void myStop(HANDLE hOut, int block[4][4])
{
    clearBlock(hOut, block, 5, 15);
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoXY(hOut, 30, 7);
    cout << "游戏暂停";
    char key;
    while (true)
    {
        key = _getch();
        if (key == 32)
        {
            gotoXY(hOut, 30, 7);
            cout << "        ";
            printBlock(hOut, block, 5, 15);
            return;
        }
        if (key == 27)
        {
            exit(0);
        }
    }
}
 
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
{
    SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    for (int i = 19; i >= 0; --i)
    {
        int x = 0;
        for (int j = 1; j < 11; ++j)
        {
            x += map[i][j];
        }
        if (x == 10)
        {
            fraction += 100;
            if (val > 1 && fraction / 1000 + 1 != checkpoint)
            {
                checkpoint = fraction / 1000 + 1;
                val -= 5;
            }
            for (int m = i; m > 0; --m)
            {
                for (int n = 1; n < 11; ++n)
                {
                    map[m][n] = map[m - 1][n];
                    gotoXY(hOut, 2 * n, m);
                    if (map[m][n] == 1)
                    {
                        cout << "■";
                    }
                    else
                    {
                        cout << "  ";
                    }
                }
            }
            ++i;
        }
    }
    gotoXY(hOut, 36, 1);
    cout << fraction;
    gotoXY(hOut, 36, 2);
    cout << checkpoint;
}#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
using namespace std;
int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };
 
void initialWindow(HANDLE hOut);//初始化窗口
void initialPrint(HANDLE hOut);//初始化界面
void gotoXY(HANDLE hOut, int x, int y);//移动光标
void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
int main()
{
    int map[21][12];
    int blockA[4][4];//候选区的方块
    int blockB[4][4];//下落中的方块
    int positionX, positionY;//方块左上角的坐标
    bool check;//检查方块还能不能下落
    char key;//用来存储按键
    int val;//用来控制下落速度
    int fraction;//用来存储得分
    int checkpoint;//用来存储关卡
    int times;
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
    initialWindow(hOut);
initial:
    gotoXY(hOut, 0, 0);
    initialPrint(hOut);
    check = true;
    val = 50;
    fraction = 0;
    checkpoint = 1;
    times = val;
    for (int i = 0; i < 20; ++i)
    {
        for (int j = 1; j < 11; ++j)
        {
            map[i][j] = 0;
        }
    }
    for (int i = 0; i < 20; ++i)
    {
        map[i][0] = map[i][11] = 1;
    }
    for (int i = 0; i < 12; ++i)
    {
        map[20][i] = 1;
    }
 
    srand((unsigned)time(NULL));
    roundBlock(hOut, blockA);
    while (true)
    {
        if (check)
        {
            eliminateRow(hOut, map, val, fraction, checkpoint);
            check = false;
            positionX = -3;
            positionY = 4;
            if (collisionDetection(blockA, map, positionX, positionY))
            {
                for (int i = 0; i < 4; ++i)
                {
                    for (int j = 0; j < 4; ++j)
                    {
                        blockB[i][j] = blockA[i][j];
                    }
                }
                roundBlock(hOut, blockA);
            }
            else
            {
                gameOver(hOut, blockA, map);
                goto initial;
            }
        }
        printBlock(hOut, blockB, positionX, positionY);
        if (_kbhit())
        {
            key = _getch();
            switch (key)
            {
            case 72:
                myUp(hOut, blockB, map, positionX, positionY);
                break;
            case 75:
                myLeft(hOut, blockB, map, positionX, positionY);
                break;
            case 77:
                myRight(hOut, blockB, map, positionX, positionY);
                break;
            case 80:
                switch (myDown(hOut, blockB, map, positionX, positionY))
                {
                case 0:
                    check = false;
                    break;
                case 1:
                    check = true;
                    break;
                case 2:
                    gameOver(hOut, blockB, map);
                    goto initial;
                default:
                    break;
                }
                break;
            case 32:
                myStop(hOut, blockA);
                break;
            case 27:
                exit(0);
            default:
                break;
            }
        }
        Sleep(20);
        if (0 == --times)
        {
            switch (myDown(hOut, blockB, map, positionX, positionY))
            {
            case 0:
                check = false;
                break;
            case 1:
                check = true;
                break;
            case 2:
                gameOver(hOut, blockB, map);
                goto initial;
            default:
                break;
            }
            times = val;
        }
    }
    cin.get();
    return 0;
}
 
void initialWindow(HANDLE hOut)
{
    SetConsoleTitle("俄罗斯方块");
    COORD size = { 80, 25 };
    SetConsoleScreenBufferSize(hOut, size);
    SMALL_RECT rc = { 0, 0, 79, 24 };
    SetConsoleWindowInfo(hOut, true, &rc);
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    SetConsoleCursorInfo(hOut, &cursor_info);
}
 
void initialPrint(HANDLE hOut)
{
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    for (int i = 0; i < 20; ++i)
    {
        cout << "■                    ■☆                      ☆" << endl;
    }
    gotoXY(hOut, 26, 0);
    cout << "☆☆☆☆☆☆☆☆☆☆☆";
    gotoXY(hOut, 0, 20);
    cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
    gotoXY(hOut, 26, 1);
    cout << "分    数:      ";
    gotoXY(hOut, 26, 2);
    cout << "关    卡:      ";
    gotoXY(hOut, 26, 4);
    cout << "下一方块:";
    gotoXY(hOut, 26, 9);
    cout << "操作方法:";
    gotoXY(hOut, 30, 11);
    cout << "↑:旋转 ↓:速降";
    gotoXY(hOut, 30, 12);
    cout << "→:右移 ←:左移";
    gotoXY(hOut, 30, 13);
    cout << "空格键:开始/暂停";
    gotoXY(hOut, 30, 14);
    cout << "Esc 键:退出";
    gotoXY(hOut, 26, 16);
    cout << "关    于:";
    gotoXY(hOut, 30, 18);
    cout << "俄罗斯方块V1.0";
    gotoXY(hOut, 35, 19);
    cout << "作者:徐云皓";
}
 
void gotoXY(HANDLE hOut, int x, int y)
{
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hOut, pos);
}
 
void roundBlock(HANDLE hOut, int block[4][4])
{
    clearBlock(hOut, block, 5, 15);
    switch (rand() % 19)
    {
    case 0:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block00[i][j];
            }
        }
        break;
    case 1:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block01[i][j];
            }
        }
        break;
    case 2:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block02[i][j];
            }
        }
        break;
    case 3:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block03[i][j];
            }
        }
        break;
    case 4:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block04[i][j];
            }
        }
        break;
    case 5:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block05[i][j];
            }
        }
        break;
    case 6:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block06[i][j];
            }
        }
        break;
    case 7:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block07[i][j];
            }
        }
        break;
    case 8:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block08[i][j];
            }
        }
        break;
    case 9:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block09[i][j];
            }
        }
        break;
    case 10:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block10[i][j];
            }
        }
        break;
    case 11:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block11[i][j];
            }
        }
        break;
    case 12:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block12[i][j];
            }
        }
        break;
    case 13:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block13[i][j];
            }
        }
        break;
    case 14:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block14[i][j];
            }
        }
        break;
    case 15:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block15[i][j];
            }
        }
        break;
    case 16:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block16[i][j];
            }
        }
        break;
    case 17:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block17[i][j];
            }
        }
        break;
    case 18:
        for (int i = 0; i < 4; ++i)
        {
            for (int j = 0; j < 4; ++j)
            {
                block[i][j] = block18[i][j];
            }
        }
        break;
    default:
        break;
    }
    printBlock(hOut, block, 5, 15);
}
 
bool collisionDetection(int block[4][4], int map[21][12], int x, int y)
{
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1)
            {
                return false;
            }
        }
    }
    return true;
}
 
void printBlock(HANDLE hOut, int block[4][4], int x, int y)
{
    switch (block[0][0])
    {
    case 10:
    case 11:
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
        break;
    case 12:
    case 13:
    case 14:
    case 15:
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 16:
    case 17:
    case 18:
    case 19:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 20:
    case 21:
    case 22:
    case 23:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
        break;
    case 24:
    case 25:
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        break;
    case 26:
    case 27:
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
        break;
    case 28:
        SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
        break;
    default:
        break;
    }
    for (int i = 0; i < 4; ++i)
    {
        if (i + x >= 0)
        {
            for (int j = 0; j < 4; ++j)
            {
                if (block[i][j] == 1)
                {
 
                    gotoXY(hOut, 2 * (y + j), x + i);
                    cout << "■";
                }
            }
        }
    }
}
 
void clearBlock(HANDLE hOut, int block[4][4], int x, int y)
{
    for (int i = 0; i < 4; ++i)
    {
        if (i + x >= 0)
        {
            for (int j = 0; j < 4; ++j)
            {
                if (block[i][j] == 1)
                {
                    gotoXY(hOut, 2 * (y + j), x + i);
                    cout << "  ";
                }
            }
        }
    }
}
 
void gameOver(HANDLE hOut, int block[4][4], int map[21][12])
{
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoXY(hOut, 9, 8);
    cout << "GAME OVER";
    gotoXY(hOut, 8, 9);
    cout << "空格键:重来";
    gotoXY(hOut, 8, 10);
    cout << "ESC键:退出";
    char key;
    while (true)
    {
        key = _getch();
        if (key == 32)
        {
            return;
        }
        if (key == 27)
        {
            exit(0);
        }
    }
}
 
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y)
{
    if (collisionDetection(block, map, x + 1, y))
    {
        clearBlock(hOut, block, x, y);
        ++x;
        return 0;
    }
    if (x < 0)
    {
        return 2;
    }
    for (int i = 0; i < 4; ++i)
    {
        for (int j = 0; j < 4; ++j)
        {
            if (block[i][j] == 1)
            {
                map[x + i][y + j] = 1;
                SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
                gotoXY(hOut, 2 * (y + j), x + i);
                cout << "■";
            }
        }
    }
    return 1;
}
 
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    if (collisionDetection(block, map, x, y - 1))
    {
        clearBlock(hOut, block, x, y);
        --y;
    }
}
 
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    if (collisionDetection(block, map, x, y + 1))
    {
        clearBlock(hOut, block, x, y);
        ++y;
    }
}
 
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y)
{
    switch (block[0][0])
    {
    case 10:
        if (collisionDetection(block01, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block01[i][j];
                }
            }
        }
        break;
    case 11:
        if (collisionDetection(block00, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
        }
        else if (collisionDetection(block00, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block00, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            ++y;
        }
        else if (collisionDetection(block00, map, x, y - 2))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            y = y - 2;
        }
        else if (collisionDetection(block00, map, x, y + 2))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block00[i][j];
                }
            }
            y = y + 2;
        }
        break;
    case 12:
        if (collisionDetection(block03, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
        }
        else if (collisionDetection(block03, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block03, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block03[i][j];
                }
            }
            ++y;
        }
        break;
    case 13:
        if (collisionDetection(block04, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
        }
        else if (collisionDetection(block04, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block04, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block04[i][j];
                }
            }
            ++y;
        }
        break;
    case 14:
        if (collisionDetection(block05, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
        }
        else if (collisionDetection(block05, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block05, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block05[i][j];
                }
            }
            ++y;
        }
        break;
    case 15:
        if (collisionDetection(block02, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
        }
        else if (collisionDetection(block02, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block02, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block02[i][j];
                }
            }
            ++y;
        }
        break;
 
    case 16:
        if (collisionDetection(block07, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
        }
        else if (collisionDetection(block07, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block07, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block07[i][j];
                }
            }
            ++y;
        }
        break;
    case 17:
        if (collisionDetection(block08, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
        }
        else if (collisionDetection(block08, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block08, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block08[i][j];
                }
            }
            ++y;
        }
        break;
    case 18:
        if (collisionDetection(block09, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
        }
        else if (collisionDetection(block09, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block09, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block09[i][j];
                }
            }
            ++y;
        }
        break;
    case 19:
        if (collisionDetection(block06, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
        }
        else if (collisionDetection(block06, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block06, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block06[i][j];
                }
            }
            ++y;
        }
        break;
    case 20:
        if (collisionDetection(block11, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
        }
        else if (collisionDetection(block11, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block11, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block11[i][j];
                }
            }
            ++y;
        }
        break;
    case 21:
        if (collisionDetection(block12, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
        }
        else if (collisionDetection(block12, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block12, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block12[i][j];
                }
            }
            ++y;
        }
        break;
    case 22:
        if (collisionDetection(block13, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
        }
        else if (collisionDetection(block13, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block13, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block13[i][j];
                }
            }
            ++y;
        }
        break;
    case 23:
        if (collisionDetection(block10, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
        }
        else if (collisionDetection(block10, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block10, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block10[i][j];
                }
            }
            ++y;
        }
        break;
    case 24:
        if (collisionDetection(block15, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
        }
        else if (collisionDetection(block15, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block15, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block15[i][j];
                }
            }
            ++y;
        }
        break;
    case 25:
        if (collisionDetection(block14, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
        }
        else if (collisionDetection(block14, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block14, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block14[i][j];
                }
            }
            ++y;
        }
        break;
    case 26:
        if (collisionDetection(block17, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
        }
        else if (collisionDetection(block17, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block17, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block17[i][j];
                }
            }
            ++y;
        }
        break;
    case 27:
        if (collisionDetection(block16, map, x, y))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
        }
        else if (collisionDetection(block16, map, x, y - 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
            --y;
        }
        else if (collisionDetection(block16, map, x, y + 1))
        {
            clearBlock(hOut, block, x, y);
            for (int i = 0; i < 4; ++i)
            {
                for (int j = 0; j < 4; ++j)
                {
                    block[i][j] = block16[i][j];
                }
            }
            ++y;
        }
        break;
    default:
        break;
    }
}
 
void myStop(HANDLE hOut, int block[4][4])
{
    clearBlock(hOut, block, 5, 15);
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    gotoXY(hOut, 30, 7);
    cout << "游戏暂停";
    char key;
    while (true)
    {
        key = _getch();
        if (key == 32)
        {
            gotoXY(hOut, 30, 7);
            cout << "        ";
            printBlock(hOut, block, 5, 15);
            return;
        }
        if (key == 27)
        {
            exit(0);
        }
    }
}
 
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint)
{
    SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    for (int i = 19; i >= 0; --i)
    {
        int x = 0;
        for (int j = 1; j < 11; ++j)
        {
            x += map[i][j];
        }
        if (x == 10)
        {
            fraction += 100;
            if (val > 1 && fraction / 1000 + 1 != checkpoint)
            {
                checkpoint = fraction / 1000 + 1;
                val -= 5;
            }
            for (int m = i; m > 0; --m)
            {
                for (int n = 1; n < 11; ++n)
                {
                    map[m][n] = map[m - 1][n];
                    gotoXY(hOut, 2 * n, m);
                    if (map[m][n] == 1)
                    {
                        cout << "■";
                    }
                    else
                    {
                        cout << "  ";
                    }
                }
            }
            ++i;
        }
    }
    gotoXY(hOut, 36, 1);
    cout << fraction;
    gotoXY(hOut, 36, 2);
    cout << checkpoint;
}俄罗斯方块2

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#include<windows.h>

struct player

    {

        char allname[20];

        int money,dangqian;

        int fangchan[5][19];

        char name;

        int hours;

        int days;

        int turns;

    }p1,p2;

int main(void)

{

    FILE *fp;

    int shijian(int a);

    int qipan(char weizhi[28]);

    int qianjin(int qianjinbs,int dangqian,char weizhi[28],char name);

    int houtui(int houtuibs,int dangqian,char weizhi[28],char name);

    int renpin(int money);

    int duchang(int money);

    int meiqian(int money);

    int houtuibs;

    int choice;

    int qianjinbs;

    int m,n,p,q;

    int a,b,c;

    char weizhi[28]="                          ";

    int fang(int turns);

    srand( (unsigned)time( NULL ) );

    p1.turns=1;

    p1.hours=0;

    p1.days=0;

    p1.dangqian=0;

    p2.dangqian=0;

    b=0;

    p1.money=5000;

    p2.money=5000;

    printf("欢迎来到大富翁的世界!!大富翁的世界有你更精彩!!!\n");

    printf("1.新的旅程\n2.旧的回忆\n");

    scanf("%d",&a);

    if (a==2)

    {

        printf("请输入存档时1p的名字:\n");

        getchar();

        gets(p1.allname);

        printf("%s", p1.allname);

        fp=fopen(p1.allname,"rb");

        fread(&p1,sizeof(struct player),1,fp);

        fread(&p2,sizeof(struct player),1,fp);

        fclose(fp);

        goto turn;

    }

    printf("输入1p的名字(注意首字母最好为英文):\n");

    scanf("%d",&a);

    gets(p1.allname);

    p1.name=1;

    printf("输入2P的名字(注意首字母最好为英文): \n");

    scanf("%d",&a);

    gets(p2.allname);

    p2.name=2;

    turn:

    if (p1.turns)

    {

        system("cls");

     weizhi[p1.dangqian]=1;

     weizhi[p2.dangqian]=2;

    qipan(weizhi);

    printf("第%d天\n",p1.days);

        if (p1.money<500)

    {

        printf("身份:贫民:   ");

    }

        else if (p1.money<10000)

    {

        printf("身份:平民:   ");

    }

    else if (p1.money<20000)

    {

        printf("身份:小资:   ");

    }

    else if (p1.money<50000)

    {

        printf("身份:富人:   ");

    }

    else if (p1.money<500000)

    {

        printf("身份:土豪:   ");

    }

    else

    {

        printf("身份:首富:   ");

    }

    puts(p1.allname);

    printf("金钱:%d\n",p1.money);

    weizhi[p1.dangqian]=' ';

    printf("请选择操作:0.存档         1.查看个人房产       2.前进\n");

    scanf("%d",&choice);

    if (choice==0)

    {

        fp=fopen(p1.allname,"wb");

        fwrite(&p1,sizeof(struct player),1,fp);

        fwrite(&p2,sizeof(struct player),1,fp);

        fclose(fp);

        goto turn;

    }

    else if (choice==1)

    {

        for (a=0;a<=19;a++)

        {

            if (p1.fangchan[0][a]==1)

            {

                switch (a)

                {

                case 0:printf("火星大道1号\n");b=1;break;

                case 1:printf("火星大道2号\n");b=1;break;

                case 2:printf("解放路1号\n");b=1;break;

                case 3:printf("解放路2号\n");b=1;break;

                case 4:printf("解放路3号\n");b=1;break;

                case 5:printf("解放路4号\n");b=1;break;

                case 6:printf("解放路5号\n");b=1;break;

                case 7:printf("花炮大道1号\n");b=1;break;

                case 8:printf("花炮大道2号\n");b=1;break;

                case 9:printf("花炮大道3号\n");b=1;break;

                case 10:printf("花炮大道4号\n");b=1;break;

                case 11:printf("花炮大道5号\n");b=1;break;

                case 12:printf("花炮大道6号\n");b=1;break;

                case 13:printf("花炮大道7号\n");b=1;break;

                case 14:printf("花炮大道8号\n");b=1;break;

                case 15:printf("花炮大道9号\n");b=1;break;

                case 16:printf("桂花路1号\n");b=1;break;

                case 17:printf("桂花路2号\n");b=1;break;

                case 18:printf("桂花路3号\n");b=1;break;

                default:break;

                }

                if (b==1)

                {

                    if (p1.fangchan[1][a]==1)

                    {

                        printf("建设旅馆一座:\n");

                        printf("旅馆等级:%d星级\n",p1.fangchan[2][a]);

                        printf("每次停留收取费用:%d\n",p1.fangchan[3][a]);

                        printf("\n");

                    }

                    else if(p1.fangchan[1][a]==2)

                    {

                        printf("建设商店一座:\n");

                        switch (p1.fangchan[2][a])

                        {

                        case 1:printf("等级:小卖部\n");break;

                        case 2:printf("等级:商店\n");break;

                        case 3:printf("等级:超市\n");break;

                        case 4:printf("等级:全国连锁超市\n");break;

                        case 5:printf("等级:世界连锁贸易市场\n");break;

                        default:break;

                        }

                        printf("每回合收入为:%d",p1.fangchan[4][a]);

                        printf("\n");

                    }

                    else

                    {

                        printf("仅有地皮一份。\n");

                    }

                }

            }

        }

        system("pause");

        goto turn;

    }

    else if (choice==9)

    {

        qianjinbs=1;

        goto miji;

    }

    else

    {

        shijian(12);

        if (p1.days>=100)

    {

        goto end;

    }

        qianjinbs=rand()%6;

        qianjinbs=qianjinbs+1;

miji:printf("你投出了%d点!",qianjinbs);

        p1.dangqian=qianjin(qianjinbs,p1.dangqian,weizhi,p1.name);

jintui:switch (p1.dangqian)

        {

        case 0:printf("停在起点奖励1000!\n");p1.money+=1000;system("pause");break;

        case 3:printf("前进三格!\n");c=3;p1.dangqian=qianjin(c,p1.dangqian,weizhi,p1.name);goto jintui;

        case 9:printf("进入人品驿站~~考验人品的时候到了!\n");Sleep(1000);p1.money=renpin(p1.money);;break;

        case 16:printf("后退两格!\n");c=2;p1.dangqian=houtui(c,p1.dangqian,weizhi,p1.name);goto jintui;

        case 20:{printf("进入赌场!!\n");

            Sleep(500);

            p1.money=duchang(p1.money);

            if (p1.days>=100)

    {

        goto end;

    }

            break;}

        case 21:printf("前进两格!\n");c=2;p1.dangqian=qianjin(c,p1.dangqian,weizhi,p1.name);goto jintui;

        case 22:printf("进入人品驿站~~考验人品的时候到了!\n");Sleep(1000);p1.money=renpin(p1.money);;break;

        default:fang(p1.turns);break;

        }

         system("cls");

         weizhi[p1.dangqian]=1;

         qipan(weizhi);

        weizhi[p1.dangqian]=' ';

        for (b=1,a=0;a<=18;a++)

        {

        if (p1.fangchan[1][a]==2)

        {

            printf("%d号商店收益:%d  ",a,p1.fangchan[4][a]);

            p1.money=p1.money+p1.fangchan[4][a];

            b++;

            if (b==4)

            {

                printf("\n");

                b=1;

            }

        }

        }

        system("pause");

        p1.turns=0;

        goto turn;

    }

    }

    else

    {

        system("cls");

     weizhi[p1.dangqian]=1;

     weizhi[p2.dangqian]=2;

    qipan(weizhi);

    printf("第%d天\n",p1.days);

        if (p2.money<500)

    {

        printf("身份:贫民:   ");

    }

        else if (p2.money<10000)

    {

        printf("身份:平民:   ");

    }

    else if (p2.money<20000)

    {

        printf("身份:小资:   ");

    }

    else if (p2.money<50000)

    {

        printf("身份:富人:   ");

    }

    else if (p2.money<500000)

    {

        printf("身份:土豪:   ");

    }

    else

    {

        printf("身份:首富:   ");

    }

    puts(p2.allname);

    printf("金钱:%d\n",p2.money);

    weizhi[p2.dangqian]=' ';

    printf("请选择操作:0.存档         1.查看个人房产       2.前进\n");

    scanf("%d",&choice);

    if (choice==0)

    {

        fp=fopen(p1.allname,"wb");

        fwrite(&p1,sizeof(struct player),1,fp);

        fwrite(&p2,sizeof(struct player),1,fp);

        fclose(fp);

        goto turn;

    }

    else if (choice==1)

    {

/* 输出个人信息,真特么麻烦 */

 

        for (a=0;a<=19;a++)

        {

            if (p2.fangchan[0][a]==1)

            {

                switch (a)

                {

                case 0:printf("火星大道1号\n");b=1;break;

                case 1:printf("火星大道2号\n");b=1;break;

                case 2:printf("解放路1号\n");b=1;break;

                case 3:printf("解放路2号\n");b=1;break;

                case 4:printf("解放路3号\n");b=1;break;

                case 5:printf("解放路4号\n");b=1;break;

                case 6:printf("解放路5号\n");b=1;break;

                case 7:printf("花炮大道1号\n");b=1;break;

                case 8:printf("花炮大道2号\n");b=1;break;

                case 9:printf("花炮大道3号\n");b=1;break;

                case 10:printf("花炮大道4号\n");b=1;break;

                case 11:printf("花炮大道5号\n");b=1;break;

                case 12:printf("花炮大道6号\n");b=1;break;

                case 13:printf("花炮大道7号\n");b=1;break;

                case 14:printf("花炮大道8号\n");b=1;break;

                case 15:printf("花炮大道9号\n");b=1;break;

                case 16:printf("桂花路1号\n");b=1;break;

                case 17:printf("桂花路2号\n");b=1;break;

                case 18:printf("桂花路3号\n");b=1;break;

                default:break;

                }

                if (b==1)

                {

                    if (p2.fangchan[1][a]==1)

                    {

                        printf("建设旅馆一座:\n");

                        printf("旅馆等级:%d星级\n",p2.fangchan[2][a]);

                        printf("每次停留收取费用:%d\n",p2.fangchan[3][a]);

                        printf("\n");

                    }

                    else if(p2.fangchan[1][a]==2)

                    {

                        printf("建设商店一座:\n");

                        switch (p2.fangchan[2][a])

                        {

                        case 1:printf("等级:小卖部\n");break;

                        case 2:printf("等级:商店\n");break;

                        case 3:printf("等级:超市\n");break;

                        case 4:printf("等级:全国连锁超市\n");break;

                        case 5:printf("等级:世界连锁贸易市场\n");break;

                        default:break;

                        }

                        printf("每回合收入为:%d",p2.fangchan[4][a]);

                        printf("\n");

                    }

                    else

                    {

                        printf("仅有地皮一份。\n");

                    }

                }

            }

        }

        system("pause");

        goto turn;

    }

    else if (choice==9)

    {

        qianjinbs=1;

        goto miji2;

    }

    else

    {

        shijian(12);

        if (p1.days>=100)

    {

        goto end;

    }

        a=rand()%6;

        qianjinbs=a+1;

miji2:printf("你投出了%d点!",qianjinbs);

        p2.dangqian=qianjin(qianjinbs,p2.dangqian,weizhi,p2.name);

jintui2:switch (p2.dangqian)

        {

        case 0:printf("停在起点奖励1000!\n");p2.money+=1000;system("pause");break;

        case 3:printf("前进三格!\n");c=3;p2.dangqian=qianjin(c,p2.dangqian,weizhi,p2.name);goto jintui2;

        case 9:printf("进入人品驿站~~考验人品的时候到了!\n");Sleep(1000);p2.money=renpin(p2.money);;break;

        case 16:printf("后退两格!\n");c=2;p2.dangqian=houtui(c,p2.dangqian,weizhi,p2.name);goto jintui2;

        case 20:{printf("进入赌场!!\n");

            Sleep(500);

            p2.money=duchang(p2.money);

            if (p1.days>=100)

    {

        goto end;

    }

            break;}

        case 21:printf("前进两格!\n");c=2;p2.dangqian=qianjin(c,p2.dangqian,weizhi,p2.name);goto jintui2;

        case 22:printf("进入人品驿站~~考验人品的时候到了!\n");Sleep(1000);p2.money=renpin(p2.money);;break;

        default:fang(p1.turns);break;

        }

         system("cls");

         weizhi[p2.dangqian]=2;

         qipan(weizhi);

        weizhi[p2.dangqian]=' ';

        for (b=1,a=0;a<=18;a++)

        {

        if (p2.fangchan[1][a]==2)

        {

            printf("%d号商店收益:%d  ",a,p2.fangchan[4][a]);

            p2.money=p2.money+p2.fangchan[4][a];

            b++;

            if (b==4)

            {

                printf("\n");

                b=1;

            }

        }

        }

        system("pause");

        p1.turns=1;

        goto turn;

    }

    }

end:printf("名字:");

        puts(p1.allname);

        if (p1.money<3000)

    {

        printf("身份:贫民\n");

        printf("弱爆了你,才这点钱~!\n");

        m=10;

    }

        else if (p1.money<5000)

    {

        printf("身份:平民\n");

        printf("勉勉强强够糊口吧~~~\n");

        m=20;

    }

    else if (p1.money<10000)

    {

        printf("身份:小资\n");

        printf("还好还好不算丢脸~~~\n");

        m=30;

    }

    else if (p1.money<20000)

    {

        printf("身份:富人\n");

        printf("十分不错,RP棒棒哒~~!!\n");

        m=40;

    }

    else if (p1.money<50000)

    {

        printf("身份:土豪\n");

        printf("土豪我们做朋友吧~");

        m=50;

    }

    else

    {

        printf("身份:首富\n");

        printf("膜拜。。。");

        m=60;

    }

        printf("\n金钱:%d\n",p1.money);

        for (a=0,c=0;a<=19;a++)

        {

            if (p1.fangchan[0][a]==1)

            {

                switch (a)

                {

                case 0:printf("火星大道1号\n");b=1;break;

                case 1:printf("火星大道2号\n");b=1;break;

                case 2:printf("解放路1号\n");b=1;break;

                case 3:printf("解放路2号\n");b=1;break;

                case 4:printf("解放路3号\n");b=1;break;

                case 5:printf("解放路4号\n");b=1;break;

                case 6:printf("解放路5号\n");b=1;break;

                case 7:printf("花炮大道1号\n");b=1;break;

                case 8:printf("花炮大道2号\n");b=1;break;

                case 9:printf("花炮大道3号\n");b=1;break;

                case 10:printf("花炮大道4号\n");b=1;break;

                case 11:printf("花炮大道5号\n");b=1;break;

                case 12:printf("花炮大道6号\n");b=1;break;

                case 13:printf("花炮大道7号\n");b=1;break;

                case 14:printf("花炮大道8号\n");b=1;break;

                case 15:printf("花炮大道9号\n");b=1;break;

                case 16:printf("桂花路1号\n");b=1;break;

                case 17:printf("桂花路2号\n");b=1;break;

                case 18:printf("桂花路3号\n");b=1;break;

                default:break;

                }

                if (b==1)

                {

                    if (p1.fangchan[1][a]==1)

                    {

                        printf("建设旅馆一座:\n");

                        printf("旅馆等级:%d星级\n",p1.fangchan[2][a]);

                        printf("每次停留收取费用:%d\n",p1.fangchan[3][a]);

                        printf("\n");

                    }

                    else if(p1.fangchan[1][a]==2)

                    {

                        printf("建设商店一座:\n");

                        switch (p1.fangchan[2][a])

                        {

                        case 1:printf("等级:小卖部\n");break;

                        case 2:printf("等级:商店\n");break;

                        case 3:printf("等级:超市\n");break;

                        case 4:printf("等级:全国连锁超市\n");break;

                        case 5:printf("等级:世界连锁贸易市场\n");break;

                        default:break;

                        }

                        printf("每回合收入为:%d",p1.fangchan[4][a]);

                        printf("\n");

                    }

                    else

                    {

                        printf("仅有地皮一份。\n");

                    }

                    c++;

                }

            }

        }

    if (c==0)

    {

        printf("没地?别说我认识你啊。。。\n");

        n=10;

    }

    else if (c<5)

    {

        printf("啧啧。。怎么混的你竟然才这么点地?\n");

        n=20;

    }

    else if (c<10)

    {

        printf("算是勉强勉强够混口饭吃了吧。。。\n");

        n=30;

    }

    else if (c<18)

    {

        printf("没错你就是传说中无恶不作的房地产大商!!!\n");

        n=40;

    }

    else

    {

        printf("买下所有地皮,达成最高成就:城主!!\n");

        n=60;

    }

    p=m+n;

    printf("最终积分为:%d",p);

    system("pause");

    system("cls");

    printf("名字:");

        puts(p2.allname);

        if (p2.money<3000)

    {

        printf("身份:贫民\n");

        printf("弱爆了你,才这点钱~!\n");

        m=10;

    }

        else if (p2.money<5000)

    {

        printf("身份:平民\n");

        printf("勉勉强强够糊口吧~~~\n");

        m=20;

    }

    else if (p2.money<10000)

    {

        printf("身份:小资\n");

        printf("还好还好不算丢脸~~~\n");

        m=30;

    }

    else if (p2.money<20000)

    {

        printf("身份:富人\n");

        printf("十分不错,RP棒棒哒~~!!\n");

        m=40;

    }

    else if (p2.money<50000)

    {

        printf("身份:土豪\n");

        printf("土豪我们做朋友吧~");

        m=50;

    }

    else

    {

        printf("身份:首富\n");

        printf("膜拜。。。");

        m=60;

    }

        printf("\n金钱:%d\n",p2.money);

        for (a=0,c=0;a<=19;a++)

        {

            if (p2.fangchan[0][a]==1)

            {

                switch (a)

                {

                case 0:printf("火星大道1号\n");b=1;break;

                case 1:printf("火星大道2号\n");b=1;break;

                case 2:printf("解放路1号\n");b=1;break;

                case 3:printf("解放路2号\n");b=1;break;

                case 4:printf("解放路3号\n");b=1;break;

                case 5:printf("解放路4号\n");b=1;break;

                case 6:printf("解放路5号\n");b=1;break;

                case 7:printf("花炮大道1号\n");b=1;break;

                case 8:printf("花炮大道2号\n");b=1;break;

                case 9:printf("花炮大道3号\n");b=1;break;

                case 10:printf("花炮大道4号\n");b=1;break;

                case 11:printf("花炮大道5号\n");b=1;break;

                case 12:printf("花炮大道6号\n");b=1;break;

                case 13:printf("花炮大道7号\n");b=1;break;

                case 14:printf("花炮大道8号\n");b=1;break;

                case 15:printf("花炮大道9号\n");b=1;break;

                case 16:printf("桂花路1号\n");b=1;break;

                case 17:printf("桂花路2号\n");b=1;break;

                case 18:printf("桂花路3号\n");b=1;break;

                default:break;

                }

                if (b==1)

                {

                    if (p2.fangchan[1][a]==1)

                    {

                        printf("建设旅馆一座:\n");

                        printf("旅馆等级:%d星级\n",p1.fangchan[2][a]);

                        printf("每次停留收取费用:%d\n",p1.fangchan[3][a]);

                        printf("\n");

                    }

                    else if(p2.fangchan[1][a]==2)

                    {

                        printf("建设商店一座:\n");

                        switch (p2.fangchan[2][a])

                        {

                        case 1:printf("等级:小卖部\n");break;

                        case 2:printf("等级:商店\n");break;

                        case 3:printf("等级:超市\n");break;

                        case 4:printf("等级:全国连锁超市\n");break;

                        case 5:printf("等级:世界连锁贸易市场\n");break;

                        default:break;

                        }

                        printf("每回合收入为:%d",p2.fangchan[4][a]);

                        printf("\n");

                    }

                    else

                    {

                        printf("仅有地皮一份。\n");

                    }

                    c++;

                }

            }

        }

    if (c==0)

    {

        printf("没地?别说我认识你啊。。。\n");

        n=10;

    }

    else if (c<5)

    {

        printf("啧啧。。怎么混的你竟然才这么点地?\n");

        n=20;

    }

    else if (c<10)

    {

        printf("算是勉强勉强够混口饭吃了吧。。。\n");

        n=30;

    }

    else if (c<18)

    {

        printf("没错你就是传说中无恶不作的房地产大商!!!\n");

        n=40;

    }

    else

    {

        printf("买下所有地皮,达成最高成就:城主!!\n");

        n=60;

    }

    q=m+n;

    printf("您的最终积分为:%d",q);

    if (p>q)

    {

        printf("1P更胜一筹哦!\n");

    }

    else if (q>p)

    {

        printf("2P更强一些诶!\n");

    }

    else

    {

        printf("十分和谐有爱的平手!\n");

    }

    system("pause");

    printf("想看彩蛋吗?输入1则继续!输入其他数字退出~\n");

    scanf("%d",&a);

    if (a)

    {

caidan:system("cls");

    for (a=1;a<=100;a++)

    {

        printf("壮哉我大622~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

    }

    printf("没错这就是彩蛋!\n");

    printf("好啦游戏结束~~");

    }

    else

    {

        printf("不看也得看!!\n");

        system("pause");

        goto caidan;

    }

    system("pause");

    return 0;

}

 

/*时间*/

int shijian(int a)

{

    p1.hours+=a;

    if (p1.hours>=12)

    {

        p1.hours-=12;

        p1.days++;

    }

    return 0;

}

/*定义界面函数*/

int qipan(char weizhi[28])

    {

        system("cls");

        printf("_____________________________________________________________\n");

        printf("|%c   1|%c   2|%c   3|%c   4|%c   5|%c   6|%c   7|%c   8|%c   9|%c  10|\n",weizhi[0],weizhi[1],weizhi[2],weizhi[3],weizhi[4],weizhi[5],weizhi[6],weizhi[7],weizhi[8],weizhi[9]);

        printf("|开始 |火 星|大 道|前进 |     | 解  |  放 |  路 |     |人品 |\n");

        printf("|     |1 号 |2 号 |3 格 |1 号 |2 号 |3 号 |4 号 |5 号 |驿站 |\n");

        printf("-------------------------------------------------------------\n");

        printf("|%c  26|                                               |%c  11|\n",weizhi[25],weizhi[10]);

        printf("|桂   |                                               |     |\n");

        printf("|3 号 |                                               |1 号 |\n");

        printf("|-----|                                               |-----|\n");

        printf("|%c  25|                                               |%c  12|\n",weizhi[24],weizhi[11]);

        printf("|花   |           大      富      翁                  |花   |\n");

        printf("|2 号 |                                               |2 号 |\n");

        printf("|-----|                                               |-----|\n");

        printf("|%c  24|                                               |%c  13|\n",weizhi[23],weizhi[12]);

        printf("|路   |                                               |炮   |\n");

        printf("|1 号 |                                               |3 号 |\n");

        printf("-------------------------------------------------------------\n");

        printf("|%c  23|%c  22|%c  21|%c  20|%c  19|%c  18|%c  17|%c  16|%c  15|%c  14|\n",weizhi[22],weizhi[21],weizhi[20],weizhi[19],weizhi[18],weizhi[17],weizhi[16],weizhi[15],weizhi[14],weizhi[13]);

        printf("|人品 |前进 |赌场 |     |     |     |后退 |     |道   |大   |\n");

        printf("|驿站 |2 格 |     |9 号 |8 号 |7 号 |2 格 |6 号 |5 号 |4 号 |\n");

        printf("-------------------------------------------------------------\n");

        return 0;

    }

/*定义前进函数*/

    int qianjin(int qianjinbs,int dangqian,char weizhi[28],char name)

    {

        int a,b;

        for(b=0;b<qianjinbs;b++)

        {

            dangqian++;

            if (dangqian>=26)

            {

                dangqian=0;

            }

            weizhi[dangqian]=name;

            Sleep(1000);

            qipan(weizhi);

            weizhi[dangqian]=' ';

        }

        return dangqian;

    }

/*定义后退函数*/

    int houtui(int houtuibs,int dangqian,char weizhi[28],char name)

    {

        int a,b;

        for(b=0,a=0;b<houtuibs;b++)

        {

            if (dangqian<=0)

            {

                dangqian=0;

            }

            else

            {

                dangqian=dangqian-1;

            }

            weizhi[dangqian]=name;

            Sleep(1000);

            qipan(weizhi);

            weizhi[dangqian]=' ';

        }

        return dangqian;

    }

 

    /*一大作死项目:房地产!*/

   int fang(int turns)

   {

    int fanghao;

    int a,b,c;

    if (p1.turns)

    {

    switch (p1.dangqian)

    {

        case 1:fanghao=0;break;

        case 2:fanghao=1;break;

        case 4:fanghao=2;break;

        case 5:fanghao=3;break;

        case 6:fanghao=4;break;

        case 7:fanghao=5;break;

        case 8:fanghao=6;break;

        case 10:fanghao=7;break;

        case 11:fanghao=8;break;

        case 12:fanghao=9;break;

        case 13:fanghao=10;break;

        case 14:fanghao=11;break;

        case 15:fanghao=12;break;

        case 17:fanghao=13;break;

        case 18:fanghao=14;break;

        case 19:fanghao=15;break;

        case 23:fanghao=16;break;

        case 24:fanghao=17;break;

        case 25:fanghao=18;break;

        default:break;

    }

    if (p2.fangchan[0][fanghao]==0)

    {

    if (p1.fangchan[0][fanghao]==0)

    {

        printf("1.购下该地皮,花费500,   其他任意数返回\n");

        scanf("%d",&a);

        if (a==1)

        {

            p1.fangchan[0][fanghao]=1;

            p1.money-=500;

        }

    }

    else if (p1.fangchan[1][fanghao]==0)

    {

        printf("1.升级成旅馆,花费200\n2.升级成商店,花费200\n输入其他任意数字返回\n");

        scanf("%d",&a);

        switch (a)

        {

        case 1:p1.fangchan[1][fanghao]=1;p1.money=p1.money-200;p1.fangchan[2][fanghao]=1;p1.fangchan[3][fanghao]=500;break;

        case 2:p1.fangchan[1][fanghao]=2;p1.money=p1.money-200;p1.fangchan[2][fanghao]=1;p1.fangchan[4][fanghao]=50;break;

        default:break;

        }

    }

    else if (p1.fangchan[1][fanghao]==1)

    {

        p1.fangchan[4][fanghao]=0;

        printf("当前为%d星级旅馆\n1.花费%d升级旅馆\n输入其他任意数字返回\n",p1.fangchan[2][fanghao],500*(p1.fangchan[2][fanghao]+1));

        scanf("%d",&a);

        if (a==1)

        {

            if (p1.fangchan[2][fanghao]==5)

            {

                printf("已是最高级别!\n");

                system("pause");

                goto zuigao;

            }

            p1.fangchan[2][fanghao]++;

            p1.money=p1.money-500*p1.fangchan[2][fanghao];

            p1.fangchan[3][fanghao]=p1.fangchan[3][fanghao]+200*p1.fangchan[2][fanghao];

            printf("升级完毕,当前为%d星级旅馆\n",p1.fangchan[2][fanghao]);

            printf("输入任意数字返回\n");

            scanf("%d",&c);

        }

    }

    else

    {

        printf("当前为%d级商店\n1.花费%d升级商店\n输入其他数字返回\n",p1.fangchan[1][fanghao],500*p1.fangchan[2][fanghao]);

        scanf("%d",&a);

        if (a==1)

        {

            if (p1.fangchan[2][fanghao]==5)

            {

                printf("已是最高级别!\n");

                printf("输入任意数字返回\n");

                scanf("%d",&c);

                goto zuigao;

            }

            p1.fangchan[2][fanghao]++;

            p1.money=p1.money-500*p1.fangchan[2][fanghao];

            p1.fangchan[4][fanghao]=p1.fangchan[4][fanghao]+10*p1.fangchan[2][fanghao];

            printf("升级完毕,当前为%d星级商店\n",p1.fangchan[2][fanghao]);

            system("pause");

        }

    }

    }

    else if (p2.fangchan[1][fanghao]==1)

    {

        printf("被收取过路费住宿费%d\n",p2.fangchan[3][fanghao]);

        p1.money=p1.money-p2.fangchan[3][fanghao];

        p2.money=p2.money+p2.fangchan[3][fanghao];

        system("pause");

    }

    }

    else

    {

        switch (p2.dangqian)

    {

        case 1:fanghao=0;break;

        case 2:fanghao=1;break;

        case 4:fanghao=2;break;

        case 5:fanghao=3;break;

        case 6:fanghao=4;break;

        case 7:fanghao=5;break;

        case 8:fanghao=6;break;

        case 10:fanghao=7;break;

        case 11:fanghao=8;break;

        case 12:fanghao=9;break;

        case 13:fanghao=10;break;

        case 14:fanghao=11;break;

        case 15:fanghao=12;break;

        case 17:fanghao=13;break;

        case 18:fanghao=14;break;

        case 19:fanghao=15;break;

        case 23:fanghao=16;break;

        case 24:fanghao=17;break;

        case 25:fanghao=18;break;

        default:break;

    }

    if (p1.fangchan[0][fanghao]==0)

    {

    if (p2.fangchan[0][fanghao]==0)

    {

        printf("1.购下该地皮,花费500,   其他任意数返回\n");

        scanf("%d",&a);

        if (a==1)

        {

            p2.fangchan[0][fanghao]=1;

            p2.money-=500;

        }

    }

    else if (p2.fangchan[1][fanghao]==0)

    {

        printf("1.升级成旅馆,花费200\n2.升级成商店,花费200\n输入其他任意数字返回\n");

        scanf("%d",&a);

        switch (a)

        {

        case 1:p2.fangchan[1][fanghao]=1;p2.money=p1.money-200;p2.fangchan[2][fanghao]=1;p2.fangchan[3][fanghao]=500;break;

        case 2:p2.fangchan[1][fanghao]=2;p2.money=p1.money-200;p2.fangchan[2][fanghao]=1;p2.fangchan[4][fanghao]=50;break;

        default:break;

        }

    }

    else if (p2.fangchan[1][fanghao]==1)

    {

        p2.fangchan[4][fanghao]=0;

        printf("当前为%d星级旅馆\n1.花费%d升级旅馆\n输入其他任意数字返回\n",p2.fangchan[2][fanghao],500*(p2.fangchan[2][fanghao]+1));

        scanf("%d",&a);

        if (a==1)

        {

            if (p2.fangchan[2][fanghao]==5)

            {

                printf("已是最高级别!\n");

                system("pause");

                goto zuigao;

            }

            p2.fangchan[2][fanghao]++;

            p2.money=p2.money-500*p2.fangchan[2][fanghao];

            p2.fangchan[3][fanghao]=p2.fangchan[3][fanghao]+200*p2.fangchan[2][fanghao];

            printf("升级完毕,当前为%d星级旅馆\n",p2.fangchan[2][fanghao]);

            printf("输入任意数字返回\n");

            scanf("%d",&c);

        }

    }

    else

    {

        printf("当前为%d级商店\n1.花费%d升级商店\n输入其他数字返回\n",p2.fangchan[1][fanghao],500*p2.fangchan[2][fanghao]);

        scanf("%d",&a);

        if (a==1)

        {

            if (p2.fangchan[2][fanghao]==5)

            {

                printf("已是最高级别!\n");

                printf("输入任意数字返回\n");

                scanf("%d",&c);

                goto zuigao;

            }

            p2.fangchan[2][fanghao]++;

            p2.money=p1.money-500*p2.fangchan[2][fanghao];

            p2.fangchan[4][fanghao]=p2.fangchan[4][fanghao]+10*p2.fangchan[2][fanghao];

            printf("升级完毕,当前为%d星级商店\n",p2.fangchan[2][fanghao]);

            system("pause");

        }

    }

    }

    else if (p1.fangchan[1][fanghao]==1)

    {

        printf("被收取过路费住宿费%d\n",p1.fangchan[3][fanghao]);

        p2.money=p2.money-p1.fangchan[3][fanghao];

        p1.money=p1.money+p1.fangchan[3][fanghao];

        system("pause");

    }

    }

zuigao:return 0;

}

    /*人品驿站!!*/

int renpin(int money)

{

    int a,b;

    a=rand()%10;

    b=rand()%2000;

    switch (a)

    {

    case 0:printf("路边捡到一个钱包,获得%d!!\n",b);money=money+b;break;

    case 1:printf("路遇恶狗被咬,住院花费200!!\n");money=money-200;break;

    case 2:printf("见到小偷行窃,见义勇为被奖励500!!\n");money=money+500;break;

    case 3:printf("见到小偷行窃,见义勇为,军体拳耍了16套被砍了32刀,住院花费1000!!");money=money-1000;break;

    case 4:printf("捡到彩票,花费50元打的前往彩票中心兑奖后发现是过期彩票,又打的返回~~\n");money=money-100;break;

    case 5:printf("捡到彩票,花费50元打的前往彩票中心兑奖后发现是中奖彩票,获得1000元!\n");money=money+1000;break;

    case 6:printf("人民币涨值,资金上涨20%!!\n");money=money+money/5;break;

    case 7:printf("路遇乞丐,被强行勒索100元.\n");money=money-100;break;

    case 8:printf("长得太丑被好心人施舍200\n");money=money+200;break;

    case 9:printf("路边破解残局摊,获利100\n");money=money+100;break;

    }

    system("pause");

    return money;

}

/*作死的加入赌场函数*/

    /*此函数用于判断骰子猜测结果*/

int touzi(int touzi1,int touzi2,int a)

{

    int b,daxiao;

    int he;

    he=touzi1+touzi2;

    if (he>6)

    {

        daxiao=13;

        printf("大!\n");

    }

    else

    {

        daxiao=14;

        printf("小!\n");

    }

    if (a<=12)

    {

        if (a==he)

        {

            b=5;

        }

        else

        {

            b=0;

        }

    }

    else if (a<=14)

    {

        if (a==daxiao)

        {

            b=2;

        }

        else

        {

            b=0;

        }

    }

    else

    {

        if (touzi1==touzi2)

        {

            b=3;

        }

        else

        {

            b=0;

        }

    }

    return b;

}

int duchang(int money)

{

        int z[2][5];

        int x[2][6]={0};

        double beilv;

        int a,b,c,n,d,e,m,choice;

        int touzi1,touzi2,touzi0;

        int num,times,guess,p,q;

        int result;

        int touru;

        char name[20];

        int touzi(int touzi1,int touzi2,int a);

        touzi0=0;

    printf("**************************拉斯维加斯****************************\n输入您的赌场外号:\n");

    gets(name);

    /*此处用于清屏并输出当前个人档案*/

xinxi:

    touzi0++;

    if (touzi0>3)

    {

        goto ended;

    }

    shijian(3);

    if (p1.days>=100)

    {

        goto ended;

    }

    system("cls");

    printf("********************拉斯维加斯********************\n");

    puts(name);

    printf("当前资产:%d",money);

    if (money<500)

    {

        printf("\n身份:贫民\n");

    }

        else if (money<1000)

    {

        printf("\n身份:平民\n");

    }

    else if (money<2000)

    {

        printf("\n身份:小资\n");

    }

    else if (money<5000)

    {

        printf("\n身份:富人\n");

    }

    else if (money<50000)

    {

        printf("\n身份:土豪\n");

    }

    else

    {

        printf("\n身份:首富\n");

    }

    if (money<0)

    {

        printf("没钱还想进赌城~?\n");

        goto ended;

    }

    /*此处开始选择赌博*/

    printf("选择一种活动吧:\n1.掷骰子\n2.猜数\n3.炸金花\n4.21点\n5.退出赌城\n");

    scanf("%d",&choice);

    /*开始掷骰子*/

    if (choice==1)

    {

        system("cls");

        printf("OOOOOOOOOOoooooooooo 掷骰子 ooooooooooOOOOOOOOOO\n");

    touzi1=rand()%6+1;

    touzi2=rand()%6+1;

    printf("开始掷骰子,买定离手咯!\n");

    printf("您要买的是:\n1-12.买点数\n13.买大\n14.买小\n15.买豹子\n");

    scanf("%d",&a);

error3:printf("您买入多少钱呢:\n");

    scanf("%d",&touru);

    if (touru>money)

        {

            printf("没钱还敢乱喊价? \n");

            goto error3;

        }

    if (touru<0)

    {

        printf("你他妈是在逗我~?\n");

        goto error3;

    }

    printf("开!骰子情况是%d,%d!",touzi1,touzi2);

    b=touzi(touzi1,touzi2,a);

    money=money-touru+touru*b;

    system("pause");

    }

    /*开始猜数*/

    else if (choice==2)

    {

        system("cls");

        printf("//////////////////// 猜数 \\\\\\\\\\\\\\\\\\\\\n");

error1:printf("请输入您的押金,将按您猜数次数呈倍数返还:\n");

        scanf("%d",&touru);

        if (touru>money)

        {

            printf("没钱还敢乱喊价? \n");

            goto error1;

        }

        if (touru<0)

        {

        printf("你他妈是在逗我~?\n");

        goto error1;

        }

              num=rand()%100;

              for(times=0;times<=10;times++)

              {

                       printf("第%d次猜数:",times+1);

                       scanf("%d",&guess);

                       if (guess>num)

                       {

                              printf("\n猜的大了\n");

                       }

                       else if(guess<num)

                       {

                             printf("\n猜的小了\n");

                       }

                       else

                       {

                              printf("恭喜猜对啦!");

                              break;

                        }

              }

              if (times>=10)

              {

                  printf("10次都猜不出,弱爆了!!\n");

              }

              money=money-touru;

              times=22-2*times;

              beilv=times/10.0;

              money=money+touru*beilv;

              system("pause");

    }

    /*开始炸金花*/

    else if (choice==3)

    {

        system("cls");

        printf("xxxxxxxxxxXXXXXXXXXX 炸金花 XXXXXXXXXXxxxxxxxxxx\n");

        printf("由于本行业为暴利行业,故收取手续费为总金额百分之五,两百元以内则扣十元\n");

        if (money<=200)

        {

            money=money-10;

        }

        else

        {

            money=money*0.95;

        }

        for (m=0;m<=2;m++)

    {

        z[0][m]=rand()%13+1;

        z[1][m]=rand()%13+1;

    }

    /*在此进行排序*/

   for (d=0;d<=1;d++)

    {

        if (z[d][1]>z[d][0])

        {

            e=z[d][0];

            z[d][0]=z[d][1];

            z[d][1]=e;

        }

        if (z[d][2]>z[d][1])

        {

            e=z[d][1];

            z[d][1]=z[d][2];

            z[d][2]=e;

        }

        if (z[d][1]>z[d][0])

        {

            e=z[d][0];

            z[d][0]=z[d][1];

            z[d][1]=e;

        }

    }

    printf("您的手牌是:%d,%d,%d\n",z[0][0],z[0][1],z[0][2]);

error2:printf("您选择跟多少:\n");

    scanf("%d",&touru);

    if (touru>money)

        {

            printf("没钱还敢乱喊价? \n");

            goto error2;

        }

    if (touru<0)

    {

        printf("你他妈是在逗我~?\n");

        goto error2;

    }

    money=money-touru;

    /*此处开始比大小出结果*/

    for (d=0;d<=1;d++)

    {

        if (z[d][0]==z[d][1] && z[d][1]==z[d][2])

        {

            z[d][3]=4;

            z[d][4]=z[d][0];

        }

        else if (z[d][0]==z[d][1] || z[d][1]==z[d][2] || z[d][0]==z[d][2])

        {

            z[d][3]=2;

            if (z[d][0]==z[d][1])

            {

                z[d][4]=z[d][0];

            }

            else if (z[d][1]==z[d][2])

            {

                z[d][4]=z[d][1];

            }

            else

            {

                z[d][4]=z[d][2];

            }

        }

        else

        {

            if (z[d][0]-z[d][1]==1 && z[d][1]-z[d][2]==1)

            {

                z[d][3]=3;

                z[d][4]=z[d][0];

            }

            else

            {

                z[d][3]=1;

                z[d][4]=z[d][0];

            }

        }

    }

        if (z[0][3]==z[1][3])

        {

            if (z[0][4]>=z[1][4])

            {

                n=2;

            }

            else

            {

                n=0;

            }

        }

        else if (z[0][3]>z[1][3])

        {

            n=2;

        }

        else

        {

            n=0;

        }

    touru=touru*n;

    printf("摊牌:%d,%d,%d \n",z[1][0],z[1][1],z[1][2]);

    printf("您获得%d \n",touru);

    money=money+touru;

    system("pause");

    }

    else if (choice==4)

        /*开始21点*/

    {

        system("cls");

        printf("################### 21点 ###################\n");

error4:printf("请投入押金:\n");

        scanf("%d",&touru);

        if (touru>money)

        {

            printf("没钱还敢乱喊价? \n");

            goto error4;

        }

        if (touru<0)

    {

        printf("你他妈是在逗我~?\n");

        goto error4;

    }

        money=money-touru;

/*双方发底牌*/

        for(m=0;m<=1;m++)

        {

            for(n=0;n<=1;n++)

            {

                x[m][n]=rand()%13;

                if (x[m][n]==0 || x[m][n]==11 || x[m][n]==12)

                {

                    x[m][n]=10;

                }

            }

        }

        printf("您当前的手牌为:%d,%d",x[0][0],x[0][1]);

        if(x[0][0]==1 && x[0][1]==1)

        {

            printf("玩家双龙!!!\n");

            beilv=5;

            goto under;

        }

        if((x[0][0]==1 && x[0][1]==10) || (x[0][0]==10 && x[0][1]==1))

        {

            printf("玩家21点!!\n");

            beilv=3;

            goto under;

        }

        if((x[1][0]==1 && x[1][1]==10) || (x[1][0]==10 && x[1][1]==1) || (x[1][0]==1 && x[1][1]==1))

        {

            printf("电脑21点!!\n");

            beilv=0;

            goto under;

        }

        printf("\n输入1则摊牌,输入其他数字继续加牌 \n");

        scanf("%d",&a);

        if (a==1)

        {

            goto tanpai;

        }

        x[0][2]=rand()%13;

        if (x[0][2]==0 || x[0][2]==11 || x[0][2]==12)

        {

            x[0][2]=10;

        }

        printf("您的手牌为:%d,%d,%d \n",x[0][0],x[0][1],x[0][2]);

        x[0][5]=x[0][0]+x[0][1]+x[0][2];

        if (x[0][5]>21)

        {

            beilv=0;

            printf("胀死了!");

            goto under;

        }

        printf("\n输入1则摊牌,输入其他数字继续加牌 \n");

        scanf("%d",&a);

        if (a==1)

        {

            goto tanpai;

        }

        x[0][3]=rand()%13;

        if (x[0][3]==0 || x[0][3]==11 || x[0][3]==12)

        {

            x[0][3]=10;

        }

        printf("您的手牌为:%d,%d,%d,%d \n",x[0][0],x[0][1],x[0][2],x[0][3]);

        x[0][5]=x[0][5]+x[0][3];

        if (x[0][5]>21)

        {

            beilv=0;

            printf("胀死了!! \n");

            goto under;

        }

        printf("\n输入1则摊牌,输入其他数字继续加牌 \n");

        scanf("%d",&a);

        if (a==1)

        {

            goto tanpai;

        }

        x[0][4]=rand()%13;

        if (x[0][4]==0 || x[0][4]==11 || x[0][3]==12)

        {

            x[0][4]=10;

        }

        printf("您的手牌为:%d,%d,%d,%d,%d \n",x[0][0],x[0][1],x[0][2],x[0][3],x[0][4]);

        x[0][5]=x[0][5]+x[0][4];

        if (x[0][5]>21)

        {

            beilv=0;

            printf("胀死了!! \n");

            goto under;

        }

        printf("五小!!\n");

        beilv=3;

        goto under;

 

tanpai:x[1][5]=x[1][0]+x[1][1];

        for(b=2;(x[1][5]<=17 && b<=4);b++)

        {

            x[1][b]=rand()%13;

            if (x[1][b]==0 || x[1][b]==11 || x[1][b]==12)

            {

                x[1][b]=10;

            }

            printf("电脑加牌:%d\n",x[1][b]);

            x[1][5]=x[1][5]+x[1][b];

            scanf("%d",&a);

        }

        printf("电脑手牌:%d,%d,%d,%d,%d\n",x[1][0],x[1][1],x[1][2],x[1][3],x[1][4]);

        if (x[1][5]>21)

        {

            printf("电脑胀死!\n");

            beilv=2;

            goto under;

        }

        if (x[1][5]>x[0][5])

        {

            printf("电脑大!\n");

            beilv=0;

        }

        else

        {

            printf("玩家大!!\n");

            beilv=2;

        }

under:money=money+touru*beilv;

      system("pause");

    }

    else

    {

        goto ended;

    }

    if (money<=0)

    {

        printf("\n资产用尽,您已被赶出拉斯维加斯\n");

    }

    else

    {

        goto xinxi;

    }

ended:  system("pause");

    return money;

}大富翁

0
时梓繁
时梓繁
修练者
修练者

#include<iostream> 

#include<windows.h> 

#include<conio.h> 

#include<time.h> 

#include<string> 

using namespace std; 

 

/*=============== all the structures ===============*/ 

 

typedef struct Frame 

    COORD position[2]; 

    int flag; 

}Frame; 

 

 

/*=============== all the functions ===============*/ 

 

void SetPos(COORD a)// set cursor  

    HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE); 

    SetConsoleCursorPosition(out, a); 

 

void SetPos(int i, int j)// set cursor 

    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. 冷酷的敌人"; 

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

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

    SetPos(47, 11); 

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

    SetPos(51, 13); 

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

    SetPos(24, 21); 

    cout<<"制作:LJF神犇"; 

    int j=11; 

    SetPos(12, j); 

    cout<<">>"; 

 

    //drawFrame(45, 9, 79, 17, '=', '|'); 

 

    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; 

                    } 

            } 

        } 

    } 

 

/* 

DWORD WINAPI MusicFun(LPVOID lpParamte)

{

    //DWORD OBJ;

    sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);

    return 0;

}

*/ 

 

 

/*================== 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="王牌飞行员"; 

        cout<<title; 

    } 

    rankf = rank; 

 

void Game::Playing() 

    //HANDLE MFUN; 

    //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);  

 

    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)制作:最牛的LJF"; 

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
黄昊轩
黄昊轩
新手守护
新手守护
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
// 刷新当前屏幕
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     //  清屏
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }

        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}













贪吃蛇



 举报
 2 周,1 日 前  0条评论
赞成0
 黄昊轩
黄昊轩 
高级光能 
高级光能
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
// 刷新当前屏幕
inline void Refresh(char q[][22], int grade, int gamespeed){
    system("cls");     //  清屏
 int i,j;
 cout << endl;
 for(i=0;i<22;i++){
     cout << "\t";
  for(j=0;j<22;j++)
   cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘
        if(i==0) cout << "\t等级为:" << grade;
        if(i==4) cout << "\t自动前进时间";
        if(i==6) cout << "\t间隔为:" << gamespeed << "ms";
  cout<<endl;
 }
}
int main(){
    char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j;
    for(i=1;i<=20;i++)
        for(j=1;j<=20;j++)
            tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分
    for(i=0;i<=21;i++)
        tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁
    for(i=1;i<=20;i++)
        tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁
    int tcsZuobiao[2][100];     //蛇的坐标数组
    for(i=0; i<4; i++){
        tcsZuobiao[0][i] = 1;
        tcsZuobiao[1][i] = i + 1;
    }
    int head = 3,tail = 0;
    for(i=1;i<=3;i++)
        tcsQipan[1][i]='*';    //蛇身
    tcsQipan[1][4]='#';       //蛇头
    int x1, y1;           // 随机出米
    srand(time(0));
    do{
  x1=rand()%20+1;
  y1=rand()%20+1;
 }while(tcsQipan[x1][y1]!=' ');
 tcsQipan[x1][y1]='*';
 cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;
 long start;
    int grade = 1, length = 4;
    int gamespeed = 500;  //前进时间间隔
 for(i=3;i>=0;i--){
  start=clock();
  while(clock()-start<=1000);
  system("cls");
  if(i>0)
   cout << "\n\n\t\t进入倒计时:" << i << endl;
  else
   Refresh(tcsQipan,grade,gamespeed);
 }
    int timeover;
    char direction = 77;  // 初始情况下,向右运动
    int x,y;
    while(1){
        timeover = 1;
        start = clock();
        while((timeover=(clock()-start<=gamespeed))&&!kbhit());
             //如果有键按下或时间超过自动前进时间间隔则终止循环
        if(timeover){
            getch();direction = getch();
        }
        switch(direction){
        case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;     // 向上
        case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
        case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
        case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;           // 向右
        }
        if(!(direction==72||direction==80||direction==75 ||direction==77)){   //  按键非方向键
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==0 || x==21 ||y==0 || y==21){   // 碰到墙壁
            cout << "\tGame over!" << endl;return 0;
        }
        if(tcsQipan[x][y]!=' '&&!(x==x1&&y==y1)){ //   蛇头碰到蛇身
            cout << "\tGame over!" << endl;return 0;
        }
        if(x==x1 && y==y1){      //  吃米,长度加1
            length ++;
            if(length>=8){
                length -= 8;
                grade ++;
                if(gamespeed>=200)
                    gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
            }
            tcsQipan[x][y]= '#';
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = '*';
            head = (head+1)%100;
            tcsZuobiao[0][head] = x;
            tcsZuobiao[1][head] = y;
            do
            {
                x1=rand()%20+1;
                y1=rand()%20+1;
            }while(tcsQipan[x1][y1]!=' ');
            tcsQipan[x1][y1]='*';
            Refresh(tcsQipan,grade,gamespeed);
        }

        else{       //  不吃米
            tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' ';
            tail=(tail+1)%100;
            tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*';
            head=(head+1)%100;
            tcsZuobiao[0][head]=x;
            tcsZuobiao[1][head]=y;
            tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
            Refresh(tcsQipan,grade,gamespeed);
        }
    }
    return 0;
}

 

0
我要回答