问题标题: 酷町堂:游戏

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

} 

 


1
已采纳
李明翰
李明翰
新手光能
新手光能

人家就发一下给你们看看还都要举报,把举报随便当着玩?他也没说这是他创作的游戏

0
0
葛若愚
葛若愚
新手守护
新手守护

上一次是别人盗号发的,他已经被举报了。

管景仁从百度搜的。

我上课离他就2米!

 

0
0
宣海宁
宣海宁
中级光能
中级光能

抄袭好玩吗?

举报!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

海发水帖!

0
葛若愚
葛若愚
新手守护
新手守护

 这是我哥哥的程序。

0
0
陈曦
陈曦
资深天翼
资深天翼

你学到什么结构了,管景仁?

我要回答