当前位置:首页 > 俄罗斯方块C语言源代码
t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; mask=128;
for(n=0;n<4;n++) {
for(m=0;m<4;m++) /*看最下边四个单元*/ {
if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/ {
if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) )return(false);/*碰到最下边了*/ if((x+BSIZE*n)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最左边了*/ if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/
else if( Table_board[t_boardy+n][t_boardx+m].var) {
return(false); } }
mask=mask/(2);
if(mask==0)mask=128; } }
return(true); } else {
return(false); } } /*
*显示指定的方块 */
void show_box(int x,int y,int box_numb,int color) {
int i,ii,ls_x=x;
if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/ box_numb=MAX_BOX/2;
setfillstyle(SOLID_FILL,color); /********************************* * 移位来判断第哪一位是1
* 方块是每1行用半个字节来表示 * 128d=1000 0000b
*********************************/ for(ii=0;ii<2;ii++) {
int mask=128; for(i=0;i<8;i++) {
if(i%4==0 && i!=0) /*表示转到方块的下一行了*/ {
y+=BSIZE; x=ls_x; }
if((shapes[box_numb].box[ii])&mask) {
bar(x,y,x+BSIZE,y+BSIZE); line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE);
line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); }
x+=BSIZE; mask/=2; }
y+=BSIZE; x=ls_x; } }
void main() {
int GameOver=0; int key,nextbox;
int Currentaction=0;/*标记当前动作状态*/ int gd=VGA,gm=VGAHI,errorcode;
initgraph(&gd,&gm,\errorcode = graphresult(); if (errorcode != grOk) {
printf(\printf(\getch();
exit(1); }
setbkcolor(BgColor); setcolor(FgColor); randomize();
SetTimer(newtimer);
initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*初始化*/
nextbox=MkNextBox(-1);
show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color); show_intro(Sys_x,Curbox_y+320); getch(); while(1) {
/* Currentaction=0; flag_newbox=false; 检测是否有按键*/
if (bioskey(1)){key=bioskey(0); } else { key=0; }
switch(key) {
case VK_LEFT:
if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft))
{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=MoveLeft;} break;
case VK_RIGHT:
if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight))
{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=MoveRight;} break;
case VK_DOWN:
if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))
{EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=MoveDown;}
else flag_newbox=true; break;
case VK_UP:/*旋转方块*/
if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll))
{EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_box_numb].next;
Currentaction=MoveRoll; }
break;
case VK_ESC: GameOver=1; break; default: break; }
if(Currentaction)
{ /*表示当前有动作,移动或转动*/
show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); Currentaction=0; }
/*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox) {
/*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ ErasePreBox(LeftWin_x,Sys_y+200,nextbox); nextbox=MkNextBox(nextbox);
show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color);
if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))/*刚一开始,游戏结束*/ {
show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); GameOver=1; } else {
flag_newbox=false; }
Currentaction=0; }
else /*自由下落*/ {
if (Currentaction==MoveDown || TimerCounter> (20-speed*2)) {
if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) {
EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;
共分享92篇相关文档