问题标题: c++小游戏

0
0

0
1
1
谭凯钊
谭凯钊
资深守护
资深守护

贪吃蛇:

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

}

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

0
傅文彬
傅文彬
新手天翼
新手天翼

#include<iostream>  
#include<windows.h> 
#include<conio.h> 
#include<time.h>  
#include<string> 
using namespace std; 
typedef struct Frame 
 

 
    COORD position[2]; 
 
    int flag; 
 
}Frame; 
void SetPos(COORD a)// 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
0
谭凯钊
谭凯钊
资深守护
资深守护

第2个

#include<iostream.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
void gotoxy(int x,int y)//位置函数
{
COORD pos;
pos.X=2*x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果
{
int i,j;//初始化围墙
int wall[N+2][N+2]={{0}};
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+2;i++)
{
for(j=0;j<N+2;j++)
{
if(wall[i][j])
cout<<"■";
else cout<<"□" ;
}
cout<<endl;
}
gotoxy(N+3,1);//显示信息
color(20);
cout<<"按 W S A D 移动方向"<<endl;
gotoxy(N+3,2);
color(20);
cout<<"按任意键暂停"<<endl;
gotoxy(N+3,3);
color(20);
cout<<"得分:"<<endl;
apple[0]=rand()%N+1;//苹果
apple[1]=rand()%N+1;
gotoxy(apple[0],apple[1]);
color(12);
cout<<"●"<<endl;
}
int main()
{
int i,j;
int** snake=NULL;
int apple[2];
int score=0;
int tail[2];
int len=3;
char ch='p';
srand((unsigned)time(NULL));
init(apple);
snake=(int**)realloc(snake,sizeof(int*)*len);
for(i=0;i<len;i++)
snake[i]=(int*)malloc(sizeof(int)*2);
for(i=0;i<len;i++)
{
snake[i][0]=N/2;
snake[i][1]=N/2+i;
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;
}
while(1)//进入消息循环
{
tail[0]=snake[len-1][0];
tail[1]=snake[len-1][1];
gotoxy(tail[0],tail[1]);
color(11);
cout<<"■"<<endl;
for(i=len-1;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;
}
if(kbhit())
{
gotoxy(0,N+2);
ch=getche();
}
switch(ch)
{
case 'w':snake[0][1]--;break;
case 's':snake[0][1]++;break;
case 'a':snake[0][0]--;break;
case 'd':snake[0][0]++;break;
default: break;
}
gotoxy(snake[0][0],snake[0][1]);
color(14);
cout<<"★"<<endl;
Sleep(abs(200-0.5*score));
if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
{
score++;
len++;
snake=(int**)realloc(snake,sizeof(int*)*len);
snake[len-1]=(int*)malloc(sizeof(int)*2);
apple[0]=rand()%N+1;
apple[1]=rand()%N+1;
gotoxy(apple[0],apple[1]);
color(12);
cout<<"●"<<endl;
gotoxy(N+5,3);
color(20);
cout<<score<<endl;
}
if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败
{
gotoxy(N/2,N/2);
color(30);
cout<<"失败!!!"<<endl;
for(i=0;i<len;i++)
free(snake[i]);
Sleep(INFINITE);
exit(0);
}
}
return 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
我要回答