C++俄罗斯方块代码.docx

上传人:b****7 文档编号:8589107 上传时间:2023-01-31 格式:DOCX 页数:36 大小:19.32KB
下载 相关 举报
C++俄罗斯方块代码.docx_第1页
第1页 / 共36页
C++俄罗斯方块代码.docx_第2页
第2页 / 共36页
C++俄罗斯方块代码.docx_第3页
第3页 / 共36页
C++俄罗斯方块代码.docx_第4页
第4页 / 共36页
C++俄罗斯方块代码.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

C++俄罗斯方块代码.docx

《C++俄罗斯方块代码.docx》由会员分享,可在线阅读,更多相关《C++俄罗斯方块代码.docx(36页珍藏版)》请在冰豆网上搜索。

C++俄罗斯方块代码.docx

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();

//游戏结束

 

#defineup

72

#definedown

80

 

文档

标准实用文案

 

#defineleft

75

#defineright

77

#defineesc

27

 

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_INTE

 

NSITY;

 

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,"

◥█◣

◢█◤");

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_INTE

 

NSITY;

 

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_INTEN

 

SITY;

 

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_INTEN

 

SITY;

 

intsnum=0,b=0;

 

for(intm=0;m<=16;m++)//从上向下消去方块

 

{

 

if(coordinate[1][m]==1&&coordinate[2][m]==1&&coordinate[3][m]==1&&coordi

 

nate[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]=coor

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1