问题标题: 游戏代码(c++)

1
0

0
已采纳
芮奥运
芮奥运
高级光能
高级光能

#include<iostream>
#include<dirent.h>
#include<sys/stat.h>
#include<conio.h>
#include<cstdio>
#include<iomanip>
#include<time.h>
#include<windows.h>
using namespace std;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy(HANDLE hout, const int X, const int Y)
{
    COORD coord;
    coord.X = X;
    coord.Y = Y;
    SetConsoleCursorPosition(hout,coord);
}
void setcolor(HANDLE hout, const int bg_color, const int fg_color)
{
    SetConsoleTextAttribute(hout, bg_color*16+fg_color);
}
void basic_structure()
{

    cout<<"简单游戏规则:上为翻转,左右移动,下为加速"<<endl;
    cout<<"每次消去X行,则等级加X,分数加X的平方,下降速度提高";
    setcolor(hout,0,11);
    gotoxy(hout,2,10);
    cout<<"SCORE";
    gotoxy(hout,2,20);
    cout<<"LEVEL";
    gotoxy(hout,50,10);
    cout<<"NEXT";
    setcolor(hout,0,9);
    gotoxy(hout,3,11);
    cout<<"0";
    gotoxy(hout,3,21);
    cout<<"1";
    setcolor(hout,0,10);
    gotoxy(hout,13,5);
    cout<<"┏━━━━━━━━━━━━━┓";
    int i;
    for(i=0;i<23;i++){
        gotoxy(hout,13,6+i);
        cout<<"┃                          ┃";
    }
    gotoxy(hout,13,29);
    cout<<"┗━━━━━━━━━━━━━┛"<<endl;
}
const int coord[28][4][4]=
{{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},
 {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},
 {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
 {0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0},
 {0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0},{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},
 {1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},
 {1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},
 {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},//这一行的三个和第一个形状一样
 {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},
 {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}};
int xy[23][13]={0},color[23][13]={0},level=1,score=0,shape_num1,shape_num2,color1,color2,square_x,square_y,i,k;
char key1,key2;
void print_next(int n,int c)
{
    for(i=0;i<4;i++){
        gotoxy(hout,50,12+i);
        for(k=0;k<4;k++){
            if(coord[n][i][k]){
                setcolor(hout,0,c);
                cout<<"◎";
            }
            else{
                setcolor(hout,0,0);
                cout<<"  ";
            }
        }
    }
}
void left(int s,int c)
{
    for(i=0;i<4;i++){
        for(k=0;k<4;k++){
            if(coord[s][i][k]){
                if(square_y+k==0||xy[square_x+i][square_y+k-1])
                    goto L;
                break;
            }
        }
    }
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
            if(coord[s][i][k]){
                xy[square_x+i][square_y+k]=0;
                color[square_x+i][square_y+k]=0;
            }
    square_y-=1;
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
            if(coord[s][i][k]){
                xy[square_x+i][square_y+k]=1;
                color[square_x+i][square_y+k]=c;
            }
   L:
       ;
}
void right(int s,int c)
{
    for(i=0;i<4;i++){
        for(k=3;k>=0;k--){
            if(coord[s][i][k]){
                if(square_y+k==12||xy[square_x+i][square_y+k+1])
                    goto L;
                break;
            }
        }
    }
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
            if(coord[s][i][k]){
                xy[square_x+i][square_y+k]=0;
                color[square_x+i][square_y+k]=0;
            }
    square_y+=1;
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
            if(coord[s][i][k]){
                 xy[square_x+i][square_y+k]=1;
                 color[square_x+i][square_y+k]=c;
            }
   L:
       ;
}
int up(int &s,int c)
{
    if(s==1||s==3||s==5||s==7||s==8||s==9||s==11||s==12||s==13||s==15||s==16||s==17||s==22||s==24||s==26){
        for(i=0;i<4;i++)
            for(k=0;k<4;k++)
                if(coord[s][i][k]==0&&coord[s+1][i][k]==1){
                    if(xy[square_x+i][square_y+k])
                        return 0;
                }
        for(i=0;i<4;i++)
            for(k=0;k<4;k++){
                if(coord[s][i][k]==0&&coord[s+1][i][k]==1){
                    xy[square_x+i][square_y+k]=1;
                    color[square_x+i][square_y+k]=c;
                }
                else if(coord[s][i][k]==1&&coord[s+1][i][k]==0){
                    xy[square_x+i][square_y+k]=0;
                    color[square_x+i][square_y+k]=0;
                }
            }
        s+=1;
    }
    else if(s==2||s==4||s==6||s==23||s==25||s==27){
        for(i=0;i<4;i++)
            for(k=0;k<4;k++)
                if(coord[s][i][k]==0&&coord[s-1][i][k]==1)
                    if(xy[square_x+i][square_y+k])
                        return 0;
        for(i=0;i<4;i++)
            for(k=0;k<4;k++){
                if(coord[s][i][k]==0&&coord[s-1][i][k]==1){
                    xy[square_x+i][square_y+k]=1;
                    color[square_x+i][square_y+k]=c;
                }
                else if(coord[s][i][k]==1&&coord[s-1][i][k]==0){
                    xy[square_x+i][square_y+k]=0;
                    color[square_x+i][square_y+k]=0;
                }
            }
        s-=1;
    }
    else if(s==10||s==14||s==18){
        for(i=0;i<4;i++)
            for(k=0;k<4;k++)
                if(coord[s][i][k]==0&&coord[s-3][i][k]==1)
                    if(xy[square_x+i][square_y+k])
                        return 0;
        for(i=0;i<4;i++)
            for(k=0;k<4;k++){
                if(coord[s][i][k]==0&&coord[s-3][i][k]==1){
                    xy[square_x+i][square_y+k]=1;
                    color[square_x+i][square_y+k]=c;
                }
                else if(coord[s][i][k]==1&&coord[s-3][i][k]==0){
                    xy[square_x+i][square_y+k]=0;
                    color[square_x+i][square_y+k]=0;
                }
            }
        s-=3;
    }
    return 1;
}
int down(int s,int c)
{
    for(k=0;k<4;k++)
        for(i=3;i>=0;i--)
            if(coord[s][i][k]){
                if(square_x+i==22||xy[square_x+i+1][square_y+k])
                    return 0;
                break;
            }
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
            if(coord[s][i][k]){
                xy[square_x+i][square_y+k]=0;
                color[square_x+i][square_y+k]=0;
            }
    square_x+=1;
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
            if(coord[s][i][k]){
                xy[square_x+i][square_y+k]=1;
                color[square_x+i][square_y+k]=c;
            }
    return 1;
}
void Add_score()
{
    int h=0,bh;
    for(i=22;i>=0;i--){
        for(k=0;k<13;k++){
            if(xy[i][k]==0)
                break;
        }
        if(k==13){
            bh=i;
            h++;
        }
    }
    if(h){
        score+=h*h;
        level+=h;
        setcolor(hout,0,2);
        gotoxy(hout,3,11);
        cout<<score;
        gotoxy(hout,3,21);
        cout<<level;
        for(i=bh-1;i>=0;i--)
            for(k=0;k<13;k++){
                xy[i+h][k]=xy[i][k];
                color[i+h][k]=color[i][k];
            }
        for(i=0;i<h;i++)
            for(k=0;k<13;k++){
                xy[i][k]=0;
                color[i][k]=0;
            }
    }
}
int top()
{
    int i;
    for(i=0;i<13;i++)
        if(xy[0][i]==1)
            return 1;
    return 0;
}
void initial(int s,int c)
{
    for(i=0;i<4;i++)
        for(k=0;k<4;k++)
           if(coord[s][i][k]){
                xy[square_x+i][square_y+k]=1;
                color[square_x+i][square_y+k]=c;
           }
}
void all_print()
{
    for(i=0;i<23;i++){
        gotoxy(hout,15,6+i);
        for(k=0;k<13;k++){
            if(xy[i][k]){
                setcolor(hout,0,color[i][k]);
                cout<<"◎";
            }
            else{
                setcolor(hout,0,0);
                cout<<"  ";
            }
        }
    }
}
int main()
{
    char cmd[200];
    sprintf(cmd,"mode con cols=%d lines=%d",65,33);
    system(cmd);
    basic_structure();
    gotoxy(hout,0,33);setcolor(hout,0,7);
    shape_num1=rand()%28;
    color1=rand()%6+9;
    shape_num2=rand()%28;
    color2=rand()%6+9;
    int bottom;
    double start;
    while(top()==0){
        square_x=0;square_y=6;
        initial(shape_num1,color1);
        all_print();
        print_next(shape_num2,color2);
        bottom=1;
        while(bottom){
            start=clock();
            while(clock()-start<=1000.0/level&&!kbhit())
                ;
            if(kbhit()){
                key1=getch();
                if(key1==-32){
                    key2=getch();
                    if(key2=='H'){
                        i=up(shape_num1,color1);
                    }
                    else if(key2=='P'){
                        bottom=down(shape_num1,color1);
                        bottom=down(shape_num1,color1);
                    }
                    else if(key2=='K')
                        left(shape_num1,color1);
                    else if(key2=='M')
                        right(shape_num1,color1);
                }
            }
            else{
                bottom=down(shape_num1,color1);
            }
            all_print();
        }
        Add_score();
        all_print();
        shape_num1=shape_num2;
        color1=color2;
        shape_num2=rand()%28;
        color2=rand()%6+9;
    }
    gotoxy(hout,0,30);setcolor(hout,0,14);
    cout<<"-_-游戏结束-_-!"<<endl;
    setcolor(hout,0,7);
    return 0;
}

0
芮奥运
芮奥运
高级光能
高级光能

#include<iostream>
#include<vector>
using namespace std;

class qipan
{
public:
    qipan() {}
    ~qipan() {};


    //向上下左右,斜的方向
    char  left(int x, int y)
    {//检查是否合适
        if (x >= 1 && x <= hight&& y - 1 >= 1 && y - 1 <= width)
        {
            return q[x][y - 1];
        }
        else {
            return 'F';
        }

    }
    char  right(int x, int y)
    {
        if (x >= 1 && x <= hight&&y + 1 >= 1 && y + 1 <= width)
        {
            return q[x][y + 1];
        }
        else {
            return 'F';
        }

    }
    char  up(int x, int y)
    {
        if (x - 1 >= 1 && x - 1 <= hight && y >= 1 && y <= width)
        {
            return q[x - 1][y];
        }
        else {
            return 'F';
        }

    }
    char down(int x, int y)
    {
        if (x + 1 >= 1 && x + 1 <= hight && y >= 1 && y <= width)
        {
            return q[x + 1][y];
        }
        else {
            return 'F';
        }

    }
    char left_up(int x, int y)
    {
        if (x - 1 >= 1 && x - 1 <= hight && y - 1 >= 1 && y - 1 <= width)
        {
            return q[x - 1][y - 1];
        }
        else {
            return 'F';
        }

    }
    char  left_down(int x, int y)
    {
        if (x + 1 >= 1 && x + 1 <= hight && y - 1 >= 1 && y - 1 <= width)
        {
            return q[x + 1][y - 1];
        }
        else {
            return 'F';
        }

    }
    char right_up(int x, int y)
    {
        if (x - 1 >= 1 && x - 1 <= hight && y + 1 >= 1 && y + 1 <= width)
        {
            return q[x - 1][y + 1];

        }
        else {
            return 'F';
        }


    }
    char right_down(int x, int y)
    {
        if (x + 1 >= 1 && x + 1 <= hight && y + 1 >= 1 && y + 1 <= width)
        {
            return q[x + 1][y + 1];
        }
        else {
            return 'F';
        }
    }

    void init_cur() {
        h_cur = hang;
        l_cur = lie;

    }
    bool win()
    {
        bool WIN = false;
        char temp = q[hang][lie];

        //以上为例,每次先看上面的5个,假如一样,iter++;否则 break;再加上下的方向,同样iter++;最后iter+1==5,WIN=true;并且退出
        //各个方向重复,上下左右,斜着的。
        //赢了直接退出。
        //显示是谁赢了


        //左右
        int  count_lr = 1;
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (left(h_cur, l_cur) == temp)
                count_lr++;
            else
                break;
            l_cur--;

        }
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (right(h_cur, l_cur) == temp)
                count_lr++;
            else
                break;
            l_cur++;

        }
        if (count_lr == 5)
            WIN = true;
        //上下
        int  count_ud = 1;
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (up(h_cur, l_cur) == temp)
                count_ud++;
            else
                break;
            h_cur--;

        }
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (down(h_cur, l_cur) == temp)
                count_ud++;
            else
                break;
            h_cur++;

        }
        if (count_ud == 5)
            WIN = true;


        //左斜
        int  count_lt = 1;
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (left_up(h_cur, l_cur) == temp)
                count_lt++;
            else
                break;
            h_cur--;
            l_cur--;

        }
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (left_down(h_cur, l_cur) == temp)
                count_lt++;
            else
                break;
            h_cur++;
            l_cur--;

        }
        if (count_lt == 5)
            WIN = true;

        //右边斜
        int  count_rt = 1;
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (right_up(h_cur, l_cur) == temp)
                count_rt++;
            else
                break;
            h_cur--;
            l_cur++;

        }
        init_cur();
        for (int i = 0; i < 4; i++)
        {

            if (right_down(h_cur, l_cur) == temp)
                count_rt++;
            else
                break;
            h_cur++;
            l_cur++;

        }
        if (count_rt == 5)
            WIN = true;

        return WIN;
    }


    void qipan_array()
    {
        for (int i = 0; i < hight; i++) {
            for (int j = 0; j < width; j++)
                q[i][j] = '+';
        }
    }

    void prin_qipan()
    {
        //打印二维数组;每一行要打印上行号,以及列号
        for (int i = 0; i <hight; i++)
        {

            for (int j = 0; j < width; j++)
            {
                cout << q[i][j] << " ";

            }
            cout << i;
            cout << endl;
        }

        for (int j = 0; j <width; j++)
        {
            cout << j << " ";
        }
        cout << endl << "________________________________" << endl;
    }
    int xiaqi(int player)
    {
        if (player == 1) {
            q[hang][lie] = '*';
        }
        else if (player == 2)
        {
            q[hang][lie] = '@';
        }
        else
            cout << "input player is wrong" << endl;
        return 0;
    }

    //初始化行列
    int gethang(int h)
    {

        hang = h;
        return 0;
    }
    int getlie(int l)
    {
        lie = l;
        return 0;
    }


    int h_cur;
    int l_cur;
    const int hight = 9;
    const int width = 9;
    int hang; int lie;
    char q[9][9];
};

int main()
{
    int hang, lie;
    qipan wzq;
    wzq.qipan_array();
    cout << "A 与B 玩五子棋" << endl;
    cout << "A use * and B use @" << endl;
    cout << "________________________________" << endl;
    for (int i = 0; i < 15; i++) {
        cout << "A 输入行: ";
        cin >> hang;
        cout << "A 输入列: ";
        cin >> lie;
        if (wzq.q[hang][lie] != '+')
            cout << "输入的行列数字已经有人占据了" << endl;
        else {
            wzq.gethang(hang);
            wzq.getlie(lie);

            wzq.xiaqi(1);
            wzq.prin_qipan();
            if (wzq.win())
            {
                cout << "A is winner" << endl;
                exit(0);
            }
        }
        //b 开始了
        cout << "B 输入行: ";
        cin >> hang;
        cout << "B 输入列: ";
        cin >> lie;
        if (wzq.q[hang][lie] != '+')
            cout << "输入的行列数字已经有人占据了" << endl;
        else {
            wzq.gethang(hang);
            wzq.getlie(lie);

            wzq.xiaqi(2);

            wzq.prin_qipan();
            if (wzq.win())
            {
                cout << "B is winner" << endl;
                exit(0);
            }
        }
    }
    return 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<<"制作:张舒斌 "; 
    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)制作:张舒斌 "; 
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 <list>
#include <cstdio>
#include <string>
#include <vector>
#include <ctime>
#include <algorithm>
#include <conio.h>
#include <windows.h>
using namespace std;
 
class Node { 
public:
    int x, y;
    Node(int x1, int y1); 
};
 
class UserData { 
public:
    string name;
    long long score;
    int gt;
    int gr; 
    UserData(string s, long long sc,int gametime,int grade); 
    friend bool operator < (UserData a, UserData b); 
};
 
#define RIGHT 0x4d
#define LEFT 0x4b  
#define UP 0x48  
#define DOWN 0x50 
#define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define ORANGE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define PURPLE FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY
#define RED  FOREGROUND_RED | FOREGROUND_INTENSITY
const int STARTX = 8; 
const int STARTY = 4; 
const int RANGEX = 60; 
const int RANGEY = 20;
int point=10; 
const int ENDX = STARTX + RANGEX; 
const int ENDY = STARTY + RANGEY; 
bool isSnake[RANGEY + 10 ][RANGEX + 10];
int speed; 
int sysj;
int gametime;
list<Node> snake;
int curDiraction; //蛇的当前前进方向, 1上, 2下, 3左, 4右
int score; //当前分数
int grade;
int snakeLen; //蛇的长度
int foodx, foody; //食物坐标
int gox, goy; //蛇头坐标
int mj;
void GoTo(short x, short y); //定位光标
void DrawBoard(); //绘制边框
void ShowInformation(); //展示游戏信息
void Init(); //初始化游戏
void RunSnake(int x, int y); //绘制蛇身
void Try(int& x, int& y); //试走
bool IsGoodCoord(int x, int y); //前进坐标是否合法
void AddFood(); //增加食物
void EartFood(); //吃食物
void InitSnake(); //初始化蛇身
bool EndGame(); //结束游戏
bool StartGame(); //启动游戏
bool GameMenu(); //游戏菜单
void ShowRanking(); //排行榜
void ShowAbout(); //相关信息
void InputData(); //输入玩家名字
 
int main() {
    system("title 贪吃蛇小游戏 by 芮奥运");
    while (true) {
        if (!GameMenu()) return 0;
    }
    return 0;
}
 
Node::Node(int x1, int y1) { //构造Node对象
    x = x1; y = y1; 
}
 
bool operator < (UserData a, UserData b) { //重载运算符,按分数由大到小排列
    if(a.score != b.score)
    return a.score > b.score;
    if(a.gt !=b.gt)
    return a.gt > b.gt;
    else
    return a.gr > b.gr;
}
UserData::UserData(string s, long long sc,int gametime_,int _grade) { //构造UserData对象
    name = s; score = sc; gt=gametime_; gr=_grade;
}
 
void color(WORD A)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), A);

 
void Color(int score_)
{
    if(score_%4==1)
    {
        color(PURPLE);
    }
    else if(score_%4==2)
    {
        color(RED);
    }
    else if(score_%4==3)
    {
        color(YELLOW);
    }
    else if(score_%4==0) 
    {
        color(CYAN);
    }
}
 
void GoTo(short x, short y) { //定位光标
    COORD coord = { x, y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
 
void ShowInformation() { //输出游戏信息
    color(YELLOW);
    GoTo(78, 5);
    printf("贪吃蛇游戏");
    GoTo(78,18);
    gametime=(clock()-mj)/1000;
    grade=snakeLen-3; 
    printf("生存时间:%3d 秒",(clock()-mj)/1000);
    GoTo(78, 8);
    printf("游戏规则:");
    GoTo(78, 10);
    printf("请按 ↑ ↓ ← →  来控制您的蛇吃东西");
    GoTo(78, 12);
    printf("吃的越多,蛇就越长,您的等级也将越高");
    GoTo(78, 14);
    printf("当蛇吃到自己或撞上墙时,游戏结束。");
    GoTo(78,16);
    printf("自动前进时间:%3dms",speed);
    GoTo(78, 20);
    printf("当前等级: %8d", snakeLen-3);
    GoTo(78, 23);
    printf("您的分数: %d", score);
    color(CYAN);
    printf("+%d=%d",score/3,score*3/2);
    color(YELLOW);
    GoTo(78,25);
    printf("剩余时间:%d秒",10+(snakeLen-3)*4-gametime);
    sysj=10+(snakeLen-3)*4-gametime; 
}
 
void DrawBoard() { //绘制墙体
 
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获得输出句柄
 
    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; //光标信息
    SetConsoleCursorInfo(hOut, &cursor_info); //隐藏光标
 
    COORD size = { 120, 30 };
    SetConsoleScreenBufferSize(hOut, size); //重设缓冲区大小
 
    SMALL_RECT rc = { 0 , 0, 120, 30 };
    SetConsoleWindowInfo(hOut, true, &rc); //重设窗口大小
 
    SetConsoleTextAttribute(hOut, CYAN);
 
    for (int i = STARTX - 2; i <= ENDX + 2; i += 2) { //横向墙体
        GoTo(i, STARTY - 1);
        printf("■");
        GoTo(i, ENDY + 1);
        printf("■");
    }
    for (int i = STARTY - 1; i <= ENDY + 1; ++i) { //竖向墙体
        GoTo(STARTX - 2, i);
        printf("■");
        GoTo(ENDX + 2, i);
        printf("■");
    }
}
void draw()
{
    char m=snakeLen+62;
    Color(score);
    cout<<"■";
 } 
void Init() { //初始化游戏
    system("cls");
    memset(isSnake, 0, sizeof(isSnake));
    speed = 200;
    curDiraction = 4;
    score = 0;
    DrawBoard();
    InitSnake();
    ShowInformation();
    AddFood();
    mj=clock();
    point=10;
    sysj=10;
}
 
void RunSnake(int x, int y) { //绘制蛇身
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
    score += snakeLen + 1;
    if (x == foodx && y == foody) {
        EartFood();
        AddFood();
        return;
    }
    snake.push_front(Node(x, y));
    isSnake[y][x] = true;
    GoTo(x, y);
    draw();
    Node back = snake.back();
    snake.pop_back();
    isSnake[back.y][back.x] = false;
    GoTo(back.x, back.y);
    printf(" ");
}
 
void Try(int& x, int& y) { //试走
    int key, cnt = 100;
    while (cnt--) { //多次检测键盘状态
        if (_kbhit()) {
            key = getch();
            switch (key) {
            case UP: 
                if (curDiraction == 1 || curDiraction == 2) break;
                --y; curDiraction = 1; return;
            case DOWN: 
                if (curDiraction == 1 || curDiraction == 2) break;
                ++y; curDiraction = 2; return;
            case LEFT: 
                if (curDiraction == 3 || curDiraction == 4) break;
                x -= 2; curDiraction = 3; return;
            case RIGHT: 
                if (curDiraction == 3 || curDiraction == 4) break;
                x += 2; curDiraction = 4; return;
            }
        }
    }
    if (curDiraction == 1) --y; //用户没有输入时
    else if (curDiraction == 2) ++y;
    else if (curDiraction == 3) x -= 2;
    else x += 2;
}
 
bool IsGoodCoord(int x, int y) { //判断光标是否合法
    if (x <= ENDX && y <= ENDY && x >= STARTX && y >= STARTY)
        return true;
    else
        return false;
}
 
void AddFood() { //增加食物
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);
    srand((unsigned)time(NULL));
    while (true) {
        foodx = (rand()%ENDX) + 1;
        foody = (rand()%ENDY) + 1;
        if (foodx&1) foodx++;
        if (!isSnake[foody][foodx] && IsGoodCoord(foodx, foody)) break;
    }
    GoTo(foodx, foody);
    int a=rand()%5;
    if(a>=4) 
    printf("★");
    else if(a<=1) 
    printf("○");
    else
    printf("▲");
}
 
void EartFood() { //吃东西
    point+=4;
    int sb=gametime=(clock()-mj)/1000;
    sysj=point-sb;
    score+=score/2;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
    snake.push_front(Node(foodx, foody));
    isSnake[foody][foodx] = true;
    ++snakeLen;
    if (speed >= 55) speed -= 5;
 
    GoTo(foodx, foody);
    draw();
    AddFood(); 
}
 
void InitSnake() { //初始化蛇身
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
    snakeLen = 3, gox = 18, goy = 14;
    snake.clear();
    snake.push_front(Node(12, 14));
    snake.push_front(Node(14, 14));
    snake.push_front(Node(16, 14));
    for (int i = 12; i <= 16; i += 2) {
        GoTo(i, 14);
        draw();
        isSnake[14][i] = true;
    }
}
bool EndGame() { //结束游戏
    system("cls");
    DrawBoard();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
    GoTo(28, 10);
    printf("您的本局游戏得分: %d分", score);
    GoTo(32, 18);
    printf("....你挂了....");
    GoTo(27, 20);
    printf("是否继续游戏: 是(1), 否(0)");
    GoTo(27, 22);
    char key = getch();
    while (true) {
        if (key == '1') return false;
        else if (key == '0') 
        {GoTo(ENDX+1,ENDY+2);
        exit(0);return true;
        }
        else key = getch();
    }
}
 
bool StartGame() { //启动游戏
 
    Init();
 
    while (IsGoodCoord(gox, goy) && !isSnake[goy][gox]&&sysj>0) { //当试走合法时
        RunSnake(gox, goy);
        ShowInformation();
        Try(gox, goy);
        Sleep(speed);
    }
    InputData(); 
    return true;
}
 
bool GameMenu() { //游戏菜单
    system("cls");
    DrawBoard();
    GoTo(STARTX + 22, STARTY + 4);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
    printf("欢迎进入贪吃蛇游戏!");
    GoTo(STARTX + 24, STARTY + 10);
    printf("1: 新游戏");
    GoTo(STARTX + 24, STARTY + 12);
    printf("2: 排行榜");
    GoTo(STARTX + 24, STARTY + 14);
    printf("3: 关于游戏");
    GoTo(STARTX + 24, STARTY + 16);
    printf("4: 退出游戏");
 
    while (true) {
        if (_kbhit()) {
            char key = getch();
            switch (key) {
            case '1':
                if (!StartGame()) return false; 
                else return true;
            case '2':
                ShowRanking(); return true;
            case '3':
                ShowAbout(); return true;
            case '4':
                GoTo(1,ENDY+2);
                return false;
            default:
                return true;
            }
        }
    }
}
 
void ShowRanking() { //展示排行榜
    vector<UserData> vu;
    FILE *fp = fopen("GameData.txt", "r");
    if (fp == NULL) fp = fopen("GameData.txt", "w+");
    char name[20];
    int len = 0;
    while (fscanf(fp, "%s", name) != EOF) {
        ++len;
        int score,g=grade;
        fscanf(fp, "%d%d%d%*c", &score,&gametime,&g);
        vu.push_back(UserData(string(name), score,gametime,grade));
    }
    fclose(fp);
    sort(vu.begin(), vu.end()); //对得分进行排名
    system("cls");
    DrawBoard();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
    GoTo(STARTX + 8, STARTY + 2);
    printf("用户");
    GoTo(STARTX + 20, STARTY + 2);
    printf("分数");
    GoTo(STARTX + 32, STARTY + 2);
    printf("生存时间");
    GoTo(STARTX + 44, STARTY + 2);
    printf("排行");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
 
    for (int i = 0; i < len && i < 10; ++i) { //打印前十名用户数据
        char const *p = vu[i].name.c_str();
        Color(vu[i].score);
        GoTo(STARTX + 8, STARTY + 4 + i);
        printf("%s", p);
        GoTo(STARTX + 20, STARTY + 4 + i);
        printf("%d分", vu[i].score);
        GoTo(STARTX + 32, STARTY + 4 + i);
        printf("%d秒", vu[i].gt);
        GoTo(STARTX + 44, STARTY + 4 + i);
        printf(" %d", i + 1);
    }
 
    GoTo(STARTX + 4, ENDY - 2);
    printf("-----------------  按'1'返回游戏菜单  ---------------");
    while (true) {
        if (_kbhit()) {
            char key = getch();
            if (key == '1') break;
        }
    }
}
 
void ShowAbout() { //展示游戏相关
    system("cls");
    DrawBoard();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
 
    GoTo(STARTX + 4, STARTY + 2);
    printf("-------------------  贪吃蛇游戏  -------------------");
    GoTo(STARTX + 10, STARTY + 4);
    printf("制作人: ");
    GoTo(STARTX + 10, STARTY + 6);
    printf("芮奥运");
    GoTo(STARTX + 10,STARTY + 8);
    printf("贪吃蛇游戏");
    GoTo(STARTX + 10,STARTY + 10);
    printf("游戏规则:");
    GoTo(STARTX + 10,STARTY + 12);
    printf("请按 ↑ ↓ ← →  来控制您的蛇吃东西");
    GoTo(STARTX + 10,STARTY + 14);
    printf("吃的越多,蛇就越长,您的等级也将越高");
    GoTo(STARTX + 10,STARTY + 16);
    printf("当蛇吃到自己或撞上墙时,游戏结束。");
 
    GoTo(STARTX + 4, ENDY - 2);
    printf("-----------------  按'1'返回游戏菜单  ---------------");
    while (true) {
        if (_kbhit()) {
            char key = getch();
            if (key == '1') break;
        }
    }
}
 
void InputData() { //用户输入名字
    char name[20];
    if(score>=1000)
    {
    GoTo(STARTX + 10, STARTY + 10);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RED);
    printf("请输入你的名字: ");
    COORD coord = { STARTX + 10, STARTY + 12 };
    SetConsoleCursorPosition(GetStdHandle(STD_INPUT_HANDLE), coord);
    while (true) { //忽略非法字符
        scanf("%s", name);
        if (name[0] != 0 && name[0] != ' ') break; 
    }FILE *fp = fopen("Gamedata.txt", "a");
    if (fp == NULL) fp = fopen("GameData.txt", "w+");
    fprintf(fp, "%s %d %d \n", name, score,gametime);
    fclose(fp);
    }
    else 
    {
        GoTo(STARTX + 20, STARTY + 10);
        cout<<"哟!这分数也能上榜??"<<endl; 
        Sleep(1000);
     }  
    EndGame(); 
 
}

0
芮奥运
芮奥运
高级光能
高级光能

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<string>
using namespace std;
typedef struct Frame
{
    COORD position[2];
    int flag;
}Frame;
void SetPos(COORD a)
{
    HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(out, a);
}
void SetPos(int i, int j)
{
    COORD pos={i, j};
    SetPos(pos);
}
void HideCursor()
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
 
//把第y行,[x1, x2) 之间的坐标填充为 ch
void drawRow(int y, int x1, int x2, char ch)
{
    SetPos(x1,y);
    for(int i = 0; i <= (x2-x1); i++) cout<<ch;
}
 
//在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawRow(COORD a, COORD b, char ch)
{
    if(a.Y == b.Y) drawRow(a.Y, a.X, b.X, ch);
    else {
        SetPos(0, 25);
        cout<<"error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";
        system("pause");
    }
}
 
//把第x列,[y1, y2] 之间的坐标填充为 ch
void drawCol(int x, int y1, int y2, char ch)
{
    int y=y1;
    while(y!=y2+1) {
        SetPos(x, y);
        cout<<ch;
        y++;
    }
}
 
//在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawCol(COORD a, COORD b, char ch)
{
    if(a.X == b.X) drawCol(a.X, a.Y, b.Y, ch);
    else {
        SetPos(0, 25);
        cout<<"error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";
        system("pause");
    }
}
 
//左上角坐标、右下角坐标、用row填充行、用col填充列
void drawFrame(COORD a, COORD  b, char row, char col)
{
    drawRow(a.Y, a.X+1, b.X-1, row);
    drawRow(b.Y, a.X+1, b.X-1, row);
    drawCol(a.X, a.Y+1, b.Y-1, col);
    drawCol(b.X, a.Y+1, b.Y-1, col);
}
 
void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
{
    COORD a={x1, y1};
    COORD b={x2, y2};
    drawFrame(a, b, row, col);
}
 
void drawFrame(Frame frame, char row, char col)
{
    COORD a = frame.position[0];
    COORD b = frame.position[1];
    drawFrame(a, b, row, col);
}
 
void drawPlaying()
{
    drawFrame(0, 0, 48, 24, '=', '|');//    draw map frame;
    drawFrame(49, 0, 79, 4, '-', '|');//        draw output frame
    drawFrame(49, 4, 79, 9, '-', '|');//        draw score frame
    drawFrame(49, 9, 79, 20, '-', '|');//   draw operate frame
    drawFrame(49, 20, 79, 24, '-', '|');//  draw other message frame
    SetPos(52, 6);
    cout<<"得分:";
    SetPos(52, 7);
    cout<<"称号:";
    SetPos(52,10);
    cout<<"操作方式:";
    SetPos(52,12);
    cout<<"  a,s,d,w 控制战机移动。";
    SetPos(52,14);
    cout<<"  p 暂停游戏。";
    SetPos(52,16);
    cout<<"  e 退出游戏。";
    SetPos(52,18);
    cout<<"  k 发射火箭。";
}
 
//在[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<<"Plane War";
    drawRow(3, 0, 79, '-');
    drawRow(5, 0, 79, '-');
    SetPos(28, 4);
    cout<<"w 和 s 选择, k 确定";
    SetPos(15, 11);
    cout<<"1. 简单的敌人";
    SetPos(15, 13);
    cout<<"2. 冷酷的敌人";
    drawRow(20, 0, 79, '-');
    drawRow(22, 0, 79, '-');
    SetPos(47, 11);
    cout<<"简单的敌人:";
    SetPos(51, 13);
    cout<<"简单敌人有着较慢的移动速度。";
    int j=11;
    cout<<">>";
    while(1) {
        if( _kbhit() ) {    
            char x=_getch();
            switch (x) {
              case 'w' : {  
                if( j == 13) {
                  SetPos(12, j);
                  cout<<" ";
                  j = 11;
                  SetPos(12, j);
                  cout<<">>";
                  SetPos(51, 13);
                  cout<<"            ";
                  SetPos(47, 11);
                  cout<<"简单的敌人:";
                  SetPos(51, 13);
                  cout<<"简单的敌人有着较慢的移动速度。";
                }
                break;
              }
              case 's' : {  
                if( j == 11 ) {
                  SetPos(12, j);
                  cout<<" ";        
                  j = 13;
                  SetPos(12, j);
                  cout<<">>";
                  SetPos(51, 13);
                   cout<<"              ";
                   SetPos(47, 11);
                   cout<<"冷酷的敌人:";
                   SetPos(51, 13);
                   cout<<"冷酷的敌人有着较快的移动速度。";
                }
                break;
              }
              case 'k' : {  
                if (j == 8) return 1; else return 2;
              }
            }
        }
    }
}
/*================== the Game Class ==================*/
 
class Game
{
public:
    COORD position[10];
    COORD bullet[10];
    Frame enemy[8];
    int score;
    int rank;
    int rankf;
    string title;
    int flag_rank;
 
    Game ();
 
    //初始化所有
    void initPlane();
    void initBullet();
    void initEnemy();
 
    //初始化其中一个
    //void initThisBullet( COORD );
    //void initThisEnemy( Frame );
 
    void planeMove(char);
    void bulletMove();
    void enemyMove();
 
    //填充所有
    void drawPlane();
    void drawPlaneToNull();
    void drawBullet();
    void drawBulletToNull();
    void drawEnemy();
    void drawEnemyToNull();
 
    //填充其中一个
    void drawThisBulletToNull( COORD );
    void drawThisEnemyToNull( Frame );
 
    void Pause();
    void Playing();
    void judgePlane();
    void judgeEnemy();
 
    void Shoot();
 
    void GameOver();
    void printScore();
};
 
Game::Game()
{
    initPlane();
    initBullet();
    initEnemy();
    score = 0;
    rank = 25;
    rankf = 0;
    flag_rank = 0;
}
 
void Game::initPlane()
{
    COORD centren={39, 22};
    position[0].X=position[5].X=position[7].X=position[9].X=centren.X;
    position[1].X=centren.X-2;  
    position[2].X=position[6].X=centren.X-1;
    position[3].X=position[8].X=centren.X+1;
    position[4].X=centren.X+2;
    for(int i=0; i<=4; i++)
        position[i].Y=centren.Y;
    for(int i=6; i<=8; i++)
        position[i].Y=centren.Y+1;
    position[5].Y=centren.Y-1;
    position[9].Y=centren.Y-2;
}
 
void Game::drawPlane()
{
    for(int i=0; i<9; i++)
    {
        SetPos(position[i]);
        if(i!=5)
            cout<<"O";
        else if(i==5)
            cout<<"|";      
    }
}
 
void Game::drawPlaneToNull()
{
    for(int i=0; i<9; i++)
    {
        SetPos(position[i]);
        cout<<" ";
    }   
}
 
void Game::initBullet()
{
    for(int i=0; i<10; i++)
        bullet[i].Y = 30;
}
 
void Game::drawBullet()
{
    for(int i=0; i<10; i++)
    {
        if( bullet[i].Y != 30)
        {
            SetPos(bullet[i]);
            cout<<"^";  
        }
    }
}
 
void Game::drawBulletToNull()
{
    for(int i=0; i<10; i++)
        if( bullet[i].Y != 30 )
            {
                COORD pos={bullet[i].X, bullet[i].Y+1};
                SetPos(pos);
                cout<<" ";
            }   
}
 
void Game::initEnemy()
{
    COORD a={1, 1};
    COORD b={45, 15};
    for(int i=0; i<8; i++)
    {
        enemy[i].position[0] = random(a, b);
        enemy[i].position[1].X = enemy[i].position[0].X + 3;
        enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
    }
}
 
void Game::drawEnemy()
{
    for(int i=0; i<8; i++)
        drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
}
 
void Game::drawEnemyToNull()
{
    for(int i=0; i<8; i++)
    {
        drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');
    }       
}
 
void Game::Pause()
{
    SetPos(61,2);
    cout<<"               ";
    SetPos(61,2);
    cout<<"暂停中...";
    char c=_getch();
    while(c!='p')
        c=_getch();
    SetPos(61,2);
    cout<<"         ";
}
 
void Game::planeMove(char x)
{
    if(x == 'a')
        if(position[1].X != 1)
            for(int i=0; i<=9; i++)
                position[i].X -= 2;
 
    if(x == 's')
        if(position[7].Y != 23)
            for(int i=0; i<=9; i++)
                position[i].Y += 1;
 
    if(x == 'd')
        if(position[4].X != 47)
            for(int i=0; i<=9; i++)
                position[i].X += 2;
 
    if(x == 'w')
        if(position[5].Y != 3)
            for(int i=0; i<=9; i++)
                position[i].Y -= 1;
}
 
void Game::bulletMove()
{
    for(int i=0; i<10; i++)
    {
        if( bullet[i].Y != 30)
        {
            bullet[i].Y -= 1;
            if( bullet[i].Y == 1 )
            {
                COORD pos={bullet[i].X, bullet[i].Y+1};
                drawThisBulletToNull( pos );
                bullet[i].Y=30;
            }
 
        }
    }
}
 
void Game::enemyMove()
{
    for(int i=0; i<8; i++)
    {
        for(int j=0; j<2; j++)
            enemy[i].position[j].Y++;
 
        if(24 == enemy[i].position[1].Y)
        {
            COORD a={1, 1};
            COORD b={45, 3};
            enemy[i].position[0] = random(a, b);
            enemy[i].position[1].X = enemy[i].position[0].X + 3;
            enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
        }
    }
}
 
void Game::judgePlane()
{
    for(int i = 0; i < 8; i++)
        for(int j=0; j<9; j++)
            if(judgeCoordInFrame(enemy[i], position[j]))
            {
                SetPos(62, 1);
                cout<<"坠毁";
                drawFrame(enemy[i], '+', '+');
                Sleep(1000);
                GameOver();
                break;
            }
}
 
void Game::drawThisBulletToNull( COORD c)
{
    SetPos(c);
    cout<<" ";
}
 
void Game::drawThisEnemyToNull( Frame f )
{
    drawFrame(f, ' ', ' ');
}
 
void Game::judgeEnemy()
{
    for(int i = 0; i < 8; i++)
        for(int j = 0; j < 10; j++)
            if( judgeCoordInFrame(enemy[i], bullet[j]) )
            {
                score += 5;
                drawThisEnemyToNull( enemy[i] );
                COORD a={1, 1};
                COORD b={45, 3};
                enemy[i].position[0] = random(a, b);
                enemy[i].position[1].X = enemy[i].position[0].X + 3;
                enemy[i].position[1].Y = enemy[i].position[0].Y + 2;                    
                drawThisBulletToNull( bullet[j] );
                bullet[j].Y = 30;
            }
}
 
void Game::Shoot()
{
    for(int i=0; i<10; i++)
        if(bullet[i].Y == 30)
        {
            bullet[i].X = position[5].X;
            bullet[i].Y = position[5].Y-1;
            break;
        }
}
 
void Game::printScore()
{
    if(score == 120 && flag_rank == 0)
    {
        rank -= 3;
        flag_rank = 1;
    }
 
    else if( score == 360 && flag_rank == 1)
    {
        rank -= 5;
        flag_rank = 2;
    }
    else if( score == 480 && flag_rank == 2)
    {
        rank -= 5;
        flag_rank = 3;
    }
    int x=rank/5;
    SetPos(60, 6);
    cout<<score;
    if( rank!=rankf )
    {
        SetPos(60, 7);
        if( x == 4)
            title="初级飞行员";
        else if( x == 3)
            title="中级飞行员";
        else if( x == 2)
            title="高级飞行员";
        else if( x == 1 )
            title="王牌飞行员";
        cout<<title;
    }
    rankf = rank;
}
 
void Game::Playing()
{
    //HANDLE MFUN;
    //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL); 
 
    drawEnemy();
    drawPlane();
 
    int flag_bullet = 0;
    int flag_enemy = 0;
 
    while(1)
    {
        Sleep(8);
        if(_kbhit())
        {
            char x = _getch();
            if ('a' == x || 's' == x || 'd' == x || 'w' == x)
            {
                drawPlaneToNull();
                planeMove(x);
                drawPlane();
                judgePlane();
            }           
            else if ('p' == x)
                Pause();
            else if( 'k' == x)
                Shoot();
            else if( 'e' == x)
            {
                //CloseHandle(MFUN);
                GameOver();
                break;
            }
 
        }
        /* 处理子弹 */
        if( 0 == flag_bullet )
        {
            bulletMove();
            drawBulletToNull();
            drawBullet();
            judgeEnemy();
        }           
        flag_bullet++;
        if( 5 == flag_bullet )
            flag_bullet = 0;
 
        /* 处理敌人 */
        if( 0 == flag_enemy )
        {
            drawEnemyToNull();
            enemyMove();            
            drawEnemy();
            judgePlane();
        }
        flag_enemy++;
        if( flag_enemy >= rank )
            flag_enemy = 0;
 
        /* 输出得分 */
        printScore();
    }
}
 
void Game::GameOver()
{
    system("cls");              
    COORD p1={28,9};
    COORD p2={53,15};
    drawFrame(p1, p2, '=', '|');
    SetPos(36,12);
    string str="Game Over!";
    for(int i=0; i<str.size(); i++)
    {
        Sleep(80);
        cout<<str[i];
    }
    Sleep(1000);
    system("cls");
    drawFrame(p1, p2, '=', '|');
    SetPos(31, 11);
    cout<<"击落敌机:"<<score/5<<" 架";
    SetPos(31, 12);
    cout<<"得  分:"<<score;
    SetPos(31, 13);
    cout<<"获得称号:"<<title;
    SetPos(30, 16);
    Sleep(1000);
    cout<<"继续? 是(y)| 否(n)";
as:
    char x=_getch();
    if (x == 'n')
        exit(0);
    else if (x == 'y')
    {
        system("cls");
        Game game;
        int a = drawMenu();
        if(a == 2)
            game.rank = 20;
        system("cls");
        drawPlaying();
        game.Playing();
    }
    else goto as;
}
 
/*================== the main function ==================*/
int main()
{
    cout << string(13, '\n');
    cout << string(50, ' ') << "Game Loading" << endl << ".";
    Sleep(500);
    cout << "\t.";
    Sleep(500);
    cout << "\t\t.";
    Sleep(500);
    cout << "\t\t\t.";
    Sleep(500);
    cout << "\t\t\t.";
    Sleep(500);
    cout << "\t\t.";
    Sleep(500);
    cout << "\t\t.";
    Sleep(500);
    cout << "\t.";
    Sleep(2000);
    system("cls");
    //游戏准备
    srand((int)time(0));    //随机种子
    HideCursor();   //隐藏光标
 
    Game game;
    int a = drawMenu();
    if(a == 2)
        game.rank = 20;
    system("cls");
    drawPlaying();
    game.Playing();
}

0
宫西诚
宫西诚
修练者
修练者
#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
0
我要回答