#include<iostream>
#include<graphics.h>
#include<conio.h>
#include<windows.h>
#include<stdlib.h>
#include<ctime>
#pragma comment(lib,"Winmm.lib")
#define wall_width 15
#define rock_width 20
#define under_width 23
#define width 230
#define rwidth 200
int level=30; //初始化睡眠时间为30
int _time=0;
int m=0; //用于记录横坐标偏移量
int kind=rand()%7; //方块的种类标记
int a,b,c; //方块颜色
int score=0; //分数
//随机生成方块的七种基本形状中的一种
int randNum(){
srand((unsigned)time(0));
int a=rand()%7;
return a;
}
//方块结构体,用一个元素个数都为4的二维数组表示方块4*4的结构
struct Rock{
bool _rock[4][4];
}initR[19];
char clear(){
rewind(stdin);
char ch=getch();
return ch;
}
//画围墙
void initWall(){
for(int i=0;i<20;i++){
setfillcolor(EGERGB(0xff,0xff,0xaa));
bar(0,i*rock_width,wall_width,(i+1)*rock_width);
bar(width-wall_width+1,i*rock_width,width+1,(i+1)*rock_width);
}
for(int i=0;i<10;i++){
bar(i*under_width,20*rock_width+2,(i+1)*under_width,21*rock_width-3);
}
bar(0,20*rock_width,wall_width,20*rock_width+2);
bar(width-wall_width+1,20*rock_width,width+1,20*rock_width+2);
bar(width,20*rock_width+2,width+1,21*rock_width-3);
}
//不同睡眠时间对应等级
void levelchange(){
if(level==5){
outtextxy(370,150,"9");
}else if(level==10){
outtextxy(370,150,"8");
}else if(level==15){
outtextxy(370,150,"7");
}else if(level==20){
outtextxy(370,150,"6");
}else if(level==25){
outtextxy(370,150,"5");
}else if(level==30){
outtextxy(370,150,"4");
}else if(level==35){
outtextxy(370,150,"3");
}else if(level==40){
outtextxy(370,150,"2");
}else if(level==45){
outtextxy(370,150,"1");
}
}
//十九种方块对应的点阵
void rockStruct(){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(j==1){
initR[0]._rock[i][j]=1;
} else{
initR[0]._rock[i][j]=0;
} //横直线型
if(i==0&&j==0||i==1&&j==0||i==0&&j==1||i==1&&j==1){
initR[1]._rock[i][j]=1;
}else{
initR[1]._rock[i][j]=0;
} //田字型
if(j==0&&i!=3||i==1&&j==1){
initR[2]._rock[i][j]=1;
}else{
initR[2]._rock[i][j]=0;
} //正T型
if(j==0&&i!=3||i==0&&j==1){
initR[3]._rock[i][j]=1;
}else{
initR[3]._rock[i][j]=0;
} //L顺时针旋转90度型
if(j==0&&i!=3||i==2&&j==1){
initR[4]._rock[i][j]=1;
}else{
initR[4]._rock[i][j]=0;
} //反L逆时针旋转90度型
if(i==0&&j==0||i==1&&j==0||i==1&&j==1||i==2&&j==1){
initR[5]._rock[i][j]=1;
}else{
initR[5]._rock[i][j]=0;
} //正Z型
if(i==1&&j==0||i==2&&j==0||i==0&&j==1||i==1&&j==1){
initR[6]._rock[i][j]=1;
}else{
initR[6]._rock[i][j]=0;
} //反Z型
if(i==1){
initR[7]._rock[i][j]=1;
}else{
initR[7]._rock[i][j]=0;
} //竖直线型
if(i==1&&j!=3||i==0&&j==1){
initR[8]._rock[i][j]=1;
}else{
initR[8]._rock[i][j]=0;
} //指左T型
if(i==0&&j!=3||i==1&&j==1){
initR[9]._rock[i][j]=1;
}else{
initR[9]._rock[i][j]=0;
} //指右T型
if(j==1&&i!=3||i==1&&j==0){
initR[10]._rock[i][j]=1;
}else{
initR[10]._rock[i][j]=0;
} //倒T型
if(i==0&&j!=3||i==1&&j==2){
initR[11]._rock[i][j]=1;
}else{
initR[11]._rock[i][j]=0;
} //正L型
if(i==1&&j!=3||i==0&&j==0){
initR[12]._rock[i][j]=1;
}else{
initR[12]._rock[i][j]=0;
} //L旋转180度型
if(j==1&&i!=3||i==2&&j==0){
initR[13]._rock[i][j]=1;
}else{
initR[13]._rock[i][j]=0;
} //L逆时针旋转90度型
if(i==1&&j!=3||i==0&&j==2){
initR[14]._rock[i][j]=1;
}else{
initR[14]._rock[i][j]=0;
} //反L型
if(j==1&&i!=3||i==0&&j==0){
initR[15]._rock[i][j]=1;
}else{
initR[15]._rock[i][j]=0;
} //反L顺时针旋转90度型
if(i==0&&j!=3||i==1&&j==0){
initR[16]._rock[i][j]=1;
}else{
initR[16]._rock[i][j]=0;
} //反L旋转180度型
if(i==1&&j==0||i==1&&j==1||i==0&&j==1||i==0&&j==2){
initR[17]._rock[i][j]=1;
}else{
initR[17]._rock[i][j]=0;
} //异正Z型
if(i==0&&j==0||i==0&&j==1||i==1&&j==1||i==1&&j==2){
initR[18]._rock[i][j]=1;
}else{
initR[18]._rock[i][j]=0;
} //异反Z型
}
}
}
//实时分数转化为字符串类型并在固定位置显示方程,分数大于等于0
int scoreToString(int x){
setfillcolor(BLACK);
bar(340,170,450,185);
int n=0;
int i=1;
while(x/i>0){
n++;
i*=10;
}
char ch[n];
if(x==0){
setfont(17,8,"幼圆");
setcolor(EGERGB(0xff,0x99,0x22));
outtextxy(340,170,'0');
return 0;
}
int l=0;
i/=10;
for(int j=0;j<n;j++){
if(x/i==1){
ch[j]='1';
}else if(x/i==2){
ch[j]='2';
}else if(x/i==3){
ch[j]='3';
}else if(x/i==4){
ch[j]='4';
}else if(x/i==5){
ch[j]='5';
}else if(x/i==6){
ch[j]='6';
}else if(x/i==7){
ch[j]='7';
}else if(x/i==8){
ch[j]='8';
}else if(x/i==9){
ch[j]='9';
}else if(x/i==0){
ch[j]='0';
}
x=x%i;
i/=10;
}
for(int j=0;j<n;j++){
setfont(15,7,"幼圆");
setcolor(EGERGB(0xff,0x99,0x22));
outtextxy(340+j*8,170,ch[j]);
}
return 1;
}
//最大分数转化为字符串类型并在固定位置显示方程,分数大于等于0
int maxToString(int x){
setfillcolor(BLACK);
bar(350,350,450,365);
int n=0;
int i=1;
while(x/i>0){
n++;
i*=10;
}
char ch[n];
if(x==0){
setfont(15,7,"幼圆");
setcolor(EGERGB(0x15,0xdd,0xe4));
outtextxy(350,350,"0");
return 0;
}
int l=0;
i/=10;
for(int j=0;j<n;j++){
if(x/i==1){
ch[j]='1';
}else if(x/i==2){
ch[j]='2';
}else if(x/i==3){
ch[j]='3';
}else if(x/i==4){
ch[j]='4';
}else if(x/i==5){
ch[j]='5';
}else if(x/i==6){
ch[j]='6';
}else if(x/i==7){
ch[j]='7';
}else if(x/i==8){
ch[j]='8';
}else if(x/i==9){
ch[j]='9';
}else if(x/i==0){
ch[j]='0';
}
x=x%i;
i/=10;
}
for(int j=0;j<n;j++){
setfont(15,7,"幼圆");
setcolor(EGERGB(0x15,0xdd,0xe4));
outtextxy(350+j*8,350,ch[j]);
}
return 1;
}
//沉底确定的方块
struct FinalRock{
int finalX;
int finalY;
bool alive;
bool used;
}finalRock[200]; //理论上200为方块最大可能存在数
int fr_len=0;
bool flag2=0,flag3=0;
bool change[18]={0};
//方块的各种行为
void rockAction(int &n){ //此处的引用符号“&”非常重要
if(kbhit()){
char c=clear();
switch(c){
case 'a': //左移
case 'A':
if(flag3==0){
m-=rock_width;break;
}else break;
case 'd': //右移
case 'D':
if(flag2==0){
m+=rock_width;break;
}else break;
case 's': //加速
case 'S':
if(_time!=0){
_time-=5;
}
break;
case 'f': //恢复原速
case 'F':
_time=level;break;
case 'w': //变形
case 'W':
if(change[0]==0&&n==0){
n=7;
}else if(change[1]==0&&n==7){
n=0;
}else if(change[2]==0&&n==2){
n=8;
}else if(change[3]==0&&n==8){
n=10;
}else if(change[4]==0&&n==10){
n=9;
}else if(change[5]==0&&n==9){
n=2;
}else if(change[6]==0&&n==3){
n=12;
}else if(change[7]==0&&n==12){
n=13;
}else if(change[8]==0&&n==13){
n=11;
}else if(change[9]==0&&n==11){
n=3;
}else if(change[10]==0&&n==4){
n=14;
}else if(change[11]==0&&n==14){
n=15;
}else if(change[12]==0&&n==15){
n=16;
}else if(change[13]==0&&n==16){
n=4;
}else if(change[14]==0&&n==5){
n=17;
}else if(change[15]==0&&n==17){
n=5;
}else if(change[16]==0&&n==6){
n=18;
}else if(change[17]==0&&n==18){
n=6;
}break;
case 'r': //刷新界面
case 'R':
for(int i=0;i<fr_len;i++){
finalRock[i].alive=0;
}
fr_len=0;
setfillcolor(BLACK);
bar(wall_width,0,wall_width+10*rock_width,20*rock_width);
score=0;
scoreToString(score);
getch();
break;
case ' ': //暂停
getch();break;
default:
break;
}
}
}
//下界分类
int xiajie(int n){
int underline;
if(n==0||n==1||n==2||n==3||n==4||n==5||n==6||n==10||n==13||n==15){
underline=19*rock_width;
}else if(n==8||n==9||n==11||n==12||n==14||n==16||n==17||n==18){
underline=18*rock_width;
}else if(n==7){
underline=17*rock_width;
}
return underline;
}
int it=0;
int x=0,y=0,initx=0,inity=0;
//设置左右屏障
void lrObstacle(int n){
//左屏障
if(n!=7){
if(m==(-3)*rock_width){
flag3=1;
}
}else{
if(m==(-4)*rock_width){
flag3=1;
}
}
//右屏障
if(n==0){
if(m==3*rock_width){
flag2=1;
}
}else if(n==1||n==8||n==9||n==11||n==12||n==14||n==16||n==17||n==18){
if(m==5*rock_width){
flag2=1;
}
}else if(n==2||n==3||n==4||n==5||n==6||n==10||n==13||n==15){
if(m==4*rock_width){
flag2=1;
}
}else if(n==7){
if(m==5*rock_width){
flag2=1;
}
}
}
//右边提示下一个即将出现的方块
void nextRock(int n){
rockStruct();
int _initx;
int _inity;
setfillcolor(BLACK);
bar(320,250,320+4*rock_width,250+4*rock_width);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(initR[n]._rock[i][j]==1){ //若数组元素为1,则在此位置画小方块
_initx=i*rock_width+320;
_inity=j*rock_width+250;
setfillcolor(EGERGB(0xaa,0xaa,0xaa));
bar(_initx,_inity,_initx+rock_width,_inity+rock_width);
//画方块的方框
setcolor(BLACK);
line(_initx,_inity,_initx+rock_width,_inity);
line(_initx+rock_width,_inity,_initx+rock_width,_inity+rock_width);
line(_initx+rock_width,_inity+rock_width,_initx,_inity+rock_width);
line(_initx,_inity+rock_width,_initx,_inity);
}
}
}
}
//禁止改变方程(若方块变形与沉底方块或围墙冲突则禁止变形)
void ifChange(int p,int q,int l,int n){
change[l]=0;
for(x=0;x<4;x++){
for(y=0;y<4;y++){
if(n==p){
if(initR[q]._rock[x][y]==1){
initx=x*rock_width+wall_width+3*rock_width+m;
inity=(y-1)*rock_width+it;
if(inity>19*rock_width||initx<wall_width||initx>wall_width+9*rock_width){
change[l]=1;
}
for(int i=0;i<fr_len;i++){
if(finalRock[i].alive==1&&initx==finalRock[i].finalX&&(inity+rock_width>finalRock[i].finalY&&inity<finalRock[i].finalY||inity>finalRock[i].finalY&&inity+rock_width<finalRock[i].finalY)){
change[l]=1;
}
}
}
}
}
}
}
//画方块方程
void drawRock(int p,int q){
srand((unsigned)time(0));
a=rand()%256,b=rand()%256,c=rand()%256;
setfillcolor(RGB(a,b,c));
bar(p,q,p+rock_width,q+rock_width);
//画方块的方框
setcolor(BLACK);
line(p,q,p+rock_width,q);
line(p+rock_width,q,p+rock_width,q+rock_width);
line(p+rock_width,q+rock_width,p,q+rock_width);
line(p,q+rock_width,p,q);
}
//历史最高纪录显示方程
void bestScore(){
FILE *out=fopen("ScoreBase.txt","a+");
fclose(out);
FILE *open;
open=fopen("ScoreBase.txt","rb");
if(open==NULL){
printf("can not open the file!\n");
exit(1);
}
int _max=0;
int f_len=0;
while(getw(open)!=-1) f_len++;
rewind(open);
int score_temp[f_len];
for(int i=0;i<f_len;i++){
score_temp[i]=getw(open);
}
for(int i=0;i<f_len;i++){
if(_max<score_temp[i]) _max=score_temp[i];
}
maxToString(_max);
setfont(15,7,"幼圆");
setcolor(EGERGB(0x15,0xdd,0xe4));
outtextxy(250,350,"历史最高纪录:");
rewind(open);
fclose(open);
}
//是否破纪录
void ifBreakRecord(int n){
FILE *out;
out=fopen("ScoreBase.txt","a+");
putw(n,out);
fclose(out);
FILE *in;
in=fopen("ScoreBase.txt","rb");
int file_len=0;
while(getw(in)!=-1) file_len++;
int _n[file_len];
rewind(in);
for(int i=0;i<file_len-1;i++){
_n[i]=getw(in);
}
rewind(in);
int max=getw(in);
rewind(in);
fclose(in);
for(int i=0;i<file_len-1;i++){
if(max<_n[i]) max=_n[i];
}
if(n>max){
setfont(35,16,"幼圆");
setcolor(EGERGB(0xff,0x44,0x44));
outtextxy(100,130,"恭喜创下新纪录!");
}
}
bool rmline=0;
int rmLineNum=0;
//主体程序
void play(){
rockStruct();
int b=0;
score=0;
kind=randNum();
while(1){
scoreToString(score);
m=0;
b=kind;
kind=randNum();
nextRock(kind);
int _xiajie=17*rock_width;
_time=level;
for(it=0;it<=_xiajie;it++){
rockAction(b);
flag2=0,flag3=0;
_xiajie=xiajie(b);
lrObstacle(b);
//生成方块
bool flag1=0;
for(x=0;x<4;x++){
for(y=0;y<4;y++){
if(initR[b]._rock[x][y]==1){ //若数组元素为1,则在此位置画小方块
initx=x*rock_width+wall_width+3*rock_width+m;
inity=(y-1)*rock_width+it;
for(int i=0;i<fr_len;i++){
if(finalRock[i].alive==1&&initx==finalRock[i].finalX&&inity+rock_width==finalRock[i].finalY){
//判断是否掉到前面的方块上方
flag1=1;
}else if(finalRock[i].alive==1&&initx+rock_width==finalRock[i].finalX&&inity>finalRock[i].finalY-rock_width&&inity<finalRock[i].finalY+rock_width){
//判断是否与前面的方块碰壁(不让右移)
flag2=1;
}else if(finalRock[i].alive==1&&initx-rock_width==finalRock[i].finalX&&inity>finalRock[i].finalY-rock_width&&inity<finalRock[i].finalY+rock_width){
//判断是否与前面的方块碰壁(不让左移)
flag3=1;
}
}
}
}
}
ifChange(0,7,0,b);
ifChange(7,0,1,b);
ifChange(2,8,2,b);
ifChange(8,10,3,b);
ifChange(10,9,4,b);
ifChange(9,2,5,b);
ifChange(3,12,6,b);
ifChange(12,13,7,b);
ifChange(13,11,8,b);
ifChange(11,3,9,b);
ifChange(4,14,10,b);
ifChange(14,15,11,b);
ifChange(15,16,12,b);
ifChange(16,4,13,b);
ifChange(5,17,14,b);
ifChange(17,5,15,b);
ifChange(6,18,16,b);
ifChange(18,6,17,b);
for(x=0;x<4;x++){
for(y=0;y<4;y++){
if(initR[b]._rock[x][y]==1){ //若数组元素为1,则在此位置画小方块
initx=x*rock_width+wall_width+3*rock_width+m;
inity=(y-1)*rock_width+it;
drawRock(initx,inity);
}
}
}
if(flag1==1&&rmline==0) break;
rmline=0;
Sleep(_time);
//清除原方块
for(x=0;x<4;x++){
for(y=0;y<4;y++){
if(initR[b]._rock[x][y]==1){
initx=x*rock_width+wall_width+3*rock_width+m;
inity=(y-1)*rock_width+it;
setfillcolor(BLACK); //用背景色掩盖
bar(initx,inity,initx+rock_width,inity+rock_width);
}
}
}
}
for(x=0;x<4;x++){
for(y=0;y<4;y++){
if(initR[b]._rock[x][y]==1){
finalRock[fr_len].finalX=x*rock_width+wall_width+3*rock_width+m;
finalRock[fr_len].finalY=(y-1)*rock_width+it;
finalRock[fr_len].alive=1;
fr_len++;
}
}
}
int temp10[10]={0};
rmLineNum=0;
for(int i=0;i<fr_len;i++){
int x_len=1;
int temp10_len=0;
for(int j=0;j<10;j++){
temp10[j]=0;
}
for(int j=i+1;j<fr_len;j++){
if(finalRock[i].finalY==finalRock[j].finalY&&finalRock[i].alive==1&&finalRock[j].alive==1){
x_len++;
temp10[0]=i;
temp10_len++;
temp10[temp10_len]=j;
}
}
if(x_len==10){
rmline=1;
rmLineNum++;
for(int j=0;j<10;j++){
finalRock[temp10[j]].alive=0;
finalRock[temp10[j]].used=0;
}
}
}
//Sleep(_time);
//分数增加机制
if(rmLineNum==1){
score++;
}else if(rmLineNum==2){
score+=4;
}else if(rmLineNum==3){
score+=7;
}else if(rmLineNum==4){
score+=12;
}
//消行机制
if(rmline==1){
int i,j;
setfillcolor(BLACK);
bar(wall_width,0,wall_width+rwidth,20*rock_width+1);
Sleep(200);
int temp=0;
for(i=0;i<fr_len;i++){
if(finalRock[i].alive==0&&finalRock[i].used==0){
temp=i;
break;
}
}
int temp2[2]={0};
int temp3[3]={0};
if(rmLineNum==2){
for(j=0;j<fr_len;j++){
if(finalRock[j].alive==0&&finalRock[j].used==0){
temp2[0]=finalRock[j].finalY;
break;
}
}
for(j=0;j<fr_len;j++){
if(finalRock[j].alive==0&&finalRock[j].used==0&&finalRock[j].finalY!=temp2[0]){
temp2[1]=finalRock[j].finalY;
break;
}
}
}
if(rmLineNum==3){
for(j=0;j<fr_len;j++){
if(finalRock[j].alive==0&&finalRock[j].used==0){
temp3[0]=finalRock[j].finalY;
break;
}
}
for(j=0;j<fr_len;j++){
if(finalRock[j].alive==0&&finalRock[j].used==0&&finalRock[j].finalY!=temp3[0]){
temp3[1]=finalRock[j].finalY;
break;
}
}
for(j=0;j<fr_len;j++){
if(finalRock[j].alive==0&&finalRock[j].used==0&&finalRock[j].finalY!=temp3[0]&&finalRock[j].finalY!=temp3[1]){
temp3[2]=finalRock[j].finalY;
break;
}
}
int tempChar=temp3[0];
for(j=0;j<3;j++){
for(int k=j+1;k<3;k++){
if(temp3[j]>temp3[k]){
tempChar=temp3[j];
temp3[j]=temp3[k];
temp3[k]=tempChar;
}
}
}
}
for(i=0;i<fr_len;i++){
if(finalRock[i].alive==0&&finalRock[i].used==0){
finalRock[i].used=1;
}
}
for(j=0;j<fr_len;j++){
if(rmLineNum==1||rmLineNum==4){
if(finalRock[j].alive==1&&finalRock[j].finalY<finalRock[temp].finalY){
if(rmLineNum==1){
finalRock[j].finalY+=rock_width;
}else if(rmLineNum==4){
finalRock[j].finalY=finalRock[j].finalY+4*rock_width;
}
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>finalRock[temp].finalY){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}else if(rmLineNum==2||rmLineNum==3){
if(rmLineNum==2){
int tempBetween=0,tempUnder=0,tempBetweenUp=0,tempBetweenUnder=0;
bool between1=0,between2=0;
if(temp2[0]>temp2[1]&&temp2[0]-2*rock_width==temp2[1]){
between1=1;
tempBetween=temp2[0]-rock_width;
}else if(temp2[0]<temp2[1]&&temp2[0]+2*rock_width==temp2[1]){
between1=1;
tempBetween=temp2[0]+rock_width;
}else if(temp2[0]>temp2[1]&&temp2[0]-3*rock_width==temp2[1]){
between2=1;
tempBetweenUp=temp2[1]+rock_width;
tempBetweenUnder=temp2[1]+2*rock_width;
}else if(temp2[0]<temp2[1]&&temp2[0]+3*rock_width==temp2[1]){
between2=1;
tempBetweenUp=temp2[1]-2*rock_width;
tempBetweenUnder=temp2[1]-rock_width;
}
if(between1==1){
if(finalRock[j].alive==1&&finalRock[j].finalY==tempBetween){
finalRock[j].finalY+=rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetween){
finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetween){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}else if(between2==1){
if(finalRock[j].alive==1&&(finalRock[j].finalY==tempBetweenUp||finalRock[j].finalY==tempBetweenUnder)){
finalRock[j].finalY+=rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetweenUp){
finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetweenUnder){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}else{
if(finalRock[j].alive==1&&finalRock[j].finalY<finalRock[temp].finalY){
finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>finalRock[temp].finalY){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}
}else if(rmLineNum==3){
bool between1=0,between2=0;
int tempBetween=0;
if(temp3[0]+rock_width==temp3[1]&&temp3[1]+2*rock_width==temp3[2]){
between1=1;
tempBetween=temp3[1]+rock_width;
}else if(temp3[0]+2*rock_width==temp3[1]){
between2=1;
tempBetween=temp3[0]+rock_width;
}
if(between1==1){
if(finalRock[j].alive==1&&finalRock[j].finalY==tempBetween){
finalRock[j].finalY+=rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetween){
finalRock[j].finalY=finalRock[j].finalY+3*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetween){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}else if(between2==1){
if(finalRock[j].alive==1&&finalRock[j].finalY==tempBetween){
finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetween){
finalRock[j].finalY=finalRock[j].finalY+3*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetween){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}else{
if(finalRock[j].alive==1&&finalRock[j].finalY<finalRock[temp].finalY){
finalRock[j].finalY=finalRock[j].finalY+3*rock_width;
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}else if(finalRock[j].alive==1&&finalRock[j].finalY>finalRock[temp].finalY){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}
}
}
}
}else{
for(int j=0;j<fr_len;j++){
if(finalRock[j].alive==1){
drawRock(finalRock[j].finalX,finalRock[j].finalY);
}
}
}
//判断游戏是否结束
bool breakOut=0;
for(int i=0;i<fr_len;i++){
if(finalRock[i].alive==1&&finalRock[i].finalX>=wall_width+3*rock_width&&finalRock[i].finalX<=wall_width+6*rock_width&&finalRock[i].finalY<rock_width){
breakOut=1;
break;
}
}
//被消方块剔除算法(数组finalRock中,若方块alive=0且used=1,后面的方块逐一前移)
if(rmline==1){
for(int i=0;i<fr_len;i++){
if(finalRock[i].alive==0&&finalRock[i].used==1){
fr_len--;
for(int j=i;j<fr_len;j++){
finalRock[j].alive=finalRock[j+1].alive;
finalRock[j].finalX=finalRock[j+1].finalX;
finalRock[j].finalY=finalRock[j+1].finalY;
finalRock[j].used=finalRock[j+1].used;
}
}
}
}
if(breakOut==1){
setfont(25,12,"幼圆");
setcolor(EGERGB(0x15,0xdd,0xe4));
outtextxy(70,120,"游戏结束!");
break;
}
}
ifBreakRecord(score);
}
//画界面
void initjiemian(){
bestScore();
setfont(15,7,"幼圆");
setcolor(EGERGB(0x15,0xdd,0xe4));
outtextxy(250,30,"按空格键开始/暂停游戏");
outtextxy(250,50,"按R键刷新界面");
outtextxy(250,70,"按W键变形,S键加速,F键变为原速");
outtextxy(250,90,"按A/D键左右移动");
outtextxy(250,110,"按+、-键调节难度");
outtextxy(300,150,"难度级别:");
outtextxy(300,170,"得分:");
outtextxy(250,200,"下一个:");
outtextxy(250,400,"版权公告|611上官姬霸版权所有");
outtextxy(370,150,"4");
for(;;){
char b=clear();
switch(b){
case '+':
if(level!=5){
level-=5;
levelchange();
}
break;
case '-':
if(level!=50){
level+=5;
levelchange();
}
break;
default:
break;
}
if(b==' ') break;
}
}
//主函数
int main(){
initgraph(480,420);
initWall();
initjiemian();
mciSendString("open background.mp3 alias mymusic", NULL, 0, NULL);
mciSendString("play mymusic", NULL, 0, NULL);
play();
getch();
closegraph();
return 0;
}
12-27