C++俄罗斯方块代码北邮版.docx
- 文档编号:26565332
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:20
- 大小:18.85KB
C++俄罗斯方块代码北邮版.docx
《C++俄罗斯方块代码北邮版.docx》由会员分享,可在线阅读,更多相关《C++俄罗斯方块代码北邮版.docx(20页珍藏版)》请在冰豆网上搜索。
C++俄罗斯方块代码北邮版
#include
#include
#include
#include
#include
#include"colorConsole.h"//老师的文件
voidbegin();//开始游戏
voidframe();//边框设定
int*getblocks();//方块产生
voidmove(intline);//移动
voiddrawblocks(intline);//方块显示
voidclearsquare(intline);//方块擦出
voidturn(intline);//方块旋转
boolisavailable(intline);//判断是否能下落
voidremember(intline);//记忆方块位置
voiddeleteline(intline);//方块满一行消除
boolifgameover();//判断是否游戏结束
voidend();//游戏结束
#defineup72
#definedown80
#defineleft75
#defineright77
#defineesc27
HANDLEhandle;
inta1[4][4]={{1},{1,1,1}};//七种方块的二维数组
inta2[4][4]={{0,1},{1,1,1}};
inta3[4][4]={{1,1},{0,1,1}};
inta4[4][4]={{0,0,1},{1,1,1}};
inta5[4][4]={{0,1,1},{1,1}};
inta6[4][4]={{1,1,1,1}};
inta7[4][4]={{1,1},{1,1}};
introw=0;//列数
intscore=0;
intlevel=0;
int*block1=NULL;
int*block2=NULL;
int*block3=NULL;
intcoordinate[12][18]={0};//坐标数组,边框12*18(最后一行,两边边框计算在)
intjudge=0;
intscorex=0;
inttemp[4][4]={0};
voidmain()//主函数
{
intt=1;
handle=initiate();
while(t)
{
t=0;
begin();
sndPlaySound("music.wav",SND_LOOP|SND_ASYNC);
frame();
WORDwColors[1];
wColors[0]=FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;
for(intk=1;k<=999999;k++)
{
if(ifgameover())//判断是否结束
{
textout(handle,34,10,wColors,1,"GameOver");
Sleep(800);
end();
}
else
{
if(k==1)
block2=getblocks();
block3=block2;//block2指向将出现的方块地址
block2=getblocks();//获取下一个新的方块
block1=block3;
row=52;
clearsquare(16);//擦除next的方块
block1=block2;
drawblocks(15);//在next显示下一块方块图形
row=34;
block1=block3;
for(inti=4;i<=7;i++)//所构建的方块图形最多只有占有两排,所以只用4-7即可对应
{
if(*(block1+i))
textout(handle,26+i*2,4,wColors,1,"■");//方块先露出下面部分
}
Sleep(500-50*level);
for(intline=4;line<=22;line++)//方块自主下落,方块从第四排开始出现
{
if(isavailable(line))//检验刚产生的方块是否碰壁,碰到已落方块
{
clearsquare(line);//消除方块先露初的下面分
drawblocks(line);//产生完整的下落方块
move(line);
}
else
{
remember(line);//落定后将这些位置对应的all数组中元素置1
deleteline(line);//消行以及加分
if(line==4)
judge=1;
break;
}
}
}
}
}
}
voidbegin()
{
inti=1;
WORDwColors[1];
wColors[0]=FOREGROUND_GREEN|FOREGROUND_INTENSITY;
WORDwColors1[2];
wColors1[0]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;
wColors1[1]=FOREGROUND_RED|FOREGROUND_INTENSITY;
textout(handle,18,4,wColors,1,"◢◣◢◣");
textout(handle,18,5,wColors,1,"◢◎◣◢◎◣");
textout(handle,18,6,wColors,1," ◢█████████◣");
textout(handle,18,7,wColors,1," ██◤^ ^◥██");
textout(handle,18,8,wColors,1," ██ ██");
textout(handle,18,9,wColors,1," ◢██ ██◣");
textout(handle,18,10,wColors,1," ██◤ ● ● ◥██");
textout(handle,18,11,wColors,1," ██ ◎ ◎ ██");
textout(handle,18,12,wColors,1," ◥█◣ T ◢█◤");
textout(handle,18,13,wColors,1," ██◣ ◢██");
textout(handle,18,14,wColors,1," ◥███████◤");
textout(handle,18,15,wColors,1," ");
textout(handle,18,16,wColors,1," 简单◥███████◤中等");
textout(handle,18,17,wColors,1," 请按1 █请按2");
textout(handle,18,18,wColors,1," █");
textout(handle,18,19,wColors,1," ◢██◣");
textout(handle,18,20,wColors,1,"困难请按3");
textout(handle,54,22,wColors,1,"MADEBY");
while(i)
{
textout(handle,30,8,wColors1,2,"俄罗斯方块");
Sleep(800);
textout(handle,30,8,wColors1,2,"");
Sleep(800);
if(_kbhit())//输入等级
{
switch(_getch())
{
case'1':
{
level=1;
i=0;//跳出循环
break;
}
case'2':
{
level=4;
i=0;
break;
}
case'3':
{
level=7;
i=0;
break;
}
}
}
}
system("cls");//清屏
}
voidframe()//边框的设定
{
WORDwColors[1];
wColors[0]=FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY;
WORDwColors1[1];
wColors1[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;
for(inti=0;i<=11;i++)
coordinate[i][17]=1;//底排边框定义为1
for(intj=0;j<=17;j++)
{
coordinate[0][j]=1;//两边边框定义为1
coordinate[11][j]=1;
}
charstring[5];
textout(handle,59,5,wColors,1,itoa(level,string,10));
textout(handle,52,5,wColors,1,"level:
");
textout(handle,52,9,wColors,1,"score:
0");
textout(handle,52,13,wColors,1,"next:
");
textout(handle,10,6,wColors1,1,"暂停SPACE");
textout(handle,10,7,wColors1,1,"退出ESC");
textout(handle,10,8,wColors1,1,"翻转↑");
textout(handle,10,9,wColors1,1,"向右→");
textout(handle,10,10,wColors1,1,"向左←");
textout(handle,10,11,wColors1,1,"加速↓");
textout(handle,33,2,wColors,1,"来~战个痛");
for(intm=13;m<=24;m++)
{
textout(handle,2*m,3,wColors,1,"═");//上边框
}
for(intn=4;n<=21;n++)
{
textout(handle,26,n,wColors,1,"‖");//左边框
}
for(intk=4;k<=21;k++)
{
textout(handle,48,k,wColors,1,"‖");//右边框
}
for(intl=13;l<=23;l++)
{
textout(handle,2*l,21,wColors,1,"═");//下边框
}
textout(handle,26,3,wColors,1,"◤");
textout(handle,48,3,wColors,1,"◥");
textout(handle,26,21,wColors,1,"◣");
textout(handle,48,21,wColors,1,"◢");
}
int*getblocks()//随机方块生成
{
int*m=NULL;
srand(time(NULL));
intn=rand()%7;
switch(n)
{
case0:
m=&a1[0][0];break;
case1:
m=&a2[0][0];break;
case2:
m=&a3[0][0];break;
case3:
m=&a4[0][0];break;
case4:
m=&a5[0][0];break;
case5:
m=&a6[0][0];break;
case6:
m=&a7[0][0];break;
}
returnm;
}
voiddrawblocks(intline)//出现方块
{
WORDwColors[1];
wColors[0]=FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY;
for(intj=0;j<=15;j++)
{
inttemp;
temp=j/4;
if(*(block1+j))
textout(handle,row+j*2-temp*8,line+temp,wColors,1,"■");
}
}
voidclearsquare(intline)//方块消失
{
WORDwColors[1];
wColors[0]=FOREGROUND_BLUE|FOREGROUND_INTENSITY;
if(line==4)//针对消除刚产生的下排
{
textout(handle,34,4,wColors,1,"");
textout(handle,36,4,wColors,1,"");
textout(handle,38,4,wColors,1,"");
textout(handle,40,4,wColors,1,"");
}
else
{
for(intm=0;m<=15;m++)
{
inttemp;
temp=m/4;//得0-3对应方块数组1-4行
if(*(block1+m))
textout(handle,row+m*2-temp*8,line-1+temp,wColors,1,"");
}
}
}
voidmove(intline)//方块的左右移动,加速下落,翻转等
{
intmid=0,speed=100-10*level;
while(mid { if(_kbhit()) { switch(_getch()) { case72: //翻转 { turn(line); break; } case75: //左移 { row=row-2;//纵坐标减2 if(isavailable(line))//判断是否能移动 { row=row+2; clearsquare(line+1);//消除原来图案,line+1是避免line=4程序出错 row=row-2; drawblocks(line);//出现新图案 } else row=row+2;//若不能移动则纵坐标不变 break; } case77: //右移 { row=row+2; if(isavailable(line)) { row=row-2; clearsquare(line+1); row=row+2; drawblocks(line); } else row=row-2; break; } case80: //加速下落,即直接跳除循环 { mid=speed; break; } case27: //终止游戏 { end(); break; } case32: //暂停 { intflag=1; while(flag) { if(_kbhit()) { if(_getch()==32) flag=0; break; } else Sleep(10); } } default: break; } } Sleep(8);//使方块延迟 mid++; } } voidturn(intline) { clearsquare(line+1);//消除原来的图案 intb[4][4]={0};//保存旋转前的方块 intnum=0,l=0; for(intm=0;m<=3;m++) { for(intn=0;n<=3;n++) { b[m][n]=*(block1+m*4+n);//把b[4][4]全赋值为当前图形数组 temp[m][n]=0; } } for(inti=3;i>=0;i--)//按行从下向上扫描 { for(intj=0;j<4;j++)//按列从左向右扫描 { if(b[i][j])//如果为有效点,则进行90度旋转 { temp[j][l]=b[i][j]; num=1; } } if(num) { l++; num=0; } } block1=&temp[0][0]; if(isavailable(line)) drawblocks(line); else { for(intp=0;p<=3;p++) { for(intq=0;q<=3;q++) temp[p][q]=b[p][q]; } block1=&temp[0][0]; drawblocks(line); } } boolisavailable(intline)//检验,即看方块即将存在位置是否已经有1 { intx,y; for(intm=0;m<=15;m++) { inttemp; temp=m/4; x=row/2-13-4*temp+m;//边框左边已有13个位置 y=line-4+temp;//上面已有4个位置 if(*(block1+m)&&coordinate[x][y])//相与为1则返回0,否则跳出并循环继续 return0; } } voidremember(intline)//记忆 { intx,y; for(intm=0;m<=15;m++) { inttemp; temp=m/4; x=row/2-13-temp*4+m; y=line-4+temp; if(*(block1+m))//如果当前位置为1,则返回原位置,并设置为1 coordinate[x][y-1]=1; } } voiddeleteline(intl)//消行 { WORDwColors[1]; wColors[0]=FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY; intsnum=0,b=0; for(intm=0;m<=16;m++)//从上向下消去方块 { if(coordinate[1][m]==1&&coordinate[2][m]==1&&coordinate[3][m]==1&&coordinate[4][m]==1&&coordinate[5][m]==1&&coordinate[6][m]==1&&coordinate[7][m]==1&&coordinate[8][m]==1&&coordinate[9][m]==1&&coordinate[10][m]==1) { textout(handle,28,m+4,wColors,1,"﹌﹌﹌﹌good﹌﹌﹌﹌"); Sleep(750); for(intn=1;n<=m;n++) { for(intj=1;j<=10;j++) coordinate[j][m-n+1]=coordinate[j][m-n]; } snum++; } } for(intn=1;n<=10;n++) { for(intd=0;d<=16;d++) { intx,y; x=n*2+26; y=d+4; textout(handle,x,y,wColors,1,""); if(coordinate[n][d]) { textout(handle,x,y,wColors,1,"■"); } } } score=score+(snum*(snum+1)/2); if((score-scorex)>=30)//每得到30分自动加速 { level++; scorex=score; } charstring[5]; textout(handle,59,9,wColors,1,itoa(score,string,10)); textout(handle,59,5,wColors,1,itoa(level,string,10)); } boolifgameover()//终止游戏 { if(judge==1) { return1; } else return0; } voidend()//退出 { WORDwColors[1]; wColors[0]=FOREGROUND_GREEN|FOREGROUND_INTENSITY; textout(handle,28,22,wColors,1,"Pressanykeytoexit"); while (1) { if(_kbhit()) { exit(EXIT_SUCCESS); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 俄罗斯方块 代码 北邮版