爆破小游戏2.0

如题,我复活了seepseek支持下制
cpp 复制代码
#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
using namespace std;

// 全局变量
int m[10001][21];
struct node {int xx,yy,Zhong,rr,mr;} B[100001];
struct Item {
    int x, y, type, time;
} items[1001];
int itemCount = 0;
int K,X,Y,tX,tY,tY2,tT,Er,T,Yb,Zb,Blood,Score,Kb;
int combo = 0, comboTime = 0;
int weather = 0, weatherTime = 0;
bool isInvincible = false;
int invincibleTime = 0;
int gameSpeed = 50; // 游戏基础速度
int difficulty = 0; // 难度系数
int maxCombo = 0; // 最高连击
bool gameOver = false; // 游戏结束标志

// 颜色设置 - 简化版
void Color(int a)
{
    if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); // 白色
    if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE); // 青色
    if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN); // 绿色
    if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE); // 紫色
    if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); // 红色
    if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN); // 黄色
    if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE); // 蓝色
    if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN); // 暗黄色
    if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); // 灰色
    if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED); // 红色背景
    if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_BLUE); // 蓝色背景
}

// 设置光标位置
void SetPos(int x,int y)
{
    COORD pos; pos.X=y*2-1,pos.Y=x+1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

// 生成道具
void GenerateItem(int x, int y) {
    if(itemCount >= 1000) return;
    
    int r = rand()%100;
    if(r < 8) { // 8%几率生成道具
        itemCount++;
        items[itemCount].x = x;
        items[itemCount].y = y;
        items[itemCount].type = rand()%5;
        items[itemCount].time = 150 + rand()%100; // 存在时间
    }
}

// 爆炸效果
void Zha(int x,int y)
{
    Zb++;
    int k1=rand()%2+2,k2=rand()%3+2,r=rand()%6;
    if(r==0) B[Zb].xx=x-K,B[Zb].yy=y,B[Zb].Zhong=1,B[Zb].rr=0,B[Zb].mr=k1*2;
    if(r==1) B[Zb].xx=x-K,B[Zb].yy=y,B[Zb].Zhong=2;
    if(r==2) B[Zb].xx=x-K,B[Zb].yy=y,B[Zb].Zhong=3,B[Zb].rr=k2,B[Zb].mr=k1;
    if(r==3) B[Zb].xx=x-K,B[Zb].yy=y,B[Zb].Zhong=4;
    if(r==4) B[Zb].xx=x-K,B[Zb].yy=y,B[Zb].Zhong=5,B[Zb].rr=1,B[Zb].mr=k2*2;
    if(r==5) B[Zb].xx=x-K,B[Zb].yy=y,B[Zb].Zhong=rand()%2+6,B[Zb].rr=k1+1,B[Zb].mr=k2+3;
    
    // 爆炸后生成道具
    GenerateItem(x, y);
    
    // 增加连击
    combo++;
    comboTime = 100;
    maxCombo = max(maxCombo, combo);
}

// 绘制地图元素
void Cout(int i,int j,int a)
{
    int R=rand()%500,jk=0;
    if(i-K>=0&&i-K<=1&&j>=2&&j<=6) return;
    
    // 先绘制道具
    for(int k=1;k<=itemCount;k++) {
        if(items[k].time>0 && items[k].x==i && items[k].y==j) {
            SetPos(i-K,j);
            switch(items[k].type) {
                case 0: Color(4); cout<<"H"; break; // 生命药水 - 用H代替❤
                case 1: Color(5); cout<<"D"; break; // 炸弹威力增强 - 用D代替◆
                case 2: Color(6); cout<<"S"; break; // 无敌 - 用S代替★
                case 3: Color(3); cout<<"U"; break; // 分数加倍 - 用U代替▲
                case 4: Color(2); cout<<"T"; break; // 时间减缓 - 用T代替●
            }
            return;
        }
    }
    
    if(a!=4)
    {
        if(m[i][j]==0&&(a==0||a==3)) SetPos(i-K,j),Color(7),cout<<"■"; // 泥土 - 保留■
        if(m[i][j]==1&&a==5) SetPos(i-K,j),Color(0),cout<<"  ";//空气 
        if(m[i][j]==2) SetPos(i-K,j),Color(8),cout<<"■"; // 石块 - 保留■
        if(m[i][j]>=3&&m[i][j]<6) SetPos(i-K,j),Color(5),cout<<"*",m[i][j]++; // 爆炸效果
        if(m[i][j]==6&&a!=5) SetPos(i-K,j),cout<<"  ",m[i][j]=1;
        if(m[i][j]==7) SetPos(i-K,j),Color(9),cout<<"~"; // 岩浆 - 保留~
        if(m[i][j]==8) SetPos(i-K,j),Color(10),cout<<"~"; // 水 - 保留~
        if(m[i][j]==9) SetPos(i-K,j),Color(3),cout<<"◆"; // 宝石 - 保留◆
        if(m[i][j]==13) SetPos(i-K,j),Color(5),cout<<"$"; // 星形方块 - 用$代替★
        if(m[i][j]==14) SetPos(i-K,j),Color(4),cout<<"^"; // 尖刺方块 - 用^代替▲
        if(m[i][j]==15) SetPos(i-K,j),Color(6),cout<<"M"; // 月光方块 - 用M代替☾
        if(m[i][j]==16) SetPos(i-K,j),Color(1),cout<<"E"; // 电力方块 - 用E代替⚡
        
        if((m[i][j]==1||m[i][j]==8)&&m[i-1][j]>=10&&m[i-1][j]<=30&&a!=5) {int M=m[i][j];m[i][j]=m[i-1][j],m[i-1][j]=M;if(M==1) SetPos(i-K-1,j),cout<<"  ";}//炸弹下落 
        if(m[i][j]==1&&m[i-1][j]==9&&a!=5) {m[i][j]=9,m[i-1][j]=1,SetPos(i-K-1,j),Color(0),cout<<"  ";jk=1;}//宝石下落
        if(m[i][j]>=10&&m[i][j]<=30) {m[i][j]++;if(m[i][j]%3==0) Color(4);else Color(5);SetPos(i-K,j),cout<<"●";}//炸弹计时 - 保留●
        if(m[i][j]==1&&m[i-1][j]==7&&a!=5) {m[i][j]=7,m[i-1][j]=1,SetPos(i-K-1,j),Color(0),cout<<"  ";jk=1;}//岩浆下落
        if(m[i][j]==0&&m[i-1][j]==7&&R<=2) m[i][j]=m[i-1][j],m[i-1][j]=1,SetPos(i-K-1,j),cout<<"  ";//岩浆融解 
        if(m[i][j]==7&&R>2&&R<=5) {int r=rand()%3-1; if(m[i][j+r]==1) m[i][j+r]=m[i][j];if(m[i][j+r]==8) m[i][j+r]=2;}//岩浆扩散  
        if(R<50&&R>=20&&m[i+1][j+1]==1&&m[i+1][j]==8&&m[i][j]==8) m[i+1][j+1]=8,m[i][j]=1,SetPos(i-K,j),Color(0),cout<<"  ";
        if(R<80&&R>=50&&m[i+1][j-1]==1&&m[i+1][j]==8&&m[i][j]==8) m[i+1][j-1]=8,m[i][j]=1,SetPos(i-K,j),Color(0),cout<<"  ";//岩浆平面 
        if(m[i][j]==1&&m[i-1][j]==8&&a!=5) {m[i][j]=8,m[i-1][j]=1,SetPos(i-K-1,j),Color(0),cout<<"  ";jk=1;}//水下落
        if(m[i+1][j+1]==1&&m[i+1][j]==8&&m[i][j]==8) m[i+1][j+1]=8,m[i][j]=1,SetPos(i-K,j),Color(0),cout<<"  ";
        if(m[i+1][j-1]==1&&m[i+1][j]==8&&m[i][j]==8) m[i+1][j-1]=8,m[i][j]=1,SetPos(i-K,j),Color(0),cout<<"  ";//水平面 
        if((m[i+1][j]==8&&m[i][j]==7)||(m[i+1][j]==7&&m[i][j]==8)) m[i][j]=2,m[i-1][j]=1,SetPos(i-K-1,j),Color(0),cout<<"  ";//变石头
        if(m[i][j]==0&&m[i-1][j]==8&&R>5&&R<=7) m[i][j]=m[i-1][j],m[i-1][j]=1,SetPos(i-K-1,j),cout<<"  ";//水融解 
        if(m[i][j]==8&&R>7&&R<=9) {int r=rand()%3-1; if(m[i][j+r]==1) m[i][j+r]=m[i][j];if(m[i][j+r]==7) m[i][j+r]=2;}//水扩散  
        if(m[i][j]==31) SetPos(i-K,j),cout<<"  ",Zha(i,j);
        
        // 电力方块连锁效果
        if(m[i][j]==16) {
            for(int di=-1;di<=1;di++) {
                for(int dj=-1;dj<=1;dj++) {
                    if(di==0&&dj==0) continue;
                    if(m[i+di][j+dj]>=2&&m[i+di][j+dj]<=8) {
                        m[i+di][j+dj]=3;
                    }
                }
            }
        }
    }
    else if(a!=5)//界外 
    {
        if(m[i][j]>=3&&m[i][j]<6) m[i][j]++; if(m[i][j]==6) m[i][j]=1;
        if((m[i][j]==1||(m[i][j]>=3&&m[i][j]<=6))&&m[i-1][j]>=10&&m[i-1][j]<=30) m[i][j]=m[i-1][j],m[i-1][j]=1;//炸弹下落 
        if(m[i][j]>=10&&m[i][j]<=30) m[i][j]++;//炸弹计时
        if(m[i][j]==1&&m[i-1][j]==9) m[i][j]=9,m[i-1][j]=1;//宝石下落
        if(m[i][j]==1&&m[i-1][j]==7) m[i][j]=7,m[i-1][j]=1;//岩浆下落
        if(m[i][j]==1&&m[i-1][j]==8) m[i][j]=8,m[i-1][j]=1;//水下落
    }if(jk==1) jk=0,Cout(i,j,5);
    Color(0);
}

// 绘制地图
void Map(int a);

// 玩家控制
void Wo()
{
    SetPos(X-K,Y),cout<<"  "; //清除上一次残影
    
    // 道具效果更新
    if(invincibleTime>0) {
        invincibleTime--;
        if(invincibleTime==0) isInvincible = false;
    }
    
    // 连击时间更新
    if(comboTime>0) comboTime--;
    else if(combo>0) {
        combo=0;
        SetPos(2,15),cout<<"       ";
    }
    
    // 拾取物品效果
    if(m[X][Y]==9) { // 宝石
        Blood = min(Blood+1, 20);
        Score+=3;
        m[X][Y]=1;
        system("color 2F");
        Sleep(20);
        system("color 0F");
        Map(3);
        combo++;
        comboTime=100;
    }
    if(m[X][Y]==13) { // 星形方块
        Score+=8;
        m[X][Y]=1;
        system("color 6E");
        Sleep(20);
        system("color 0F");
        Map(3);
        combo+=2;
        comboTime=100;
    }
    if(m[X][Y]==14 && !isInvincible) { // 尖刺方块
        Blood-=1;
        m[X][Y]=1;
        system("color 4F");
        Sleep(30);
        system("color 0F");
        Map(3);
        combo=0;
    }
    if(m[X][Y]==15) { // 月光方块
        Score+=5;
        m[X][Y]=1;
        Blood = min(Blood+1, 20);
        system("color 1F");
        Sleep(20);
        system("color 0F");
        Map(3);
        combo++;
        comboTime=100;
    }
    if(m[X][Y]==16) { // 电力方块
        Score+=4;
        m[X][Y]=1;
        system("color E0");
        Sleep(20);
        system("color 0F");
        Map(3);
        combo+=2;
        comboTime=100;
    }
    
    // 道具拾取
    for(int i=1;i<=itemCount;i++) {
        if(items[i].time>0 && items[i].x==X && items[i].y==Y) {
            switch(items[i].type) {
                case 0: // 生命药水
                    Blood = min(Blood+3, 20);
                    SetPos(0,15),Color(4),cout<<"生命+3!";
                    break;
                case 1: // 炸弹威力增强
                    Er = min(Er+1, 3);
                    SetPos(0,15),Color(5),cout<<"威力增强!";
                    break;
                case 2: // 无敌
                    isInvincible = true;
                    invincibleTime = 150;
                    SetPos(0,15),Color(6),cout<<"无敌状态!";
                    break;
                case 3: // 分数加倍
                    Score+=10;
                    SetPos(0,15),Color(3),cout<<"分数+10!";
                    break;
                case 4: // 时间减缓
                    SetPos(0,15),Color(2),cout<<"时间减缓!";
                    break;
            }
            items[i].time=0;
            combo+=1;
            comboTime=100;
            Sleep(200);
            SetPos(0,15),cout<<"       ";
        }
    }
    
    if(tX!=0&&(m[X-1][Y]==1||m[X-1][Y]==7||m[X-1][Y]==8||m[X][Y]==9||m[X-1][Y]==13||m[X-1][Y]==15||(m[X-1][Y]>=3&&m[X-1][Y]<=6))) tX--,X-=2;  //上跳 
    if(m[X+1][Y]==1||(m[X+1][Y]>=3&&m[X+1][Y]<=6)||m[X+1][Y]==7||m[X+1][Y]==8||m[X][Y]==9||m[X+1][Y]==13||m[X+1][Y]==15) X++; //掉落 
    if(m[X+1][Y]==0||m[X+1][Y]==2||(m[X+1][Y]>=3&&m[X+1][Y]<=6)||m[X+1][Y]==14) tX=Er=0; //跳跃次数清零 
    if(m[X-1][Y]==0||m[X-1][Y]==2||(m[X-1][Y]>=10&&m[X-1][Y]<=31)||m[X-1][Y]==14) tX=Er=0; //跳跃次数清零 
    if(X<=K) tX=Er=0,X=K; if(X>=K+28) X=K+28,Kb=1; //高度上下限
    if(m[X][Y]==7) m[X-1][Y]=m[X-2][Y]=1,tX+=8;
    
    // 受伤判定(无敌状态不受伤害)
    if(!isInvincible && m[X][Y]!=1 && m[X][Y]!=8 && m[X][Y]!=9 && m[X][Y]!=13 && m[X][Y]!=15 && m[X][Y]!=16) {
        Blood--;
        m[X][Y]=1;
        system("color 4F");
        Sleep(30);
        system("color 0F");
        Map(3);
        combo=0;
    }
    
    if(Blood<=0) gameOver = true;
    
    // 显示连击
    if(combo>=2) {
        SetPos(1,15),Color((combo/2)%6+1);
        cout<<"连击:"<<combo;
        if(combo>=5) {
            SetPos(2,15),Color(5),cout<<"奖励分数!";
            Score+=combo/3;
        }
    }
    
    // 显示无敌状态
    if(isInvincible) {
        SetPos(3,15),Color(6);
        if(invincibleTime%10<5) cout<<"无敌!";
        else cout<<"     ";
    }
    
    // 绘制玩家
    SetPos(X-K,Y);
    if(isInvincible) Color(6);
    else Color(1);
    cout<<"●"; // 玩家 - 保留●
}

// 特殊炸弹效果
void CircleBomb(int x,int y,int s,int ms)
{
    if(s==ms) return;
    for(int i=x-s;i<=x+s;i++)
    for(int j=y-s;j<=y+s;j++)
    {
        float k=(i-x)*(i-x)+(j-y)*(j-y)-s*s;
        if(k<=s&&k>=-s&&j>0&&j<=20&&m[i+K][j]!=2&&m[i+K][j]!=9&&m[i+K][j]!=13&&m[i+K][j]!=14&&m[i+K][j]!=15) m[i+K][j]=3;
    }Zb++;
    B[Zb].xx=x,B[Zb].yy=y,B[Zb].Zhong=1,B[Zb].rr=s+1,B[Zb].mr=ms;
    Sleep(20);
}

void LineBomb(int i,int j)
{
    for(int k=0;j+k<=20;k++) if(m[i+K][j+k]!=2&&m[i+K][j+k]!=9&&m[i+K][j+k]!=13&&m[i+K][j+k]!=14&&m[i+K][j+k]!=15) m[i+K][j+k]=3;
    for(int k=0;j+k<=20;k++) if(m[i+K+1][j+k]!=2&&m[i+K+1][j+k]!=9&&m[i+K+1][j+k]!=13&&m[i+K+1][j+k]!=14&&m[i+K+1][j+k]!=15) m[i+K+1][j+k]=3;
    for(int k=0;j-k>0;k++) if(m[i+K][j-k]!=2&&m[i+K][j-k]!=9&&m[i+K][j-k]!=13&&m[i+K][j-k]!=14&&m[i+K][j-k]!=15) m[i+K][j-k]=3;
    for(int k=0;j-k>0;k++) if(m[i+K+1][j-k]!=2&&m[i+K+1][j-k]!=9&&m[i+K+1][j-k]!=13&&m[i+K+1][j-k]!=14&&m[i+K+1][j-k]!=15) m[i+K+1][j-k]=3;
}

void ZuanBomb(int i,int j)
{
    int k;
    for(k=0;m[i+K+k][j]!=2&&k<=7;k++) if(m[i+K+k][j]!=9&&m[i+K+k][j]!=13&&m[i+K+k][j]!=14&&m[i+K+k][j]!=15) m[i+K+k][j]=3;
    int k1=rand()%2+2;Zb++;
    B[Zb].xx=i+k,B[Zb].yy=j,B[Zb].Zhong=1,B[Zb].rr=0,B[Zb].mr=k1*3/2;
}

void TrigleBomb(int i,int j,int r,int mr)
{
    if(r==mr) return;
    if(r==1) m[i+K][j]=3,i++;
    for(int k=max(0,j-r);k<=min(20,j+r);k++) if(m[i+K][k]!=2&&m[i+K][k]!=9&&m[i+K][k]!=13&&m[i+K][k]!=14&&m[i+K][k]!=15) m[i+K][k]=3;
    Zb++;B[Zb].xx=i+1,B[Zb].yy=j,B[Zb].Zhong=5,B[Zb].rr=r+1,B[Zb].mr=mr;
}

void GunBomb(int i,int j,int r,int mr)
{
    if(mr<=0) return;Zb++;
    B[Zb].xx=i,B[Zb].yy=j+2,B[Zb].Zhong=6,B[Zb].rr=r,B[Zb].mr=mr-1;Zb++;
    B[Zb].xx=i,B[Zb].yy=j,B[Zb].Zhong=1,B[Zb].rr=r-1,B[Zb].mr=r;
}

void GunBomb2(int i,int j,int r,int mr)
{
    if(mr<=0) return;Zb++;
    B[Zb].xx=i,B[Zb].yy=j-2,B[Zb].Zhong=7,B[Zb].rr=r,B[Zb].mr=mr-1;Zb++;
    B[Zb].xx=i,B[Zb].yy=j,B[Zb].Zhong=1,B[Zb].rr=r-1,B[Zb].mr=r;
}

void ThreeBomb(int x,int y,int s,int ms)
{
    for(int i=1;i<=3;i++)
    {
        int Xx=rand()%(2*s+1)-s,Yy=rand()%(2*s+1)-s; Zb++;
        B[Zb].xx=Xx+x,B[Zb].yy=Yy+y,B[Zb].Zhong=1,B[Zb].rr=0,B[Zb].mr=ms+rand()%3-1;
    }
}

// 生成新行
void Sheng(int a)
{
    K++;
    for(int i=1;i<=20;i++)
    {
        int R=rand()%max(80-(K/15)-(difficulty/10), 40); // 随难度增加障碍物
        int Rr=rand()%(500 - min(difficulty, 300)); // 随难度减少宝物
        
        if(R<=3) m[K+28][i]=2;
        else if(R<=6) m[K+28][i]=7;
        else if(R<=9) m[K+28][i]=8;
        else if(R<=12 && difficulty > 50) m[K+28][i]=13; // 星形方块
        else if(R<=15 && difficulty > 100) m[K+28][i]=14; // 尖刺方块
        
        // 降低宝物生成概率
        if(Rr==0 && difficulty < 200) m[K+28][i]=9; // 宝石
        else if(Rr==1 && difficulty < 150) m[K+28][i]=15; // 月光方块
        else if(Rr==2 && difficulty > 80) m[K+28][i]=16; // 电力方块
    }
    if(a!=1) system("cls"),Map(0);
}

// 绘制地图主函数
void Map(int a)
{
    SetPos(0,2);cout<<"生命: "<<Blood<<"  ";
    SetPos(1,2);cout<<"分数: "<<Score<<"  ";
    SetPos(2,2);cout<<"难度: "<<difficulty/10<<"  ";
    SetPos(3,2);cout<<"最高连击: "<<maxCombo<<"  ";
    
    if(a==3) system("cls");
    
    // 更新道具时间
    for(int i=1;i<=itemCount;i++) {
        if(items[i].time>0) {
            items[i].time--;
        }
    }
    
    for(int i=K+28;i>=K;i--)for(int j=1;j<=20;j++) Cout(i,j,a);
    for(int i=K+33;i>K+28;i--)for(int j=1;j<=20;j++) Cout(i,j,4);
    
    if(a!=3) Wo();
}

// 游戏教程
void Jiao()
{
    system("cls");
    SetPos(1,2);Color(5);cout<<"========== 游戏操作 ==========";
    SetPos(3,2);Color(3);cout<<"↑ : 跳跃(可二段跳)";
    SetPos(4,2);Color(3);cout<<"← → : 左右移动";
    SetPos(5,2);Color(3);cout<<"空格 : 放置炸弹";
    
    SetPos(7,2);Color(5);cout<<"========== 游戏元素 ==========";
    SetPos(8,2);Color(1);cout<<"● : 你";
    SetPos(9,2);Color(7);cout<<"■ : 泥土 - 可破坏";
    SetPos(10,2);Color(8);cout<<"■ : 石块 - 不可破坏";
    SetPos(11,2);Color(4);cout<<"● : 炸弹 - 3秒后爆炸";
    SetPos(12,2);Color(9);cout<<"~ : 岩浆 - 让你跳得更高";
    SetPos(13,2);Color(10);cout<<"~ : 水 - 安全通过";
    SetPos(14,2);Color(3);cout<<"◆ : 宝石 - 加血和分数";
    
    SetPos(16,2);Color(5);cout<<"========== 特殊方块 ==========";
    SetPos(17,2);Color(5);cout<<"$ : 星形方块 - 高分数";
    SetPos(18,2);Color(4);cout<<"^ : 尖刺方块 - 小心受伤";
    SetPos(19,2);Color(6);cout<<"M : 月光方块 - 加血和分数";
    SetPos(20,2);Color(1);cout<<"E : 电力方块 - 连锁爆炸";
    
    SetPos(22,2);Color(5);cout<<"========== 道具系统 ==========";
    SetPos(23,2);Color(4);cout<<"H : 生命药水 +3生命";
    SetPos(24,2);Color(5);cout<<"D : 威力增强 - 增加跳跃";
    SetPos(25,2);Color(6);cout<<"S : 无敌 - 暂时无敌";
    SetPos(26,2);Color(3);cout<<"U : 分数加倍 +10分数";
    SetPos(27,2);Color(2);cout<<"T : 时间减缓";
    
    SetPos(29,2);Color(5);cout<<"========== 游戏规则 ==========";
    SetPos(30,2);Color(2);cout<<"真正的无限生存模式!";
    SetPos(31,2);Color(2);cout<<"没有关卡!没有通关!";
    SetPos(32,2);Color(2);cout<<"只有死亡才能结束游戏!";
    SetPos(33,2);Color(2);cout<<"难度会随时间无限增加!";
    
    SetPos(35,2);Color(1);cout<<"按任意键开始游戏...";
    _getch();
}

// 开始界面
void Start()
{
    system("cls");
    Color(5);
    
    // 游戏标题
    SetPos(2,3);Color(7),cout<<" ■        ",Color(5),cout<<"爆",Color(7),cout<<"    ■■■■ ";
    SetPos(3,3);Color(7),cout<<" ■■     ",Color(5),cout<<"破",Color(7),cout<<"    ■■■■ ";
    SetPos(4,3);Color(7),cout<<" ■■■■ ",Color(5),cout<<"大",Color(7),cout<<"  ■■■■■ ";
    SetPos(5,3);Color(7),cout<<" ■■■■■",Color(5),cout<<"冒",Color(7),cout<<"  ■■■■■ ";
    SetPos(6,3);Color(7),cout<<" ■■■■■  ■■■",Color(5),cout<<"险",Color(7),cout<<"■■ ";
    SetPos(7,3);Color(7),cout<<" ■■■■■■■■■■■■ ";
    SetPos(8,3);Color(4);cout<<"       真正的无限模式";
    SetPos(9,3);Color(3);cout<<"       只有死亡没有通关!";
    
    // 菜单选项
    SetPos(12,10);Color(5);cout<<"▶ 开始游戏";
    SetPos(14,10);Color(0);cout<<"  操作教程";
    SetPos(16,10);Color(0);cout<<"  退出游戏";
    
    SetPos(25,5);Color(3);cout<<"注意:请确保不是拼音输入法!";
    SetPos(26,8);Color(3);cout<<"使用方向键选择,Y键确认";
    
    char tt;int select=0;
    while(true)
    {
        tt=_getch();
        if(tt==72) select=(select+2)%3; // 上
        if(tt==80) select=(select+1)%3; // 下
        
        // 更新菜单显示
        SetPos(12,10);
        if(select==0) Color(5); else Color(0);
        cout<<"▶ 开始游戏";
        
        SetPos(14,10);
        if(select==1) Color(5); else Color(0);
        cout<<"  操作教程";
        
        SetPos(16,10);
        if(select==2) Color(5); else Color(0);
        cout<<"  退出游戏";
        
        if(tt=='y' || tt=='Y') {
            if(select==0) break;
            else if(select==1) {Jiao(); break;}
            else {exit(0);}
        }
    }
    system("color 0F");
    system("cls");
}

// 主函数
int main()
{
    // 控制台设置
    system("mode con cols=42 lines=38");
    system("title 爆破大冒险 - 真正无限模式");
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
    srand((unsigned)time(NULL));
    
    // 游戏开始
    Start();
    
    // 游戏主循环
    St:system("cls");
    K=-5; T=Score=0; X=Y=2; Blood=15; // 增加初始血量
    combo=0; itemCount=0;
    difficulty=0; maxCombo=0;
    gameOver = false;
    memset(m,0,sizeof(m));
    memset(B,0,sizeof(B));
    memset(items,0,sizeof(items));
    
    // 初始化地图
    for(int i=5;i<=15;i++) for(int j=1;j<=20;j++) m[i][j]=1;
    for(int i=1;i<=10;i++) Sheng(1);
    Map(0);
    
    while(!gameOver)
    {
        T++; Kb=0;
        
        // 难度随时间增加 - 无限增加
        if(T%100==0) {
            difficulty++;
            gameSpeed = max(25, 50 - difficulty/10); // 游戏速度加快但有限制
        }
        
        // 控制输入
        if(GetAsyncKeyState(VK_UP)&0x8000&&tT==0&&Er<2) tT++,tX+=4,Er++;
        if((GetAsyncKeyState(VK_UP)&0x8000)?0:1) tT=0;
        if(GetAsyncKeyState(VK_LEFT)&0x8000&&Y>1&&(m[X][Y-1]==1||m[X][Y-1]==7||m[X][Y-1]==8||m[X][Y-1]==9||m[X][Y-1]==13||m[X][Y-1]==15)&&(tY==0||tY>=2)) SetPos(X-K,Y),cout<<"  ",Y--;
        if(GetAsyncKeyState(VK_RIGHT)&0x8000&&Y<20&&(m[X][Y+1]==1||m[X][Y+1]==7||m[X][Y+1]==8||m[X][Y+1]==9||m[X][Y+1]==13||m[X][Y+1]==15)&&(tY2==0||tY2>=2)) SetPos(X-K,Y),cout<<"  ",Y++;
        if((GetAsyncKeyState(VK_LEFT)&0x8000)?0:1) tY=0;
        if((GetAsyncKeyState(VK_RIGHT)&0x8000)?0:1) tY2=0;
        if((GetAsyncKeyState(VK_LEFT)&0x8000)?1:0) tY++;
        if((GetAsyncKeyState(VK_RIGHT)&0x8000)?1:0) tY2++;
        
        // 放置炸弹
        if(kbhit()) {
            char e=_getch();
            if(e==' '&&m[X-1][Y]!=0&&m[X-1][Y]!=2&&m[X-1][Y]!=14&&(m[X+1][Y]<=10||m[X+1][Y]>=31)&&Kb==0) {
                m[X][Y]=10;
                X--;
            }
        }
        
        // 处理炸弹效果
        int zb=Zb;
        for(int i=zb-10;i<=zb;i++)
        {
            if(B[i].Zhong==1) CircleBomb(B[i].xx,B[i].yy,B[i].rr,B[i].mr),B[i].Zhong=0;
            if(B[i].Zhong==2) LineBomb(B[i].xx,B[i].yy),B[i].Zhong=0;
            if(B[i].Zhong==3) ThreeBomb(B[i].xx,B[i].yy,B[i].rr,B[i].mr),B[i].Zhong=0;
            if(B[i].Zhong==4) ZuanBomb(B[i].xx,B[i].yy),B[i].Zhong=0;
            if(B[i].Zhong==5) TrigleBomb(B[i].xx,B[i].yy,B[i].rr,B[i].mr),B[i].Zhong=0;
            if(B[i].Zhong==6) GunBomb(B[i].xx,B[i].yy,B[i].rr,B[i].mr),B[i].Zhong=0;
            if(B[i].Zhong==7) GunBomb2(B[i].xx,B[i].yy,B[i].rr,B[i].mr),B[i].Zhong=0;
        }
        
        // 更新游戏状态
        Map(1);
        
        // 根据连击调整速度
        int speed = gameSpeed;
        if(combo>=10) speed = gameSpeed + 20;
        else if(combo>=5) speed = gameSpeed + 10;
        Sleep(speed);
        
        // 地图下降 - 随着难度增加下降速度加快
        int dropRate = max(10, 40 - Score/40 - difficulty/15);
        if(T%dropRate==0||Kb>=1) Sheng(0);
        if(T%30==0) Score++;
        
        // 清理过期道具
        for(int i=1;i<=itemCount;i++) {
            if(items[i].time<=0) {
                for(int j=i;j<itemCount;j++) items[j]=items[j+1];
                itemCount--;
                i--;
            }
        }
    }
    
    // 游戏结束
    system("color 4F");
    Color(4);
    SetPos(5,2);cout<<"游戏结束!";
    SetPos(6,2);cout<<"最终分数: "<<Score;
    SetPos(7,2);cout<<"最高连击: "<<maxCombo;
    SetPos(8,2);cout<<"游戏时长: "<<T/100<<"秒";
    SetPos(9,2);cout<<"最终难度: "<<difficulty/10;
    Sleep(1000);
    
    SetPos(12,2);Color(1);cout<<"按 Y 重新开始,按其他键退出";
    char e=_getch();
    if(e=='y'||e=='Y') goto St;
    
    return 0;
}
相关推荐
Cx330❀2 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
Cx330❀2 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
燃于AC之乐3 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑3 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl
C++ 老炮儿的技术栈4 小时前
C/C++ 中 inline(内联函数)和宏定义(#define)的区别
开发语言·c++·git·算法·机器人·visual studio
yeflx5 小时前
CMake+CUDA
c++
Word码6 小时前
[C++语法]-vector(用法详解及实现)
开发语言·c++
安全二次方security²6 小时前
CUDA C++编程指南(7.15&16)——C++语言扩展之内存空间谓词和转化函数
c++·人工智能·nvidia·cuda·内存空间谓词函数·内存空间转化函数·address space
L186924547826 小时前
Win 下 PCL部分函数析构崩溃问题总结
c++·计算机视觉·3d·pcl