分享
 
 
 

俺用c语言写的一个天下算法最烂的俄罗斯方块程序

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

/*tc3下调试通过,编译前将turboc目录下的egavga.bgi考到源程序所在目录下。

另要在 */

#include <graphics.h>/* 定义boland图形库*/

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <time.h>

#define ESC 0x11b /*定义键盘扫描码*/

#define UP 0x4800

#define DOWN 0x5000

#define LEFT 0x4b00

#define F1 0x3b00

#define RIGHT 0x4d00

#define YES 0x1579

#define NO 0x316e

#define RESTART 0x1372

/********************定义全局变量*****************************/

int grid[20][10];/*网格数组,0表示该格无方块,1则有运动方块,2则有静止方块*/

int level,score,interval;/*level--关数,score--消去的层数,

interval--下降的时间间隔(单位毫秒)*/

/**************************定义每种方块的形状***********************************/

static int I_SHAPE1[1][4]={1,1,1,1};/*I代表长条方块,O--方形*/

static int I_SHAPE2[4][1]={1,

1,

1,

1};

static int O_SHAPE[2][2]={1,1,

1,1};

static int T_SHAPE1[2][3]={1,1,1,

0,1,0};

static int T_SHAPE2[3][2]={0,1,

1,1,

0,1};

static int T_SHAPE3[2][3]={0,1,0,

1,1,1};

static int T_SHAPE4[3][2]={1,0,

1,1,

1,0};

static int L_SHAPE1[3][2]={1,0,

1,0,

1,1};

static int L_SHAPE2[2][3]={1,1,1,

1,0,0};

static int L_SHAPE3[3][2]={1,1,

0,1,

0,1};

static int L_SHAPE4[2][3]={0,0,1,

1,1,1};

static int J_SHAPE1[3][2]={0,1,

0,1,

1,1 };

static int J_SHAPE2[2][3]={1,0,0,

1,1,1};

static int J_SHAPE3[3][2]={1,1,

1,0,

1,0 };

static int J_SHAPE4[2][3]={1,1,1,

0,0,1};

static int Z_SHAPE1[2][3]={1,1,0,

0,1,1};

static int Z_SHAPE2[3][2]={0,1,

1,1,

1,0 };

static int N_SHAPE1[2][3]={0,1,1,

1,1,0};

static int N_SHAPE2[3][2]={1,0,

1,1,

0,1 };

/***************************定义方块的结构体*****************************/

struct block

{char type;/*方块的类型,共有I,O,T,L,J,Z,N七种类型*/

int shape;/*每种方块的具体形状*/

int x;/*方块最左上方的横坐标*/

int y;/*方块最左上方的横坐标*/

int color;/*方块的颜色*/

};

/***************************函数申明***********************************/

int ini_graph();/*初始化连接图形库graphic.h的驱动*/

int check_bottom();/*判断方块是否到容器底或下方已有别的方块,有则返回1,否则返回0*/

int check_top();/*判断方块是否到容器顶,也是游戏结束标志*/

int check_lborder();/*判断方块是否到容器左边缘或左边已有别的方块*/

int check_rborder();/*判断方块是否到容器右边缘或右边已有别的方块*/

int del_line();/*判断一行是否已满,如满则消格,返回1,否则返回0*/

void initial();/*初始化所有全局变量和界面*/

void restart();/*游戏结束后询问用户是退出还是重玩*/

void help();/*显示按键的帮助信息*/

void showscore();/*显示分数的界面*/

void test();/*测试grid[i][j]用的调试函数*/

void drawbar();/*画游戏的容器*/

void ini_grid();/*画容器里的格子*/

void show_next();/*在屏幕右上方显示下一个方块的信息*/

void drawblock();/*画方块*/

void clear_block();/*清除方块*/

void printscore();/*打印分数和关数*/

struct block create();/*随机产生一个新的方块*/

struct block change();/*旋转变换函数*/

/***************************主函数**********************************/

void main()

{int key;/* 用户按键*/

struct block nextblock,mblock;/*nextblock--下一个方块,mblock--现在的方块*/

initial();

help(420,200);

showscore();

printscore();

nextblock=create();

loop: if(check_top(mblock)) restart();/*如果方块没到容器顶,进行loop循环*/

printscore() ;

mblock=nextblock;

nextblock=create();

show_next(nextblock);

while(1)

{ if(bioskey(1)!=0) key=bioskey(0);

else key=0;

switch(key)

{ case DOWN:{ if(check_bottom(mblock)==1)

{ if(! del_line(mblock.y))

{ mblock.color=DARKGRAY;

drawblock(mblock);}goto loop;}

clear_block(mblock);

mblock.y=mblock.y+20;

drawblock(mblock);

}

break;

case UP: mblock=change(mblock);break;

case LEFT: if(!check_lborder(mblock)&&!check_bottom(mblock))

{clear_block(mblock);mblock.x-=20;} break;

case RIGHT:if(!check_rborder(mblock)&&!check_bottom(mblock))

{clear_block(mblock);mblock.x+=20;}

break;

case F1:test();break;

case ESC: setfillstyle(1, DARKGRAY);

bar(0,465,640,480);

outtextxy(5,469,"Are you sure to exit (Y/N)...");

while(1)

{ key=bioskey(0);

if (key==NO)

{initial();help(420,200);showscore();printscore();goto loop;}

if(key==YES)

{closegraph();exit(1);}

} break;

default:{ if(check_bottom(mblock)==1)

{ if(! del_line(mblock.y))

{ mblock.color=DARKGRAY;

drawblock(mblock);

}

goto loop;

}

clear_block(mblock);

mblock.y=mblock.y+20;

drawblock(mblock);

delay(interval);

}

}/*switch*/

}/*while*/

}/*main*/

/*初始化所有全局变量和界面*/

void initial()

{int i,j;

score=0;

interval=500;

for(i=0;i<20;i++)

for(j=0;j<10;j++)

grid[i][j]=0;

ini_graph();

drawbar();

ini_grid();

}

/*画游戏的容器*/

void drawbar()

{int left,top,right,bottom;

left=200;

top= 40;

right=400;

bottom=440;

setfillstyle(1,LIGHTBLUE);

bar(left,top,right,bottom);

bar(480,40,560,120);

}

/*在容器画 20*10 的格子 */

void ini_grid()

{int i,j;

for(i=0;i<10;i++)

for(j=0;j<20;j++)

{rectangle(200+i*20,40+j*20,200+i*20+20,40+j*20+20);/*画主容器的格子*/

}

for(i=0;i<4;i++)

for(j=0;j<4;j++)

rectangle(480+i*20,40+j*20,480+i*20+20,40+j*20+20);/*画显示下一个方块的格子*/

}

/*随机产生一个新的方块*/

struct block create()

{struct block newblock ;

int r;

r=random(7);

switch(r)

{case(0):newblock.type='I';newblock.color=5; break;

case(1):newblock.type='O';newblock.color=BLUE; break;

case(2):newblock.type='T';newblock.color=BROWN; break;

case(3):newblock.type='L';newblock.color=YELLOW; break;

case(4):newblock.type='J';newblock.color=LIGHTGREEN; break;

case(5):newblock.type='Z';newblock.color=GREEN; break;

case(6):newblock.type='N';newblock.color=RED; break;

}

newblock.shape=1;

newblock.x=300;

newblock.y=40;

return newblock;

}

/*消格函数,传递参数为方块的左上方的纵坐标值,如有消格,返回0,否则返回1*/

int del_line(int ty)

{int i,j ,b,i0,k,ret;

ret=0;

if (ty>=440) return 0;

i0=(ty-40)/20;

if(i0==19||i0==18||i0==17)b=19;

else b=i0+3;

for(k=i0;k<=b;k++)

{ for(j=0;j<10;j++)

if(!grid[k][j]) break;

if(j==10) {score++;

ret=1;

for(i=k;i>0;i--)

for(j=0;j<10;j++)

{ grid[i][j]=grid[i-1][j];

if(!grid[i][j])

{setfillstyle(1,LIGHTBLUE);

setcolor(WHITE);

rectangle(200+j*20,40+i*20,200+j*20+20,40+i*20+20);

floodfill(200+j*20+10,40+i*20+10,WHITE);

}

else {setfillstyle(9,DARKGRAY);

setcolor(DARKGRAY);

rectangle(200+j*20,40+i*20,200+j*20+20,40+i*20+20);

floodfill(200+j*20+10,40+i*20+10,DARKGRAY);

}

}

}

}

return ret;

}

/*判断方块是否到容器左边界或左方已有别的方块,有则返回1,否则返回0

传递参数为当前的的block结构实例变量, */

int check_lborder(struct block cblock)

{int i0,j0;

j0=(cblock.x-200)/20;

i0=(cblock.y-40)/20;

if(cblock.x<=200) return 1;/*已经到达容器左边界*/

switch(cblock.type)

{case('I'):if(grid[i0][j0-1]) return 1; break;/*左边已有其他静止的方格*/

case('O'):if(grid[i0][j0-1]) return 1; break;

case('L'): switch(cblock.shape)

{case(1):if(grid[i0][j0-1]||grid[i0+1][j0-1]||grid[i0+2][j0-1])

return 1; break;

case(2):if(grid[i0][j0-1]||grid[i0+1][j0-1])

return 1; break;

case(3):if(grid[i0][j0-1]||grid[i0+1][j0]||grid[i0+2][j0])

return 1; break;

case(4): if(grid[i0][j0-1]||grid[i0+1][j0-1])

return 1;break;

} break;

case('J'):switch(cblock.shape)

{case(1):if(grid[i0][j0]||grid[i0+1][j0]||grid[i0+2][j0-1])

return 1; break;

case(2):if(grid[i0][j0-1]||grid[i0-1][j0-1])

return 1; break;

case(3):if(grid[i0][j0-1]||grid[i0+1][j0-1]||grid[i0+2][j0-1])

return 1; break;

case(4): if(grid[i0][j0-1]||grid[i0+1][j0+1])

return 1; break;

} break;

case('T'):break;

case('Z'):break;

case('N'):break;

}

return 0;

}

/*判断方块是否到容器右边界或右方已有别的方块,有则返回1,否则返回0

传递参数为当前的的block结构实例变量, */

int check_rborder(struct block cblock)

{int i0,j0;

j0=(cblock.x-200)/20;/*把方块的左上方的坐标x,y换算成相应数组grid[i][j]的下标i0,j0*/

i0=(cblock.y-40)/20;

switch(cblock.type)

{case('I'):if(cblock.shape==1)

{if(cblock.x+80>=400||grid[i0][j0+4]) return 1;}/*已经到达容器右边界或左边已有方块*/

else {if(cblock.x+20>=400||grid[i0][j0+1])return 1;}

break;

case('O'): if(cblock.x+40>=400||grid[i0][j0+2]||grid[i0+1][j0+2])

return 1; break;

case('T'): switch(cblock.shape)

{case(1): if(cblock.x+60>=400||grid[i0][j0+3]||grid[i0+1][j0+2])

return 1;break;

case(3): if(cblock.x+60>=400||grid[i0+1][j0+3]||grid[i0][j0+2])

return 1;break;

case(2):if(cblock.x+40>=400||grid[i0][j0+2]||grid[i0+1][j0+2]||grid[i0+2][j0+2])

return 1;break;

case(4):if(cblock.x+40>=400||grid[i0][j0+1]||grid[i0+2][j0+1]||grid[i0+1][j0+2])

return 1;break;

}

break;

case('L'):switch(cblock.shape)

{case(1): if(cblock.x+40>=400||grid[i0+2][j0+2]||grid[i0][j0+1]||grid[i0+1][j0+1])

return 1;break;

case(2): if(cblock.x+60>=400||grid[i0][j0+3]||grid[i0+1][j0+3])

return 1;break;

case(3): if(cblock.x+40>=400||grid[i0][j0+2]||grid[i0+1][j0+2]||grid[i0+2][j0+2])

return 1;break;

case(4): if(cblock.x+60>=400||grid[i0][j0+3]||grid[i0+1][j0+3])

return 1;break;

} break;

case('J'):switch(cblock.shape)

{case(1): if(cblock.x+40>=400||grid[i0][j0+2]||grid[i0+1][j0+2]||grid[i0+2][j0+2])

return 1;break;

case(2):if(cblock.x+60>=400||grid[i0][j0+1]||grid[i0+1][j0+3])

return 1;break;

case(3): if(cblock.x+40>=400||grid[i0][j0+2]||grid[i0+1][j0+1]||grid[i0+2][j0+1])

return 1;break;

case(4): if(cblock.x+60>=400||grid[i0][j0+3]||grid[i0+1][j0+3])

return 1;break;

} break;

case('Z'): switch(cblock.shape)

{case(1): if(cblock.x+60>=400||grid[i0][j0+2]||grid[i0+1][j0+3])

return 1;break;

case(2):if(cblock.x+40>=400||grid[i0][j0+2]||grid[i0+1][j0+2]||grid[i0+2][j0+1])

return 1;break;

}break;

case('N'): switch(cblock.shape)

{case(1): if(cblock.x+60>=400||grid[i0][j0+3]||grid[i0+1][j0+2])

return 1;break;

case(2):if(cblock.x+40>=400||grid[i0][j0+1]||grid[i0+1][j0+2]||grid[i0+2][j0+2])

return 1;break;

} break;

}

return 0;

}

/*旋转变换函数,本游戏的核心程序之一,

传递参数为当前的的block结构实例变量,

判断当前位置是否能变换后 ,若能

返回变换后的block实例变量,否则

返回就原来传进来的block实例变量 */

struct block change(struct block cblock)

{int i,j,i0,j0;

j0=(cblock.x-200)/20;/*把方块的左上方的坐标x,y换算成相应数组grid[i][j]的下标i0,j0*/

i0=(cblock.y-40)/20;

switch(cblock.type)

{case('I'):switch(cblock.shape)

{ case(1):if (grid[i0+2][j0+1]||grid[i0+3][j0+1])

return cblock;

clear_block(cblock); cblock.x+=20; cblock.shape++;break;

case(2):if (grid[i0][j0-1]||grid[i0][j0+1] || grid[i0][j0+2]||cblock.x>=360||cblock.x<=200)

return cblock;/*如果变换后的格子上已经有其他方块,

或变换后方块超出则不变换*/

clear_block(cblock); cblock.x-=20;/*否则清楚原来的方块,计算出变换新的坐标*/

cblock.shape--;/*同一类型的方块进入下一个形状*/

break;

}

break;

case('T'):switch(cblock.shape)

{case(1):if(grid[i0-1][j0+1]) return cblock;

clear_block(cblock);cblock.y-=20;

cblock.shape++; break;

case(2):if(cblock.x>=360||grid[i0+1][j0+2]) return cblock;

clear_block(cblock);cblock.shape++;break;

case(3):if(grid[i0-1][j0+1]||grid[i0][j0+2])

return cblock;

clear_block(cblock);cblock.x+=20;cblock.y-=20;

cblock.shape++;break;

case(4):if(cblock.x<=200||grid[i0+1][j0-1])

return cblock;

clear_block(cblock);cblock.y+=20;cblock.x-=20;

cblock.shape=1; break;

} break;

case('L'):switch(cblock.shape)

{case(1):if(grid[i0+2][j0-1]||grid[i0+1][j0+1]||cblock.x<=200)

return cblock;

clear_block(cblock);cblock.y+=20; cblock.x-=20;

cblock.shape++; break;

case(2): if(grid[i0-1][j0]||grid[i0-1][j0+1]||grid[i0+1][j0+1])

return cblock;

clear_block(cblock);cblock.y-=20;

cblock.shape++;break;

case(3): if(grid[i0+2][j0-1]||grid[i0+2][j0]||cblock.x<=200)

return cblock;

clear_block(cblock);cblock.y+=20;cblock.x-=20;

cblock.shape++;break;

case(4): if(grid[i0][j0+1]||grid[i0-1][j0+1])

return cblock;

clear_block(cblock);cblock.y-=20;cblock.x+=20;

cblock.shape=1; break;

}

break;

case('J'): switch(cblock.shape)

{case(1):if(grid[i0+1][j0]||grid[i0+2][j0+2]||cblock.x>=360)

return cblock;

clear_block(cblock);cblock.y+=20;

cblock.shape++; break;

case(2): if(grid[i0-1][j0+1]||grid[i0-1][j0])

return cblock;

clear_block(cblock);cblock.y-=20;

cblock.shape++;break;

case(3):if(grid[i0+1][j0+1]||grid[i0+2][j0+1]||grid[i0+1][j0-1])

return cblock;

clear_block(cblock);cblock.y+=20;cblock.x-=20;

if(grid[i0-1][j0]||grid[i0-1][j0+1]||cblock.x<=200)

return cblock;

cblock.shape++;break;

case(4): if(grid[i0-1][j0-2]||grid[i0+1][j0+1])

return cblock;

clear_block(cblock);cblock.y-=20;cblock.x+=20;

cblock.shape=1; break;

}

break;

case('Z'):switch(cblock.shape)

{ case(1):if(grid[i0-1][j0+1]||grid[i0+1][j0])

return cblock;

clear_block(cblock);cblock.y-=20;

cblock.shape++;break;

case(2): if(grid[i0+2][j0+1]||grid[i0+2][j0+2])

return cblock;

clear_block(cblock);cblock.y+=20;

cblock.shape--;break;

}break;

case('N'):switch(cblock.shape)

{ case(1):if(grid[i0][j0]||grid[i0-1][j0])

return cblock;

clear_block(cblock); cblock.y-=20;

cblock.shape++;break;

case(2):if(grid[i0+2][j0]||grid[i0+1][j0+2]||cblock.x>=360)

return cblock;

clear_block(cblock); cblock.y+=20; cblock.shape--;break;

}break;

}

return cblock;/*返回变换后的方块*/

}

/*画方块函数,传递参数为当前block实例变量*/

void drawblock(struct block drblock)

{int i0,j0,i,j;

j0=(drblock.x-200)/20;/*把方块的左上方的坐标x,y换算成相应数组grid[i][j]的下标i0,j0*/

i0=(drblock.y-40)/20;

setfillstyle(9,drblock.color);

setcolor(drblock.color);

switch(drblock.type)

{case('I'):if(drblock.shape==1)

{ for(j=0;j<4;j++)

{ rectangle(drblock.x+j*20,drblock.y,drblock.x+j*20+20,drblock.y+20);/*画方块格子*/

floodfill(drblock.x+j*20+10,drblock.y+10,drblock.color);/*蔓延填充方块*/

grid[i0][j0+j]+=I_SHAPE1[0][j];/*将定义的形状与grid数组相加*/

} /*这样有格子的相应grid数组元素就加1*/

}

if(drblock.shape==2)

{ for(i=0;i<4;i++)

{ rectangle(drblock.x,drblock.y+20*i,drblock.x+20,drblock.y+20*i+20);

floodfill(drblock.x+10,drblock.y+20*i+10,drblock.color);

grid[i0+i][j0]+=I_SHAPE2[i][0];

}

}break;

case('O'):for(i=0;i<2;i++)

for(j=0;j<2;j++)

{rectangle(drblock.x+i*20,drblock.y+j*20,drblock.x+i*20+20,drblock.y+j*20+20);

floodfill(drblock.x+i*20+10,drblock.y+j*20+10,drblock.color);

grid[i0+i][j0+j]+=O_SHAPE[i][j];

}

break;

case('T'): switch(drblock.shape)

{case(1):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=T_SHAPE1[i][j] ;

if(T_SHAPE1[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(2):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=T_SHAPE2[i][j] ;

if(T_SHAPE2[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(3):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=T_SHAPE3[i][j] ;

if(T_SHAPE3[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

}break ;

case(4): for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=T_SHAPE4[i][j] ;

if(T_SHAPE4[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

} break;

case('L'): switch(drblock.shape)

{case(1):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=L_SHAPE1[i][j] ;

if(L_SHAPE1[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(2):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=L_SHAPE2[i][j] ;

if(L_SHAPE2[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(3):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=L_SHAPE3[i][j] ;

if(L_SHAPE3[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

}break ;

case(4): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=L_SHAPE4[i][j] ;

if(L_SHAPE4[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

}

break;

case('J'): switch(drblock.shape)

{case(1):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=J_SHAPE1[i][j] ;

if(J_SHAPE1[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(2):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=J_SHAPE2[i][j] ;

if(J_SHAPE2[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(3):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=J_SHAPE3[i][j] ;

if(J_SHAPE3[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break;

case(4): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=J_SHAPE4[i][j] ;

if(J_SHAPE4[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

} break;

case('Z'):switch(drblock.shape)

{ case(1):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=Z_SHAPE1[i][j] ;

if(Z_SHAPE1[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(2):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=Z_SHAPE2[i][j] ;

if(Z_SHAPE2[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

} break;

case('N'):switch(drblock.shape)

{ case(1):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{grid[i0+i][j0+j]+=N_SHAPE1[i][j] ;

if(N_SHAPE1[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

case(2):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{grid[i0+i][j0+j]+=N_SHAPE2[i][j] ;

if(N_SHAPE2[i][j]==1)

{rectangle(drblock.x+j*20,drblock.y+i*20,drblock.x+j*20+20,drblock.y+i*20+20);

floodfill(drblock.x+j*20+10,drblock.y+i*20+10,drblock.color);

}

} break ;

} break;

}

}

/*清楚原来的方块,用原来容器的方格填充

传递参数为当前的block实例变量*/

void clear_block(struct block cblock)

{ int i,j,i0,j0;

j0=(cblock.x-200)/20;/*把方块的左上方的坐标x,y换算成相应数组grid[i][j]的下标i0,j0*/

i0=(cblock.y-40)/20;

setfillstyle(1,LIGHTBLUE);/*设置填充色为原容器格子的颜色*/

setcolor(WHITE);/*恢复原来的前景色*/

switch(cblock.type)

{case('I'):if(cblock.shape==1)

{ for(j=0;j<4;j++)

{rectangle(cblock.x+j*20,cblock.y,cblock.x+j*20+20,cblock.y+20);/*画原容器的格子*/

floodfill(cblock.x+j*20+10,cblock.y+10,WHITE);/*蔓延填充*/

grid[i0][j0+j]=0;/*清零,即该格已经没有方块*/

}

}

if(cblock.shape==2)

{ for(i=0;i<4;i++)

{ rectangle(cblock.x,cblock.y+20*i,cblock.x+20,cblock.y+20*i+20);

floodfill(cblock.x+10,cblock.y+20*i+10,WHITE);

grid[i0+i][j0]=0;

}

}break;

case('O'):for(i=0;i<2;i++)

for(j=0;j<2;j++)

{rectangle(cblock.x+i*20,cblock.y+j*20,cblock.x+i*20+20,cblock.y+j*20+20);

floodfill(cblock.x+i*20+10,cblock.y+j*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

break;

case('T'): switch(cblock.shape)

{case(1):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{ if(T_SHAPE1[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0 ; }

} break ;

case(2):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{ if(T_SHAPE2[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0 ;

}

} break ;

case(3):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{ if(T_SHAPE3[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

}break ;

case(4): for(i=0;i<3;i++)

for(j=0;j<2;j++)

{ if(T_SHAPE4[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0; }

} break ;

} break;

case('L'): switch(cblock.shape)

{case(1):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{if(L_SHAPE1[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

case(2):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{if(L_SHAPE2[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

case(3):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{if(L_SHAPE3[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

}break ;

case(4): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{if(L_SHAPE4[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

}

break;

case('J'): switch(cblock.shape)

{case(1):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{ if(J_SHAPE1[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

case(2):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{ if(J_SHAPE2[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

case(3):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{if(J_SHAPE3[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break;

case(4): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{ if(J_SHAPE4[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

} break;

case('Z'):switch(cblock.shape)

{ case(1):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{ if(Z_SHAPE1[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

case(2):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{if(Z_SHAPE2[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

} break;

case('N'):switch(cblock.shape)

{ case(1):for(i=0;i<2;i++)

for(j=0;j<3;j++)

{ if(N_SHAPE1[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

case(2):for(i=0;i<3;i++)

for(j=0;j<2;j++)

{ if(N_SHAPE2[i][j]==1)

{rectangle(cblock.x+j*20,cblock.y+i*20,cblock.x+j*20+20,cblock.y+i*20+20);

floodfill(cblock.x+j*20+10,cblock.y+i*20+10,WHITE);

grid[i0+i][j0+j]=0;

}

} break ;

} break;

}

}

/*判断方块是否到容器顶,也是游戏结束标志,如到顶则返回1,否则返回0*/

int check_top(struct block tblock)

{ if(tblock.y==40) return 1;

else return 0;

}

/*判断方块是否到容器底或下方已有别的方块,有则返回1,否则返回0*/

int check_bottom(struct block nblock)

{ int j,i0,j0;

j0=(nblock.x-200)/20;

i0=(nblock.y-40)/20;

switch(nblock.type)

{case('I'): if(nblock.shape==1)

{if(nblock.y==420) return 1;/*已经到达容器底部*/

for(j=0;j<4;j++)

if(grid[i0+1][j0+j]) return 1;/*I型方块下面一格已有静止方块*/

}

if(nblock.shape==2)

{if(nblock.y==360) return 1;

if(grid[i0+4][j0]) return 1;

}

break;

case('O'): if(nblock.y==400) return 1;

for(j=0;j<2;j++)

if (grid[i0+2][j0+j]) return 1;

break;

case('T'):switch(nblock.shape)

{case(1):if(nblock.y==400) return 1;

if(grid[i0+2][j0+1]||grid[i0+1][j0]||grid[i0+1][j0+2])

return 1;

break;

case(2):if(nblock.y==380) return 1;

if(grid[i0+3][j0+1]||grid[i0+2][j0]) return 1; break;

case(3):if(nblock.y==400) return 1;

for(j=0;j<3;j++)

if(grid[i0+2][j0+j]) return 1; break;

case(4):if(nblock.y==380) return 1;

if(grid[i0+3][j0]||grid[i0+2][j0+1]) return 1;break;

} break;

case('L'): switch(nblock.shape)

{case(1):if (nblock.y>=380) return 1;

if (grid[i0+3][j0]||grid[i0+3][j0+1])

return 1; break;

case(2):if(nblock.y>=400) return 1;

if(grid[i0+2][j0]||grid[i0+1][j0+1]||grid[i0+1][j0+2])

return 1; break;

case(3):if (nblock.y>=380) return 1;

if (grid[i0+3][j0+1]||grid[i0+1][j0])

return 1; break;

case(4):if (nblock.y>=400) return 1;

for(j=0;j<3;j++)

if(grid[i0+2][j0+j])

return 1; break;

}

break;

case('J'):switch(nblock.shape)

{case(1):if (nblock.y>=380) return 1;

if (grid[i0+3][j0]||grid[i0+3][j0+1])

return 1; break;

case(2):if (nblock.y>=400) return 1;

for(j=0;j<3;j++)

if(grid[i0+2][j0+j])

return 1; break;

case(3):if (nblock.y>=380) return 1;

if (grid[i0+3][j0]||grid[i0+1][j0+1])

return 1; break;

case(4):if (nblock.y>=400) return 1;

if (grid[i0+2][j0+2]||grid[i0+1][j0]||grid[i0+1][j0+1])

return 1; break;

} break;

case('Z'):if (nblock.shape==1)

{ if(nblock.y==400) return 1;

if(grid[i0+1][j0]||grid[i0+2][j0+1]||grid[i0+2][j0+2])

return 1; }

if (nblock.shape==2)

{ if(nblock.y==380) return 1;

if(grid[i0+3][j0]||grid[i0+2][j0+1])

return 1; } break;

case('N'):if(nblock.shape==1)

{ if(nblock.y==400) return 1;

if(grid[i0+1][j0+2]||grid[i0+2][j0+1]||grid[i0+2][j0])

return 1;

}

if(nblock.shape==2)

{ if(nblock.y==380) return 1;

if(grid[i0+2][j0]||grid[i0+3][j0+1])

return 1;

}

break;

}

return 0;

}

/*在屏幕右上方显示下一个方块的信息*/

void show_next(struct block nextblock)

{int i,j,g[4][4];

setfillstyle(1,LIGHTBLUE);

setcolor(WHITE);

for(i=0;i<4;i++)

for(j=0;j<4;j++)

{ rectangle(480+i*20,40+j*20,480+i*20+20,40+j*20+20);

floodfill( 480+i*20+10,40+20*j+10,WHITE);

}

setfillstyle(9,nextblock.color);

setcolor(nextblock.color);

switch (nextblock.type)

{case('I'): for(j=0;j<4;j++)

{rectangle(480+j*20,60,480+j*20+20,60+20);

floodfill(480+j*20+10,60+10,nextblock.color);

}

break;

case('O'): for(i=0;i<2;i++)

for(j=0;j<2;j++)

{ rectangle(500+20*i,60+20*j,500+20*i+20,60+20*j+20);

floodfill(500+20*i+10,60+20*j+10,nextblock.color);

}break ;

case('T'): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{g[i][j]=T_SHAPE1[i][j];

if(g[i][j]==1)

{ rectangle(480+j*20,60+i*20,480+j*20+20,60+i*20+20);

floodfill(480+j*20+10,60+i*20+10,nextblock.color);

}

}

break;

case('L'): for(i=0;i<3;i++)

for(j=0;j<2;j++)

{g[i][j]=L_SHAPE1[i][j];

if(g[i][j]==1)

{ rectangle(500+j*20,40+i*20,500+j*20+20,40+i*20+20);

floodfill(500+j*20+10,40+i*20+10,nextblock.color);

}

}break;

case('J') : for(i=0;i<3;i++)

for(j=0;j<2;j++)

{g[i][j]=J_SHAPE1[i][j];

if(g[i][j]==1)

{ rectangle(500+j*20,40+i*20,500+j*20+20,40+i*20+20);

floodfill(500+j*20+10,40+i*20+10,nextblock.color);

}

}break;

case('Z'): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{g[i][j]=Z_SHAPE1[i][j];

if(g[i][j]==1)

{ rectangle(500+j*20,60+i*20,500+j*20+20,60+i*20+20);

floodfill(500+j*20+10,60+i*20+10,nextblock.color);

}

}break;

case('N'): for(i=0;i<2;i++)

for(j=0;j<3;j++)

{g[i][j]=N_SHAPE1[i][j];

if(g[i][j]==1)

{ rectangle(500+j*20,60+i*20,500+j*20+20,60+i*20+20);

floodfill(500+j*20+10,60+i*20+10,nextblock.color);

}

}break;

}

}

/*test the grid array's value*/

void test()

{int i,j;

gotoxy(1,1);

for (i=0;i<20;i++)

{for (j=0;j<10;j++)

printf ("%2d",grid[i][j]);

printf ("\n");

}

}

/*initial the graphic driver*/

int ini_graph(void)

{

/* request auto detection */

int gdriver = DETECT, gmode, errorcode;

int left, top, right, bottom;

/* initialize graphics and local variables */

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* terminate with an error code */

}

return 0;

}

/*show the game information on right*/

void help(int xs,int ys){

setcolor(15);

rectangle(xs-3,ys-3,xs+200,ys+150);

line (xs-3,ys+26,xs+200,ys+26);

line (xs-3,ys+72,xs+200,ys+72);

line(xs+39,ys+26,xs+39,ys+72);

setcolor(12);

outtextxy(xs+60,ys+8,"Welcome!!");

setcolor(14);

outtextxy(xs,ys+45,"HELP:");

outtextxy(xs+55,ys+30,"->-Left ;<--Right");

outtextxy(xs+55,ys+45,"^-Change");

outtextxy(xs+55,ys+60,"ESC-Exit;R-Restar");

outtextxy(xs,ys+75,"Russia Diamonds ");

outtextxy(xs,ys+90,"CopyRight By FANZ.com");

outtextxy(xs,ys+105,"Date:15/12/2001");

outtextxy(xs,ys+120,"E-mail:Fanz@263.net");

}

/*show score and level*/

void showscore(){

int cur[8];

cur[0]=420;

cur[1]=360;

cur[2]=cur[0] ;

cur[3]=cur[1]+50;

cur[4]=cur[2]+203;

cur[5]=cur[3];

cur[6]=cur[4];

cur[7]=cur[5]-50;

setcolor(LIGHTBLUE);

setfillstyle(7,LIGHTBLUE);

fillpoly(4,cur);

setcolor(13);

outtextxy(480,380,"Score:");

outtextxy(480,390,"Level:");

}

/*显示并刷新分数和关数*/

void printscore()

{ char sscore[6];

char slevel[2];

settextstyle(0,0,0);

level=score/100+1;

if (level>=5) level=1;

interval=550-level*50;

showscore();

setcolor(RED);

sprintf(sscore,"%d",score);

sprintf(slevel,"%d",level);

outtextxy (540,390,slevel);

outtextxy (540,380,sscore);

}

/*在屏幕右上方显示下一个方块的信息*/

void restart()

{ int key;

delay(1000);

setfillstyle(1,10);

settextstyle(0,0,6);

setcolor(3);

outtextxy(102,152,"GAME OVER");

setcolor(3);

outtextxy(99,149,"GAME OVER");

setcolor(10);

outtextxy(96,146,"GAME OVER");

delay(1000);

setcolor(0);

settextstyle(0,0,2);

outtextxy(222,242,"R__Again!");

outtextxy(232,282,"ESC__Exit!");

setcolor(10);

outtextxy(220,240,"R__Again!");

outtextxy(230,280,"ESC__Exit!");

while(1)

{ key=bioskey(0);

if (key==RESTART)

{initial();return;}

if(key==ESC)

{closegraph();exit(1);}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有