俄罗斯方块C源代码
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#define ZL 4 //坐标增量, 不使游戏窗口靠边
#define WID 36 //游戏窗口的宽度
#define HEI 20 //游戏窗口的高度
int i,j,Ta,Tb,Tc // Ta,Tb,Tc用于记住和转换方块变量的值
int a[60][60]={0} //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框
int b[4] //标记4个"口"方块:1有,0无,类似开关
int x,y, level,score,speed //方块中心位置的x,y坐标,游戏等级、得分和游戏速度
int flag,next //当前要 *** 作的方块类型序号,下一个方块类型序号
void gtxy(int m, int n) //以下声明要用到的自编函数
void gflag( ) //获得下一方块序号
void csh( ) //初始化界面
void start( ) //开始部分
void prfk ( ) //打印方块
void clfk( ) //清除方块
void mkfk( ) //制作方块
void keyD( ) //按键 *** 作
int ifmov( ) //判断方块能否移动或变体
void clHA( ) //清除满行的方块
void clNEXT( ) //清除边框外的NEXT方块
int main( )
{ csh( )
while(1)
{start( ) //开始部分
while(1)
{ prfk( )
Sleep(speed) //延时
clfk( )
Tb=xTc=flag //临存当前x坐标和序号,以备撤销 *** 作
keyD( )
y++ //方块向下移动
if (ifmov( )==0) { y-- prfk( ) dlHA( ) break} //不可动放下,删行,跨出循环
}
for(i=y-2i<y+2i++){ if (i==ZL) { j=0 } } //方块触到框顶
if (j==0) { system("cls")gtxy(10,10)printf("游戏结束!") getch() break }
clNEXT( ) //清除框外的NEXT方块
}
return 0
}
void gtxy(int m, int n) //控制光标移动
{COORD pos //定义变量
pos.X = m //横坐标
pos.Y = n //纵坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos)
}
void csh( ) //初始化界面
{gtxy(ZL+WID/2-5,ZL-2) printf("俄罗斯方块") //打印游戏名称
gtxy(ZL+WID+3,ZL+7) printf("******* NEXT:") //打印菜单信息
gtxy(ZL+WID+3,ZL+13) printf("**********")
gtxy(ZL+WID+3,ZL+15) printf("Esc :退出游戏")
gtxy(ZL+WID+3,ZL+17) printf("↑键:变体")
gtxy(ZL+WID+3,ZL+19) printf("空格:暂停游戏")
gtxy(ZL,ZL) printf("╔") gtxy(ZL+WID-2,ZL) printf("╗") //打印框角
gtxy(ZL,ZL+HEI) printf("╚") gtxy(ZL+WID-2,ZL+HEI) printf("╝")
a[ZL][ZL+HEI]=2 a[ZL+WID-2][ZL+HEI]=2 //记住有图案
for(i=2i<WID-2i+=2) {gtxy(ZL+i,ZL) printf("═") } //打印上横框
for(i=2i<WID-2i+=2) {gtxy(ZL+i,ZL+HEI) printf("═") a[ZL+i][ZL+HEI]=2 } //下框
for(i=1i<HEIi++) { gtxy(ZL,ZL+i) printf("║") a[ZL][ZL+i]=2 } //左竖框记住有图案
for(i=1i<HEIi++) {gtxy(ZL+WID-2,ZL+i) printf("║") a[ZL+WID-2][ZL+i]=2 } //右框
CONSOLE_CURSOR_INFO cursor_info={1,0} //以下是隐藏光标的设置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info)
level=1 score=0 speed=400
gflag( ) flag=next //获得一个当前方块序号
}
void gflag( ) //获得下一个方块的序号
{ srand((unsigned)time(NULL)) next = rand()%19+1}
void start( ) //开始部分
{ gflag( ) Ta=flag flag=next //保存当前方块序号,将下一方块序号临时 *** 作
x=ZL+WID+6 y=ZL+10 prfk( ) //给x,y赋值,在框外打印出下一方块
flag=Ta x=ZL+WID/2 y=ZL-1 //取回当前方块序号,并给x,y赋值
}
void prfk ( ) //打印俄罗斯方块
{ for(i=0i<4i++) {b[i]=1 } //数组b[4]每个元素的值都为1
mkfk ( ) //制作俄罗斯方块
for( i= x-2 i<=x+4 i+=2 ) //打印方块
{ for(j=y-2j<= y+1j++) { if( a[i][j]==1 && j>ZL ){ gtxy(i,j) printf("□") } } }
gtxy(ZL+WID+3,ZL+1) printf("level : %d",level) //以下打印菜单信息
gtxy(ZL+WID+3,ZL+3) printf("score : %d",score)
gtxy(ZL+WID+3,ZL+5) printf("speed : %d",speed)
}
void clfk( ) //清除俄罗斯方块
{ for(i=0i<4i++) { b[i]=0 } //数组b[4]每个元素的值都为0
mkfk ( ) //制作俄罗斯方块
for( i=x-2 i<=x+4 i+=2 ) //清除方块
{ for(j=y-2j<=y+1j++){ if( a[i][j]==0 && j>ZL ){ gtxy(i,j) printf(" ") } } }
}
void mkfk( ) //制作俄罗斯方块
{ a[x][ y]=b[0] //方块中心位置状态: 1-有,0-无
switch(flag) //共6大类,19种小类型
{ case 1: { a[x][y-1]=b[1] a[x+2][y-1]=b[2] a[x+2][y]=b[3] break } //田字方块
case 2: { a[x-2][y]=b[1] a[x+2][y]=b[2] a[x+4][y]=b[3] break } //直线方块:----
case 3: { a[x][y-1]=b[1] a[x][y-2]=b[2] a[x][y+1]=b[3] break } //直线方块: |
case 4: { a[x-2][y]=b[1] a[x+2][y]=b[2] a[x][y+1]=b[3] break } //T字方块
case 5: { a[x][y-1]=b[1] a[x][y+1]=b[2] a[x-2][y]=b[3] break } //T字顺时针转90度
case 6: { a[x][y-1]=b[1] a[x-2][y]=b[2] a[x+2][y]=b[3] break } //T字顺转180度
case 7: { a[x][y-1]=b[1] a[x][y+1]=b[2] a[x+2][y]=b[3] break } //T字顺转270度
case 8: { a[x][y+1]=b[1] a[x-2][y]=b[2] a[x+2][y+1]=b[3] break } //Z字方块
case 9: { a[x][y-1]=b[1] a[x-2][y]=b[2] a[x-2][y+1]=b[3] break } //Z字顺转90度
case 10: { a[x][y-1]=b[1] a[x-2][y-1]=b[2] a[x+2][y]=b[3] break } //Z字顺转180度
case 11: { a[x][y+1]=b[1] a[x+2][y-1]=b[2] a[x+2][ y]=b[3] break } //Z字顺转270度
case 12: { a[x][y-1]=b[1] a[x][y+1]=b[2] a[x-2][y-1]=b[3] break } //7字方块
case 13: {a[x-2][y]=b[1] a[x+2][y-1]=b[2] a[x+2][y]=b[3] break } //7字顺转90度
case 14: { a[x][y-1]=b[1] a[x][y+1]=b[2] a[x+2][y+1]=b[3] break } //7字顺转180度
case 15: { a[x-2][y]=b[1] a[x-2][y+1]=b[2] a[x+2][y]=b[3] break } //7字顺转270度
case 16: { a[x][y+1]=b[1] a[x][y-1]=b[2] a[x+2][y-1]=b[3] break } //倒7字方块
case 17: { a[x-2][y]=b[1] a[x+2][y+1]=b[2] a[x+2][y]=b[3] break } //倒7字顺转90度
case 18: { a[x][y-1]=b[1] a[x][y+1]=b[2] a[x-2][y+1]=b[3] break } //倒7字顺转180度
case 19: { a[x-2][y]=b[1] a[x-2][y-1]=b[2] a[x+2][y]=b[3] break } //倒7字顺转270度
}
}
void keyD( ) //按键 *** 作
{ if (kbhit( ))
{ int key
key=getch()
if (key==224)
{ key=getch()
if (key==75) { x-=2 } //按下左方向键,中心横坐标减2
if (key==77) { x+=2 } //按下右方向键,中心横坐标加2
if (key==72) //按下向上方向键,方块变体
{ if (flag>=2 && flag<=3 ) { flag++ flag%=2 flag+=2 }
if ( flag>=4 && flag<=7 ) { flag++ flag%=4 flag+=4 }
if (flag>=8 && flag<=11 ) { flag++ flag%=4 flag+=8 }
if (flag>=12 && flag<=15 ) { flag++ flag%=4 flag+=12 }
if ( flag>=16 && flag<=19 ) { flag++ flag%=4 flag+=16 } }
}
if (key==32) //按空格键,暂停
{ prfk( ) while(1) { if (getch( )==32) { clfk( )break} } } //再按空格键,继续游戏
if (ifmov( )==0) { x=Tb flag=Tc } //如果不可动,撤销上面 *** 作
else { prfk( ) Sleep(speed) clfk( ) Tb=xTc=flag} //如果可动,执行 *** 作
}
}
int ifmov( ) //判断能否移动
{ if (a[x][y]!=0) { return 0 } //方块中心处有图案返回0,不可移动
else{ if ( (flag==1 && ( a[x][ y-1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||
(flag==2 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x+4][y]==0 ) ) ||
(flag==3 && ( a[x][y-1]==0 && a[x][y-2]==0 && a[x][y+1]==0 ) ) ||
(flag==4 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x][y+1]==0 ) ) ||
(flag==5 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y]==0 ) ) ||
(flag==6 && ( a[x][ y-1]==0 && a[x-2][y]==0 && a[x+2][y]==0 ) ) ||
(flag==7 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y]==0 ) ) ||
(flag==8 && ( a[x][y+1]==0 && a[x-2][y]==0 && a[x+2][y+1]==0 ) ) ||
(flag==9 && ( a[x][y-1]==0 && a[x-2][y]==0 && a[x-2][y+1]==0 ) ) ||
(flag==10 && ( a[x][y-1]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) ||
(flag==11 && ( a[x][y+1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||
(flag==12 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y-1]==0 ) ) ||
( flag==13 &&( a[x-2][y]==0 &&a[x+2][y-1]==0 &&a[x+2][y]==0 ) ) ||
( flag==14 &&( a[x][y-1]==0 &&a[x][y+1]==0 &&a[x+2][y+1]==0 ) ) ||
(flag==15 &&( a[x-2][y]==0 &&a[x-2][y+1]==0 &&a[x+2][y]==0 ) ) ||
(flag==16 &&( a[x][y+1]==0 &&a[x][y-1]==0 &&a[x+2][y-1]==0 ) ) ||
( flag==17 &&( a[x-2][y]==0 &&a[x+2][y+1]==0 &&a[x+2][y]==0 ) ) ||
(flag==18 &&( a[x][y-1]==0 &&a[x][y+1]==0 &&a[x-2][y+1]==0 ) ) ||
(flag==19 &&( a[x-2][y]==0 &&a[x-2][y-1]==0
&& a[x+2][y]==0 ) ) ) { return 1 }
}
return 0 //其它情况返回0
}
void clNEXT( ) //清除框外的NEXT方块
{ flag = next x=ZL+WID+6 y=ZL+10 clfk( ) }
void clHA( ) //清除满行的方块
{ int k, Hang=0 //k是某行方块个数, Hang是删除的方块行数
for(j=ZL+HEI-1j>=ZL+1j--) //当某行有WID/2-2个方块时,则为满行
{ k=0 for(i=ZL+2i<ZL+WID-2i+=2)
{ if (a[i][j]==1) //竖坐标从下往上,横坐标由左至右依次判断是否满行
{ k++ //下面将 *** 作删除行
if (k==WID/2-2) { for(k=ZL+2k<ZL+WID-2k+=2)
{ a[k][j]=0 gtxy(k,j) printf(" ") Sleep(1) }
for(k=j-1k>ZLk--)
{ for(i=ZL+2i<ZL+WID-2i+=2) //已删行数上面有方块,先清除再全部下移一行
{ if(a[i][k]==1) { a[i][k]=0 gtxy(i,k) printf(" ")a[i][k+1]=1
gtxy(i,k+1) printf("□") } }
}
j++ //方块下移后,重新判断删除行是否满行
Hang++ //记录删除方块的行数
}
}
}
}
score+=100*Hang //每删除一行,得100分
if ( Hang>0 && (score%500==0 || score/500> level-1 ) ) //得分满500速度加快升一级
{ speed-=20 level++ if(speed<200)speed+=20}
}
你好。试试这个#include#include
#include
#include
#include
#include
#include
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define SPACE 0x3920
#define Y 0x1579
#define N 0x316e
#define clearkbd()while(bioskey(1)) bioskey(0)/*清空键盘缓冲队列*/
void update()
void messagebox()
void process()
void initremove()
void initinfo()
void initbox()
void initposition()
void next_shape()
typedef struct shape /*形状单一状态的记录*/
{ int attr
int co[8]
}shape
typedef struct RE_AB /*相对,绝对坐标记录*/
{ int Rx,Ry
int x1,x2,y1,y2
}RE_AB
RE_AB RA
shape p[19]={ { RED,0,1,1,0,1,1,2,1 }, /*数组中保证y最大的在最后,以便initposition使用*/
{ RED,0,1,1,0,1,1,1,2 },
{ RED,0,0,1,0,2,0,1,1 },
{ RED,0,0,0,1,1,1,0,2 },
{ GREEN,0,0,1,0,2,0,3,0 },
{ GREEN,0,0,0,1,0,2,0,3 },
{ CYAN,0,0,0,1,1,0,1,1 },
{ BROWN,0,0,1,0,1,1,2,1 },
{ BROWN,1,0,0,1,1,1,0,2 },
{ BLUE,1,0,2,0,1,1,0,1 },
{ BLUE,0,0,0,1,1,1,1,2 },
{ MAGENTA,0,0,0,1,0,2,1,2 },
{ MAGENTA,2,0,0,1,1,1,2,1},
{ MAGENTA,0,0,1,0,1,1,1,2 },
{ MAGENTA,0,0,0,1,1,0,2,0 },
{ YELLOW,0,2,1,0,1,1,1,2 },
{ YELLOW,0,0,1,0,2,0,2,1 },
{ YELLOW,1,0,0,0,0,1,0,2},
{ YELLOW,0,0,0,1,1,1,2,1 },
}
int nback,nleft,nright,r_f[12][22],rs1,rs2,xcors,xcorb,ycors,ycorb
/*检查方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区中的位置,按键存储*/
void interrupt (*oldint)()/*系统定时中断*/
int count_down=0,count_other=0/*中断记时*/
void interrupt newint() /*设置新的中断程序*/
{ count_down++
count_other++
oldint()
}
void intenable() /*设置中断向量表,启动新的中断程序*/
{ oldint=getvect(0x1c)
disable()
setvect(0x1c,newint)
enable()
}
void intrestore() /*恢复中断向量*/
{ disable()
setvect(0x1c,oldint)
enable()
}
void HZ12(int x0,int y0,int w,int color,char *s) /*根据字模,在dos下显示汉字*/
/*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/
{ FILE *fp
register char buffer[24]
register char str[2]
unsigned long fpos/*fpos为最终偏移动量*/
register int i,j,k
fp=fopen(hzk12,r)/*打开12*12汉字苦*/
while(*s)/*一直到字符串结束为止*/
{
if(*s<0)/*汉字输出*/
{ str[0]=(*s)-0xa0
str[1]=*(s+1)-0xa0
fpos=((str[0]-1)*94+(str[1]-1))*24L/*计算汉字在hzk12的偏移量*/
fseek(fp,fpos,SEEK_SET)/*指针移动到当前位置*/
fread(buffer,24,1,fp)/*读取一个汉字到数组中*/
for(i=0i<12i++)/*12行*/
for(j=0j<2j++)/*两个字节*/
for(k=0k<8k++)/*8位*/
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)/*是一就画点*/
putpixel(x0+8*j+k,y0+i,color)
s+=2/*一个汉字占两个字节,现在将指针移动两个字节*/
x0+=w/*显示坐标也按照间隔移动*/
}
else/*显示非汉字字符*/
{ settextstyle(0,0,1)
setcolor(color)
str[0]=*sstr[1]=0
outtextxy(x0,y0+3,str)/*显示单个字符*/
x0+=w-7/*显示单个字符后的x坐标变化*/
s++/*指针移动到下一个字节*/
}
}
fclose(fp)
}
void translation() /*把相对坐标解释为绝对坐标*/
{ if(RA.Rx==1)
{ RA.x1=1RA.x2=16}
else
{ RA.x1=16*(RA.Rx-1)RA.x2=16*RA.Rx}
if(RA.Ry==1)
{ RA.y1=1RA.y2=16}
else
{ RA.y1=16*(RA.Ry-1)RA.y2=16*RA.Ry}
}
int check_b() /*检查是否到达低部*/
{ int x,y,i,zf=0/*zf为是否有颜色填充记录*/
for(i=0i<7i++,i++)
{ x=RA.Rx+p[rs1].co[i]
y=RA.Ry+p[rs1].co[i+1]
if(y>=6)
zf+=r_f[x-15][y-6+1]
}
if(zf==0)
return 1
else
return 0
}
int finish()
{ int tfull=0,i/*判断顶层空间是否有填充*/
for(i=1i<11i++)
tfull+=r_f[i][1]
if(tfull!=0)
return 1/*告诉judge()可以结束了*/
}
int check_l() /*检查形状是否与左接触*/
{ int x,y,i,zf=0
for(i=0i<7i++,i++)
{ x=RA.Rx+p[rs1].co[i]
y=RA.Ry+p[rs1].co[i+1]
if(y>6)
zf+=r_f[x-15-1][y-6]
if(y<=6&&x==16)
zf+=1
}
if(zf==0)
return 1
else
return 0
}
int check_r() /*检查形状是否与右接触*/
{ /*zf为是否有颜色填充记录*/
int x,y,i,zf=0/*zf为是否有颜色填充记录*/
for(i=0i<7i++,i++)
{
x=RA.Rx+p[rs1].co[i]
y=RA.Ry+p[rs1].co[i+1]
if(y>6)
zf+=r_f[x-15+1][y-6]
if(y<=6&&x==25)
zf+=1
}
if(zf==0)
return 1
else
return 0
}
void check_touch()
{ nback=check_b()
nleft=check_l()
nright=check_r()
}
void draw(int cb) /*画形状,cb=1以填充色画形状,cb=2以背景色画形状,cb=3以白色画形状*/
{ int i,recordx=RA.Rx,recordy=RA.Ry
for(i=0i<7i++,i++)
{ RA.Rx+=p[rs1].co[i]
RA.Ry+=p[rs1].co[i+1]
if(RA.Ry<=6)
{ RA.Rx=recordx
RA.Ry=recordy
continue
}
translation()
if(cb==1)
setfillstyle(1,p[rs1].attr)
else
if(cb==2)
setfillstyle(1,BLACK)
else
if(cb==3)
{ setfillstyle(1,WHITE)
r_f[RA.Rx-15][RA.Ry-6]=1/*置对应数组标记元素*/
}
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1)
RA.Rx=recordx
RA.Ry=recordy
}
}
void mov(int key) /*向下,左,右移动方块*/
{ draw(2)
if(key==LEFT&&nleft)
RA.Rx--
else
if(key==RIGHT&&nright)
RA.Rx++
else
RA.Ry++
nback=check_b()
if(nback) /*判断形状有没有到达底部,有就将其颜色变为白色*/
draw(1)
else
draw(3)
}
void change() /*变换形状*/
{ int status=rs1,buffer,i,x,y,zf=0
if(p[rs1].attr==p[rs1+1].attr)
rs1++
else
while(p[rs1].attr==p[rs1-1].attr)
rs1--
for(i=0i<7i++,i++) /*检查变化形状后是否与已存形状发生冲突*/
{ x=RA.Rx+p[rs1].co[i]
y=RA.Ry+p[rs1].co[i+1]
if(y>6)
zf+=r_f[x-15][y-6]
}
if(zf!=0)
rs1=status
buffer=rs1
rs1=status
status=buffer
draw(2)
buffer=rs1
rs1=status
status=buffer
nback=check_b()/*判断变化后的形状是不是到达了低部,这个检查是十分必要的*/
if(nback)
draw(1)
else
draw(3)
}
void accelerate()
{ if(count_down>=1)
{ check_touch()/*消除上一步动作对方块状态的影响*/
count_down=0
if(nback) /*0表示到达底部,1表示没有到达*/
mov(DOWN)
}
}
void drawbox() /*画方块所在方框*/
{ int xcor,ycor
for(xcor=xcorsxcor<=xcorbxcor++)
for(ycor=ycorsycor<=ycorbycor++)
{ if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb)
{ RA.Rx=xcor
RA.Ry=ycor
translation()
setfillstyle(1,DARKGRAY)
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1)
}
}
}
void erasure(int k)
{ int i,j,recordx=RA.Rx,recordy=RA.Ry
{ j=k-1
for(j>0j--)
{ for(i=1i<11i++)
{ r_f[i][j+1]=r_f[i][j]
RA.Rx=i+15
RA.Ry=j+1+6
translation()
if(r_f[i][j+1]==1)
setfillstyle(1,WHITE)
else
setfillstyle(1,BLACK)
bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1)
RA.Rx=recordx
RA.Ry=recordy
}
}
}
}
void pause()
{ HZ12(450,400,15,BLACK,正常)
HZ12(450,400,15,GREEN,暂停)
for()
if(bioskey(1)&&bioskey(0)==SPACE)
{ clearkbd()
HZ12(450,400,15,BLACK,暂停)
HZ12(450,400,15,RED,正常)
return
}
}
void judge()
{ int i,j,full=0/*full等于10说明某一行满,该消除了*/
if(finish()) /*判断游戏是否该结束了*/
messagebox()/*win编程里有这个函数*/
for(j=1j<21j++) /*判断某一行是否满了*/
{ for(i=1i<11i++)
full+=r_f[i][j]
if(full==10)
erasure(j)/*消除这行*/
full=0
}
}
void update() /*使程序可以重新运行*/
{ cleardevice()
setbkcolor(BLACK)
initinfo()/*提示信息初始化*/
initbox()/*游戏框架初始化*/
srand((unsigned)time(NULL))/*随机器函数的初始化*/
rs1=random(19)
rs2=random(19)
next_shape()
initposition()/*方块最开始的出现位置*/
initremove()/*记录每个方格有无颜色填充数组初始化*/
HZ12(450,400,15,RED,正常)
process()
}
void EXIT()
{ closegraph()
intrestore()/*恢复中断向量*/
exit(0)
}
void initremove()
{ int i,j
for(i=0i<12i++)
for(j=0j<22j++)
if(i==0||i==11||j==0||j==21)
r_f[i][j]=1
else
r_f[i][j]=0
}
void initinfo()
{ char aStr[2]
setcolor(RED)
outtextxy(450,100,This game's writer is:)
HZ12(450,140,15,RED,该程序作者:NULL)
outtextxy(525,110,NULL)
outtextxy(450,180,FUNCTION FOR KEYS:)
outtextxy(450,200,UP:change the shape)
outtextxy(450,210,DOWN:accelerate)
outtextxy(450,220,LEFT:move left)
outtextxy(450,230,RIGHT:move right)
outtextxy(450,240,ESC:exit this game)
outtextxy(450,250,SPACE:pause)
HZ12(450,260,20,RED,上:)
HZ12(450,280,20,RED,下:)
HZ12(450,300,20,RED,左:)
HZ12(450,320,20,RED,右:)
HZ12(450,340,20,RED,ESC:退出)
HZ12(450,360,15,RED,空格: 暂停/开始)
HZ12(450,380,15,RED,目前状态:)
HZ12(20,200,15,RED,下一个形状)
aStr[0]=24
aStr[1]=0
aStr[6]=0
HZ12(480,260,12,GREEN,aStr)
HZ12(500,260,12,GREEN,( 变形 ))
aStr[0]=25
aStr[1]=0
HZ12(480,280,12,GREEN,aStr)
HZ12(500,280,12,GREEN,( 加速 ))
aStr[0]=27
aStr[1]=0
HZ12(480,300,12,GREEN,aStr)
HZ12(500,300,12,GREEN,向左)
aStr[0]=26
aStr[1]=0
HZ12(480,320,12,GREEN,aStr)
HZ12(500,320,12,GREEN,向右)
}
void messagebox()
{ int key
setcolor(GREEN)
setfillstyle(1,DARKGRAY)
rectangle(220,200,420,300)
bar(221,201,419,299)
HZ12(280,210,15,GREEN,GAME OVER)
HZ12(275,230,15,GREEN,重新游戏: Y)
HZ12(275,270,15,GREEN,退出游戏: N)
HZ12(450,400,15,BLACK,正常)
HZ12(450,400,15,GREEN,GAME OVER)
for()
if(bioskey(1))
{ key=bioskey(0)
if(key==Y)
{ clearkbd()
update()
}
else
if(key==N)
{ clearkbd()
EXIT()
}
else
clearkbd()
}
}
void initbox()
{ xcors=15/*画游戏框*/
xcorb=26
ycors=6
ycorb=27
drawbox()
xcors=2/*画提示框*/
xcorb=7
ycors=6
ycorb=11
drawbox()
}
void initposition()
{ RA.Rx=18
RA.Ry=6-p[rs1].co[7]
RA.x1=0
RA.x2=0
RA.y1=0
RA.y2=0
}
void next_shape() /*画下一形状提示框*/
{ int recordx=RA.Rx,recordy=RA.Ry,buffer
RA.Rx=3
RA.Ry=7
draw(2)
buffer=rs1
rs1=rs2
rs2=buffer
draw(1)
RA.Rx=recordx
RA.Ry=recordy
buffer=rs1
rs1=rs2
rs2=buffer
}
void process() /*游戏过程*/
{ for()
{ check_touch()
if(!nback)
{ rs1=rs2
rs2=random(19)/*产生另一种方块的码数*/
initposition()
judge()/*判断某一行是否满了和这个游戏是否可以结束了*/
draw(1)
next_shape()
}
if(count_other>=1)
{ count_other=0
if(bioskey(1)) /*对按键的处理*/
{ int key=bioskey(0)
clearkbd()/*清除键盘缓冲队列*/
if(key==ESC)
EXIT()
if(key==LEFT&&nleft&&nback)
mov(LEFT)
if(key==RIGHT&&nright&&nback)
mov(RIGHT)
if(key==UP&&nback)
change()
if(key==SPACE)
pause()
if(key==DOWN)
accelerate()
}
}
if(count_down>=4)
{ check_touch()/*消除上一步动作对方块状态的影响*/
count_down=0
if(nback) /*0表示到达底部,1表示没有到达*/
mov(DOWN)
}
}/*for*/
}
main()
{ int gdriver=DETECT,gmode=0
initgraph(&gdriver,&gmode,d:turboc)/*启动图形与中断部分*/
intenable()
update()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)