俄罗斯方块的源代码

俄罗斯方块的源代码,第1张

俄罗斯方块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()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7751713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存