问题标题: 谁有c++游戏代码?

0
0

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

俄罗斯方块:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

vector <xBlock> xBlock::List;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

1
王子凡
王子凡
高级光能
高级光能

扫雷

#include <iostream>
#include<fstream>
#include <ctime>
#include <cmath>
#include <stdlib.h>
#include<stdio.h> //时间 //文件
#include <string>
#define random(x)(rand()%x)
using namespace std;
void thunder(int Dif,int Row,int Column,char *USer)
{
    int r,c,alls[22][22],backstage[22][22]={0};
    srand((int)time(0));
    for(r=1;r<=Row;r++)                                      // 生成alls(0~1)1是雷
    {
        for(c=1;c<=Column;c++)
        {
            if(random(6)<1)  {alls[r][c]=1;} else{alls[r][c]=0;};
        }
    };
    for(r=0;r<=Row+1;r++)                                //生成 backstage(正确答案)
    {
        for(int c=0;c<=Column+1;c++)
        {
            if(alls[r][c]==1)  
            {
                (int)backstage[r][c]='*';             //将1变为 *  代表雷
            }
            else
            {
                for(int i=r-1;i<=r+1;i++)             //将0变为数字 (代表周围雷数)
                    for(int j=c-1;j<=c+1;j++)
                    {

                        if(alls[i][j]!=alls[r][c]&&alls[i][j]==1){backstage[r][c]++;};
                    }
            };  //else 结束 
        };    // for 结束
    };          // for 结束 
    cout<<"======================*********================================"<<endl;
    char surface[22][22];              //生成surface(用户界面)
    for(r=0;r<22;r++)                  //全部为零
        for(c=0;c<22;c++)
        {
            surface[r][c]='0';
        }
    for(r=1;r<=Row;r++)                 //中间化 #   形成0包围#的形式  (通过数  #-->(*||数字) 的个数  赢的时候停止循环)
        for(c=1;c<=Column;c++)
        {
            surface[r][c]='#';
        }
    for(r=1;r<=Row;r++)                      //输出  surface   界面  便于检查
    {
        for(c=1;c<=Column;c++) {cout<<"  "<<surface[r][c];}; 
        cout<<endl;
    };
    cout<<"请按格式输入"<<endl
        <<"前两个数字为坐标,最后一个数字“1”表示此位置为雷,“0”则表示不是。"<<endl
        <<"如:1 3 1  表示一行三列是雷;2 4 0 表示二行四列不是雷"<<endl
        <<"提示:当数字周围雷都被扫出时,可再次按要求输入此位置,可得到周围数字。"<<endl;
    long  i=10000000L;         //计算时间开始
    clock_t start,finish;
    double duration;
    start=clock();             
    while(i--);                //计算时间开始
    int num=Row*Column;        //计算#号个数
    while(num!=0)              //控制 是否点完所有位置
    {
        int x,y,judge;
       cin>>x>>y>>judge; 
       if(alls[x][y]!=judge)
        {
            cout<<"you lose!!!"<<endl;
            cout<<"The answer is:"<<endl;
            for(r=1;r<=Row;r++)                    //输了   输出backstage  显示正确答案
                {
                  for(int c=1;c<=Column;c++)
                  {
                     cout<<"  "<<(char)(backstage[r][c]==42?backstage[r][c]:backstage[r][c]+'0');  //输出backstage
                  }
                  cout<<endl;
                }
            break;
        }
       else                                      
        {
            if(alls[x][y]==1)  {if(surface[x][y]=='#'){num--;}surface[x][y]='@'; }      // 雷 判断正确 显示“@”;数“#”
            else
            {
                if(backstage[x][y]!=0)                                                  //  数字 判断正确 显示数字
                {
                    if(surface[x][y]=='#'){num--; surface[x][y]=backstage[x][y]+'0'; }  //   数“#”
                   else
                    {
                        int lei_num=0;
                       for(int i=x-1;i<=x+1;i++)                                         //数 数字周围 雷的个数                                     
                            for(int j=y-1;j<=y+1;j++)
                            {
                                if(surface[i][j]=='@')
                               lei_num++;
                            }
                       if(backstage[x][y]==lei_num)                                   // 看数字周围雷是否全部扫出  提示 显示数字周围
                        {
                            for(int i=x-1;i<=x+1;i++)
                                for(int j=y-1;j<=y+1;j++)
                                        if(surface[i][j]=='#')                         //数“#”
                                        {
                                            surface[i][j]=backstage[i][j]+'0';
                                            num--;   
                                        }
                        }
                    }
                }
                else                                                                   // 数字为零时   显示零周围的零
                {
                    if(surface[x][y]=='#'){num--;};                                    //数“#”
                   surface[x][y]=backstage[x][y]+'0';
                    for(int i=x-1;i<=x+1;i++)                                          //  显示零周围的数字
                        for(int j=y-1;j<=y+1;j++)
                            if(surface[i][j]=='#')                                     // 避免 死循环
                            {
                                surface[i][j]=backstage[i][j]+'0';               
                                num--;                                                 //数“#”
                            }
                            for(int k=0;k<20;k++)                                       //最多20层零 (点出最边上的零)
                            {
                                for (int R=1;R<=Row;R++)                                //检查所有零
                                    for(int C=1;C<=Column;C++)                          //再次显示零周围的数字
                                    {
                                        if(surface[R][C]=='0')
                                        {
                                            for(int i=R-1;i<=R+1;i++)
                                                for(int j=C-1;j<=C+1;j++)
                                                {
                                                    if(surface[i][j]=='#')                         // 避免 死循环 数“#”
                                                    {
                                                        surface[i][j]=backstage[i][j]+'0';
                                                        num--;
                                                    }  
                                                }
                                        }
                                    } //匹配for 内 
                            } //匹配 for 外
                }//匹配else
            }//匹配else
        }//匹配els
        cout<<endl;
        cout<<"======================*********================================"<<endl;
        for(r=1;r<=Row;r++)                                                                          //输出界面(已修改)
        {
            for(c=1;c<=Column;c++) {cout<<"  "<<surface[r][c];};
            cout<<endl;
        };
    }                                                                                               //匹配while
    finish=clock();                                                                                //计算时间结束
    duration=(double)(finish-start)/CLOCKS_PER_SEC;                                                //时间变量
    if(num==0)                                                                                      //所有
    {
        cout<<"              You win!  Congratulations!!                 "<<endl;
        cout<<"                Your time is: "<<duration<<endl;
        if(Dif==1)                                                                            //读取 简单扫雷 的存储文件
        {
            string Name;
           string name[6];
           double Time,rang;
           double times[6];
           int i=0;
           ifstream inf("扫雷 简单.txt");
           for(i=0;i<5;i++)                                                                    //文件中信息导入到数组里
            {
                inf>>Name;inf>>rang>>Time;
               name[i]=Name;
               times[i]=Time;
            }
            inf.close();
            name[5]=USer;                                                                   //本轮玩家信息
            times[5]=duration;
           double t1=0;
           string t2;
            for(int j=0;j<5;j++)                                                               //冒泡排序法
            {                    
                for(i=0;i<5-j;i++)
                {
                    if(times[i]>times[i+1])
                    {
                        t1=times[i];
                       times[i]=times[i+1];
                       times[i+1]=t1;
                       t2=name[i];
                       name[i]=name[i+1];
                       name[i+1]=t2;
                    }
                }
            }
            ofstream outf("扫雷 简单.txt");
           for(i=0;i<5;i++)                                                                   //将前五名玩家信息存储到文件中
            {
                cout<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
               outf<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
            }
           outf.close();
        }
        if(Dif==2)                                                                            //读取 一般扫雷 的存储文件
        {
            string Name;
           string name[6];
           double Time,rang;
           double times[6];
           int i=0;
           ifstream inf("扫雷 一般.txt");
           for(i=0;i<5;i++)                                                                    //文件中信息导入到数组里
            {
                inf>>Name;inf>>rang>>Time;
               name[i]=Name;
               times[i]=Time;
            }
            inf.close();
            name[5]=USer;                                                                   //本轮玩家信息
            times[5]=duration;
           double t1=0;
           string t2;
            for(int j=0;j<5;j++)                                                               //冒泡排序法
            {                    
                for(i=0;i<5-j;i++)
                {
                    if(times[i]>times[i+1])
                    {
                        t1=times[i];
                       times[i]=times[i+1];
                       times[i+1]=t1;
                       t2=name[i];
                       name[i]=name[i+1];
                       name[i+1]=t2;
                    }
                }
            }
            ofstream outf("扫雷 一般.txt");
           for(i=0;i<5;i++)                                                                   //将前五名玩家信息存储到文件中 并输出
            {
                cout<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
               outf<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
            }
           outf.close();
        }
        if(Dif==3)                                                                            //读取 困难扫雷 的存储文件
        {
            string Name;
           string name[6];
           double Time,rang;
           double times[6];
           int i=0;
           ifstream inf("扫雷 困难.txt");
           for(i=0;i<5;i++)                                                                    //文件中信息导入到数组里
            {
                inf>>Name;inf>>rang>>Time;
               name[i]=Name;
               times[i]=Time;
            }
            inf.close();
            name[5]=USer;                                                                   //本轮玩家信息
            times[5]=duration;
           double t1=0;
           string t2;
            for(int j=0;j<5;j++)                                                               //冒泡排序法
            {                    
                for(i=0;i<5-j;i++)
                {
                    if(times[i]>times[i+1])
                    {
                        t1=times[i];
                       times[i]=times[i+1];
                       times[i+1]=t1;
                       t2=name[i];
                       name[i]=name[i+1];
                       name[i+1]=t2;
                    }
                }
            }
            ofstream outf("扫雷 困难.txt");
           for(i=0;i<5;i++)                                                                   //将前五名玩家信息存储到文件中
            {
                cout<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
               outf<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
            }
           outf.close();
        }
    }
}
void scale(int dif,char *User)    //选择难度
{
    int row,column;
    if(dif==1) {row=3;column=3;}
    if(dif==2) {row=7;column=7;}
    if(dif==3)  {row=10;column=10;}
    cout<<"The scale is: "<<row<<"*"<<column<<endl;
    thunder(dif,row,column,User);
};
int main()
{   
    int Continue=1;
    int difficulty;
    char user[10];
    cout<<"                       Welcom to the game!                  "<<endl
        <<"                         请输入用户名!                      "<<endl;
    cin>>user;
    while(Continue==1)
    {
       cout<<"=======================*******************======================="<<endl
           <<"                          请选择难度!                        "<<endl
           <<"                          简单——1                           "<<endl
           <<"                          一般——2                           "<<endl
           <<"                          困难——3                           "<<endl;
       cin>>difficulty;
       scale(difficulty,user);
        cout<<"继续游戏——1     结束游戏——0"<<endl;
        cin>>Continue;
    }
    return 0;
}

 

0
0
蒋智航
蒋智航
高级天翼
高级天翼

我加你QQ,我给予你一些游戏代码,我有200多个代码了

0
0
0
0
0
0
0
蒋智航
蒋智航
高级天翼
高级天翼

(int)backstage[r][c]='*';             //将1变为 *  代表雷  

那一行把int去掉

我要回答