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