俄罗斯方块的左右移动和向下移动

首先贴上左右移动的代码

void horzMoveTetris(TetrisManager *manager, TetrisControl *control)
{
    char x = manager->x;  // 记录原列位置

    removeTetris(manager);  // 移走当前方块
    control->direction == 0 ? (--manager->x) : (++manager->x);  // 左/右移动

    if (checkCollision(manager))  // 检测到碰撞
    {
        manager->x = x;  // 恢复为原列位置
        insertTetris(manager);  // 放入当前方块。由于位置没改变,不需要设置颜色
    }
    else
    {
        insertTetris(manager);  // 放入当前方块
        printCurrentTetris(manager, control);  // 显示当前方块
    }
}

下面是向下移动的代码

void moveDownTetris(TetrisManager *manager, TetrisControl *control)
{
    char y = manager->y;  // 记录原行位置

    removeTetris(manager);  // 移走当前方块
    ++manager->y;  // 向下移动

    if (checkCollision(manager))  // 检测到碰撞
    {
        manager->y = y;  // 恢复为原行位置
        insertTetris(manager);  // 放入当前方块。由于位置没改变,不需要设置颜色
        if (checkErasing(manager, control))  // 检测到消行
        {
            printTetrisPool(manager, control);  // 显示游戏池
        }
    }
    else
    {
        insertTetris(manager);  // 放入当前方块
        printCurrentTetris(manager, control);  // 显示当前方块
    }
}

第一,这两个功能的关键点都是需要对原先形状进行保存,然后再对其恢复。

第二,就是左右坐标上下坐标的偏移。

以下是俄罗斯方块游戏工程的连接:

https://download.csdn.net/download/gaodes/10961687

查看文章 C语言写的俄罗斯方块 #include <stdio.h> #include <graphics.h> #include <stdlib.h> #define UP 0x4800 #define DOWN 0x5000 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define ESC 0x011b #define SPACE 0x3920 int a[7][7],b[4][4]; initialize() { int driver,gmode; driver=VGA; gmode=VGAHI; initgraph(&driver,&gmode,""); } fangkuai(int x,int y) { int p[8]; x=x*20+10; y=y*20+10; p[0]=x;p[1]=y; p[2]=x+20;p[3]=y; p[4]=x+20;p[5]=y+20; p[6]=x;p[7]=y+20; setcolor(GREEN); setfillstyle(SOLID_FILL,DARKGRAY); fillpoly(4,p); drawpoly(4,p); } xiantiao(int wid,int deg,int x,int y,int z) { int i; setcolor(RED); if(deg==0) { for(i=0;i<wid;i++) line(x+i,y,x+i,z); } else if(deg==90) { for(i=1;i<=wid;i++) line(x,y+i,z,y+i); } } drawall(int x,int y) { int c,i,j,xmin,ymin; for(i=0;i<7;i++) for(j=0;j<7;j++) a[ i][j]=0; c=0; i=j=3; xmin=ymin=3; while(c<4) { if(a[ i][j]==0) { a[ i][j]=1; if(i<xmin) xmin=i; if(y<ymin) ymin=j; c++; } switch(random(3)) { case 0:i++;break; case 1:j++;break; case 2:i--;break; case 3:j--;break; } } for(i=0;i<4;i++) for(j=0;j<4;j++) { b[ i][j]=a[i+xmin][j+ymin]; if(b[ i][j]==1) fangkuai(x+i,y+j); } } clr(int x,int y,int xx,int yy) { setfillstyle(SOLID_FILL,LIGHTBLUE); bar(x*20+10,y*20+10,xx*20+10,yy*20+10); } void main() { int i,j,key,top,up,count,count1,xm,ym,cd,score,c[12][21],d[4][4]; char s[5]; score=0; for(i=0;i<12;i++) for(j=0;j<21;j++) c[ i][j]=0; for(i=0;i<21;i++) { c[0][ i]=1; c[11][ i]=1; } for(i=1;i<11;i++) c[ i][20]=1; initialize(); setbkcolor(LIGHTBLUE); setcolor(RED); randomize(); xiantiao(5,0,5+20,10,410); xiantiao(5,0,211+20,10,410); xiantiao(5,90,5+20,410,215+20); moveto(150,450); outtext("<Press Key:MOVE LEFT,REGHT::DOWN DOWN:: CHANGE SPACE>"); while(1) { key=bioskey(0); if(ESC==key) break; top=0; up=4; xm=ym=4; clr(15,10,19,14); drawall(15,10); bar(250,250,290,290); for(i=0;i<4;i++) for(j=0;j<4;j++) { itoa(b[ i][j],s,10); moveto(250+i*10,250+j*10); outtext(s); } for(i=0;i<4;i++) { count=0; for(j=0;j<4;j++) { if(b[ i][j]==0) count=count+1; } if(count==4) xm--; } for(j=0;j<4;j++) { count=0; for(i=0;i<4;i++) { if(b[ i][j]==0) count=count+1; } if(count==4) ym--; } for(i=0;i<4;i++) for(j=0;j<4;j++) if(b[ i][j]==1) fangkuai(up+i,top+j); while(1) { for(i=0;i<4;i++) for(j=0;j<4;j++) if(b[ i][j]==1&&c[up+i][top+j]==1) break; bar(400,100,520,310); for(i=0;i<12;i++) for(j=0;j<21;j++) { moveto(400+10*i,100+10*j); itoa(c[ i][j],s,10); outtext(s); } key=bioskey(0); if(ESC==key) break; if(LEFT==key) { count=0; for(j=0;j<ym;j++) { for(i=0;i<xm;i++) { if(b[ i][j]==1) break; } if(c[up+i-1][top+j]==1) break; else count=count+1; } if(count==ym) { clr(up-1,top,up+xm,top+ym); for(i=up;i<up+xm;i++) for(j=top;j<top+ym;j++) if(b[i-up][j-top]==1) { c[ i][j]=0; c[i-1][j]=1; } for(i=up-1;i<up+xm;i++) for(j=top;j<top+ym;j++) { if(c[ i][j]==1) fangkuai(i,j); } up--; } } if(RIGHT==key) { count=0; for(j=0;j<ym;j++) { for(i=xm-1;i>=0;i--) { if(b[ i][j]==1) break; } if(c[up+i+1][top+j]==1) break; else count=count+1; } if(count==ym) { clr(up,top,up+xm+1,top+ym); for(i=up+xm-1;i>=up;i--) for(j=top+ym-1;j>=top;j--) if(b[i-up][j-top]==1) { c[ i][j]=0; c[i+1][j]=1; } for(i=up;i<=up+xm;i++) for(j=top;j<top+ym;j++) if(c[ i][j]==1) fangkuai(i,j); up++; } } if(SPACE==key) { clr(up,top,xm+up,ym+top); for(i=up;i<xm+up;i++) for(j=top;j<top+ym;j++) if(b[i-up][j-top]==1) c[ i][j]=0; for(i=0;i<4;i++) for(j=0;j<4;j++) d[ i][j]=b[ i][j]; for(i=0;i<4;i++) for(j=0;j<4;j++) b[ i][j]=0; for(i=0;i<4;i++) for(j=0;j<4;j++) b[3-j][ i]=d[ i][j]; for(i=0;i<4;i++) for(j=0;j<4;j++) d[ i][j]=b[ i][j]; for(i=0;i<4;i++) for(j=0;j<4;j++) b[ i][j]=0; xm=ym=0; count=count1=4; for(i=0;i<4;i++) for(j=0;j<4;j++) if(d[ i][j]==1) { if(count>i) count=i; if(count1>j) count1=j; if(ym<i) ym=i; if(xm<j) xm=j; } for(i=count;i<=ym;i++) for(j=count1;j<=xm;j++) if(d[ i][j]==1) b[i-count][j-count1]=1; xm=ym=0; for(i=0;i<4;i++) for(j=0;j<4;j++) if(b[ i][j]==1) { if(xm<i) xm=i; if(ym<j) ym=j; } xm++; ym++; for(i=0;i<4;i++) for(j=0;j<4;j++) if(b[ i][j]==1) c[up+i][top+j]=1; for(i=top;i<top+ym;i++) for(j=up;j<up+xm;j++) if(c[j][ i]==1) fangkuai(j,i); } if(DOWN==key) { count=0; for(i=0;i<xm;i++) { for(j=ym;j>=0;j--) { if(b[ i][j]==1) break; } if(c[up+i][top+j+1]==1) break; else count=count+1; } if(count==xm) { clr(up,top,xm+up,top+ym+1); for(j=top+ym-1;j>=top;j--) for(i=up;i<up+xm;i++) if(b[i-up][j-top]==1) { c[ i][j]=0; c[ i][j+1]=1; } for(i=up;i<up+xm;i++) for(j=top;j<=top+ym;j++) { if(c[ i][j]==1) fangkuai(i,j); } top++; } else break; } for(i=0;i<20;i++) { count=0; for(j=1;j<11;j++) { count=count+c[j][ i]; if(count==10) { for(count1=i;count1>=0;count1--) for(j=1;j<11;j++) { if(count1==0) c[j][count1]=0; else c[j][count1]=c[j][count1-1]; } score++; bar(300,100,350,110); moveto(300,100); outtext(itoa(score,s,10)); setfillstyle(SOLID_FILL,LIGHTBLUE); bar(1*20+10,0,11*20+10,20*20+10); for(i=0;i<20;i++) for(j=1;j<11;j++) { if(c[j][ i]==1) fangkuai(j,i); } } } } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值