一个C语言写的俄罗斯方块的不懂之处请指教

一个C语言写的俄罗斯方块的不懂之处请指教,第1张

我仔细看了一下。

1 首先b的取值已经给出,请看数组g_Blocks的定义部份(前四个元素,后面一个是颜色)。

2 和0x8000做与运算是为了测试最高位是否为1

3 b左移一位的意义在与,b这个值以二进制来看,是否还有某位为1

为什么要以二进制来看呢,是否还是不太明白为什么要这要做?简单说一下,你把每个俄罗斯图形都看成是一个4x4的矩阵,你可以在纸上画个4x4的方块图,从左边第一列,从上往下开始,依次开始编码,如果某个块对应俄罗斯图为实心块,我们编码时为1,否则为0

见下图:

g_Blocks里面定义的四个值,即为该图旋转成四个方向后的编码值。

首先你要下载vc++,初学者可以用vs98安装好后在项目中可以添加如下代码

#include "graphicsh"

#include <conioh>

#include <stdlibh>

int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN,

    LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW};

struct tetris {

    int _pool[16][32], (pool)[32], tmap[8][4][16];

    int x, y, s, st, t;

}gt;

void trsInit() {

    int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},

        {39,305,114,562},{54,561},{99,306},{51,51},{-1}};

    int p, i, j, b;

    for (p = sp[0]; p >= 0; ++p) if ( p == 0 ) p = p[-2];

    gtpool = &gt_pool[4];

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

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

            for (b = 0; b < 16; ++b)

                gttmap[j+1][i][b] = (sp[j][i] & 1)  (j + 1),

                sp[j][i] >>= 1;

    memset(gt_pool, -1, sizeof(gt_pool));

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

        memset(&gtpool[i], 0, sizeof(int[21]));

    return ;

}

int trsCopy(int sp[], int x, int y, int c) {

    int m[] = {0,32,64,96,1,33,65,97,2,34,66,98,3,35,67,99}, i, cx, cy;

    for (i = 0; i < 16; ++i) if (sp[i]) {

        cx = x + (m[i] >> 5), cy = y + (m[i] & 31);

        if (gtpool[cx][cy]) if (c == 2) gtpool[cx][cy] = 0; else return 0;

        if (c==1) gtpool[cx][cy] = sp[i];

    }

    return 1;

}

int trsScene() {

    int x, y = 0;

    gts = random(7) + 1, gtst = gtt = 0;

    gtx = 4, gty = 0;

    for (--gtt ; ; delay(10), --gtt) {

        int k = 0;

        while (kbhit()) {

            k = getch();

            if (k == 27) return 0;

            if (k == 'A' || k == 'a') {

                if (trsCopy(gttmap[gts][gtst], gtx-1, gty, 0)) --gtx;

            } else if (k == 'D' || k == 'd') {

                if (trsCopy(gttmap[gts][gtst], gtx+1, gty, 0)) ++gtx;

            } else if (k == 'W' || k == 'w') {

                if (trsCopy(gttmap[gts][(gtst+1) % 4], gtx, gty, 0))

                    gtst = (gtst+1) % 4;

            }

        }

        if (k == 'S' || k == 's' || gtt < 0) {

            if (trsCopy(gttmap[gts][gtst], gtx, gty+1, 0))++gty,gtt=50;

            else {

                trsCopy(gttmap[gts][gtst], gtx, gty, 1);

                for (--y; y > 0; --y) {

                    for (x = 0; gtpool[x][y] > 0; ++x);

                    if (gtpool[x][y] < 0)

                        for (k = y++; k > 0; --k)

                            for (x = 0; gtpool[x][0] >= 0; ++x)

                                gtpool[x][k] = gtpool[x][k-1];

                }

                return 1;

            }

        }

        trsCopy(gttmap[gts][gtst], gtx, gty, 1);

        for (x = 0; gtpool[x][0] >= 0; ++x) {

            for (y = 1; gtpool[x][y] >= 0; ++y) {

                setfillstyle(1, gcColor[gtpool[x][y]]);

                bar(201 + xgcW, 1 + ygcW, 200 + gcW + xgcW, gcW + ygcW);

            }

        }

        trsCopy(gttmap[gts][gtst], gtx, gty, 2);

    }

}

int main() {

    int g = DETECT, m = 0;

    initgraph(&g, &m, "");

    randomize();

    trsInit();

    while (trsScene());

    return 0;

}

#include<stdioh>

#include<stringh>

#include<biosh>

#include<stdlibh>

#include<timeh>

#include<dosh>

int dx[4],dy[4]; /定义全局变量/

int zt1,zt2,str[15][19];

/str[15][19]是把整个屏幕分为1519个方格,每一个方格用一个数组单元表示,

如果=15,则这个方格已被占用,=0,则还是空的/

int cx[8][5][4],cy[8][5][4]; /该变量表示每种状态下,旋转时坐标的改变/

int x,y,j,ji,c;

int maxzt[8]={0,2,1,4,2,2,4,4}; /各个种类的方块分别有几种状态/

cir() /旋转的处理函数/

{ dx[0]=dx[0]+cx[zt1][zt2][0];dy[0]=dy[0]+cy[zt1][zt2][0];

dx[2]=dx[2]+cx[zt1][zt2][2];dy[2]=dy[2]+cy[zt1][zt2][2];

dx[3]=dx[3]+cx[zt1][zt2][3];dy[3]=dy[3]+cy[zt1][zt2][3];

}

jiance() /检测旋转或移动能否进行的函数,能则j=1,不能j=0/

{ j=1;

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

{ x=dx[ji];y=dy[ji];

if(str[x][y]!=' ') j=0;

}

c=bioskey(1);

if(c!=0) c=bioskey(0);

}

main()

{ int dotx[4],doty[4],score; /dotx[]doty[]表示一个方块个点的坐标/

int ddx,ddy;

int rzt1,rzt2,i,u,t=1;

int a[5],b[11],o,p,an,bn;

int rotx[4],roty[4],spd=0;

begin: system("cls"); /游戏初始化阶段/

printf("londing");

for(i=0;i<12;i++) /变量初始阶段/

{ for(u=0;u<19;u++)

str[i][u]=' ';

}

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

{ str[i][0]='-';str[i][18]='-'; }

for(u=0;u<19;u++)

{ str[0][u]='|';str[11][u]='|'; }

cx[1][1][0]=1;cx[1][1][2]=-1;cx[1][1][3]=-2; /对旋转变量进行赋值/

cy[1][1][0]=1;cy[1][1][2]=-1;cy[1][1][3]=-2;

cx[1][2][0]=-1;cx[1][2][2]=1;cx[1][2][3]=2;

cy[1][2][0]=-1;cy[1][2][2]=1;cy[1][2][3]=2;

cx[2][1][0]=0;cx[2][1][2]=0;cx[2][1][3]=0;

cy[2][1][0]=0;cy[2][1][2]=0;cy[2][1][3]=0;

cx[3][1][0]=1;cx[3][1][2]=-1;cx[3][1][3]=1;

cy[3][1][0]=-1;cy[3][1][2]=1;cy[3][1][3]=1;

cx[3][2][0]=1;cx[3][2][2]=-1;cx[3][2][3]=-1;

cy[3][2][0]=1;cy[3][2][2]=-1;cy[3][2][3]=1;

cx[3][3][0]=-1;cx[3][3][2]=1;cx[3][3][3]=-1;

cy[3][3][0]=1;cy[3][3][2]=-1;cy[3][3][3]=-1;

cx[3][4][0]=-1;cx[3][4][2]=1;cx[3][4][3]=1;

cy[3][4][0]=-1;cy[3][4][2]=1;cy[3][4][3]=-1;

cx[4][1][0]=-1;cx[4][1][2]=1;cx[4][1][3]=2;

cy[4][1][0]=1;cy[4][1][2]=1;cy[4][1][3]=0;

cx[4][2][0]=1;cx[4][2][2]=-1;cx[4][2][3]=-2;

cy[4][2][0]=-1;cy[4][2][2]=-1;cy[4][2][3]=0;

cx[5][1][0]=1;cx[5][1][2]=1;cx[5][1][3]=0;

cy[5][1][0]=-1;cy[5][1][2]=1;cy[5][1][3]=2;

cx[5][2][0]=-1;cx[5][2][2]=-1;cx[5][2][3]=0;

cy[5][2][0]=1;cy[5][2][2]=-1;cy[5][2][3]=-2;

cx[6][1][0]=1;cx[6][1][2]=-1;cx[6][1][3]=0;

cy[6][1][0]=-1;cy[6][1][2]=1;cy[6][1][3]=2;

cx[6][2][0]=1;cx[6][2][2]=-1;cx[6][2][3]=-2;

cy[6][2][0]=1;cy[6][2][2]=-1;cy[6][2][3]=0;

cx[6][3][0]=-1;cx[6][3][2]=1;cx[6][3][3]=0;

cy[6][3][0]=1;cy[6][3][2]=-1;cy[6][3][3]=-2;

cx[6][4][0]=-1;cx[6][4][2]=1;cx[6][4][3]=2;

cy[6][4][0]=-1;cy[6][4][2]=1;cy[6][4][3]=0;

cx[7][1][0]=-1;cx[7][1][2]=1;cx[7][1][3]=2;

cy[7][1][0]=1;cy[7][1][2]=-1;cy[7][1][3]=0;

cx[7][2][0]=-1;cx[7][2][2]=1;cx[7][2][3]=0;

cy[7][2][0]=-1;cy[7][2][2]=1;cy[7][2][3]=2;

cx[7][3][0]=1;cx[7][3][2]=-1;cx[7][3][3]=-2;

cy[7][3][0]=-1;cy[7][3][2]=1;cy[7][3][3]=0;

cx[7][4][0]=1;cx[7][4][2]=-1;cx[7][4][3]=0;

cy[7][4][0]=1;cy[7][4][2]=-1;cy[7][4][3]=-2;

srand(time(0)); /对随机数函数rand()进行初始化/

zt1=rand()%7+1; /生成第一、二个方块/

if(zt1==2) zt2=1;

if(zt1==1||zt1==4||zt1==5) zt2=rand()%2+1;

if(zt1==3||zt1==6||zt1==7) zt2=rand()%4+1;

rzt1=rand()%7+1;

if(rzt1==2) rzt2=1;

if(rzt1==1||rzt1==4||rzt1==5) rzt2=rand()%2+1;

if(rzt1==3||rzt1==6||rzt1==7) rzt2=rand()%4+1;

score=0;

for(o=1;o<11;o++) b[o]=0;

switch(zt110+zt2)

/zt1和zt2分别代表方块的种类和状态,这步是根据这两个变量确定方块的四个点的坐标/

{ case 11: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=7;

doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=2;

break;

case 12: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=5;

doty[0]=4;doty[1]=3;doty[2]=2;doty[3]=1;

break;

case 21: dotx[0]=5;dotx[1]=6;dotx[2]=5;dotx[3]=6;

doty[0]=1;doty[1]=1;doty[2]=2;doty[3]=2;

break;

case 31: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=5;

doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=1;

break;

case 32: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=6;

doty[0]=1;doty[1]=2;doty[2]=3;doty[3]=2;

break;

case 33: dotx[0]=6;dotx[1]=5;dotx[2]=4;dotx[3]=5;

doty[0]=1;doty[1]=1;doty[2]=1;doty[3]=2;

break;

case 34: dotx[0]=6;dotx[1]=6;dotx[2]=6;dotx[3]=5;

doty[0]=3;doty[1]=2;doty[2]=1;doty[3]=2;

break;

case 41: dotx[0]=6;dotx[1]=5;dotx[2]=5;dotx[3]=4;

doty[0]=2;doty[1]=2;doty[2]=1;doty[3]=1;

break;

case 42: dotx[0]=5;dotx[1]=5;dotx[2]=6;dotx[3]=6;

doty[0]=3;doty[1]=2;doty[2]=2;doty[3]=1;

break;

case 51: dotx[0]=4;dotx[1]=5;dotx[2]=5;dotx[3]=6;

doty[0]=2;doty[1]=2;doty[2]=1;doty[3]=1;

break;

case 52: dotx[0]=5;dotx[1]=5;dotx[2]=6;dotx[3]=6;

doty[0]=1;doty[1]=2;doty[2]=2;doty[3]=3;

break;

case 61: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=6;

doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=1;

break;

case 62: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=6;

doty[0]=1;doty[1]=2;doty[2]=3;doty[3]=3;

break;

case 63: dotx[0]=6;dotx[1]=5;dotx[2]=4;dotx[3]=4;

doty[0]=1;doty[1]=1;doty[2]=1;doty[3]=2;

break;

case 64: dotx[0]=6;dotx[1]=6;dotx[2]=6;dotx[3]=5;

doty[0]=3;doty[1]=2;doty[2]=1;doty[3]=1;

break;

case 71: dotx[0]=6;dotx[1]=5;dotx[2]=4;dotx[3]=4;

doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=1;

break;

case 72: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=6;

doty[0]=3;doty[1]=2;doty[2]=1;doty[3]=1;

break;

case 73: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=6;

doty[0]=1;doty[1]=1;doty[2]=1;doty[3]=2;

break;

case 74: dotx[0]=6;dotx[1]=6;dotx[2]=6;dotx[3]=5;

doty[0]=1;doty[1]=2;doty[2]=3;doty[3]=3;

break;

}

switch(rzt110+rzt2) /确定第二个方块各个点的坐标/

{ case 11: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=7;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=2;

break;

case 12: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=5;

roty[0]=4;roty[1]=3;roty[2]=2;roty[3]=1;

break;

case 21: rotx[0]=5;rotx[1]=6;rotx[2]=5;rotx[3]=6;

roty[0]=1;roty[1]=1;roty[2]=2;roty[3]=2;

break;

case 31: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=5;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 32: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=2;

break;

case 33: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=5;

roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;

break;

case 34: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;

roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=2;

break;

case 41: rotx[0]=6;rotx[1]=5;rotx[2]=5;rotx[3]=4;

roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 42: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=3;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 51: rotx[0]=4;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 52: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=1;roty[1]=2;roty[2]=2;roty[3]=3;

break;

case 61: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 62: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;

break;

case 63: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;

roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;

break;

case 64: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;

roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 71: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 72: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 73: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;

break;

case 74: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;

roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;

break;

}

system("cls"); /显示初始阶段/

printf("\n\n\n"); /游戏区域下移3/

for(u=0;u<19;u++)

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

printf("%c",str[i][u]);

printf("\n");

}

gotoxy(16,5);printf("--------");

gotoxy(16,12);printf("--------");

for(i=6;i<12;i++)

{ gotoxy(16,i);printf("|");gotoxy(23,i);printf("|"); }

for(i=6;i<12;i++)

{ gotoxy(16,i);printf("|");gotoxy(23,i);printf("|"); }

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

{ gotoxy(rotx[i]+14,roty[i]+6);printf("%c",15);

}

begin2: delay(26000); /游戏开始,延迟1/

speed: delay(10000); /加速,延迟2/

gotoxy(16,14);printf("Score:%d",score);

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

{ gotoxy(dotx[i]+1,doty[i]+4);printf(" ");

ddx=dotx[i];ddy=doty[i];

str[ddx][ddy]=' ';

}

an=an-04; /表示按键是否一直按着,用于方块落地后的移动/

c=bioskey(1); /按键处理部分/

/bioskey(1)是用来检测是否按下案件的函数/

if(c!=0)

{ c=bioskey(0);

if(c==8292||c==19712)

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

{ dx[i]=dotx[i]+1;dy[i]=doty[i]; }

jiance();

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

dotx[i]=(j) dx[i] : dotx[i];

an=(j||bn);

}

if(c==7777||c==19200)

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

{ dx[i]=dotx[i]-1;dy[i]=doty[i]; }

jiance();

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

dotx[i]=(j) dx[i] : dotx[i];

an=(j||bn);

}

if(c==6512) /暂停的处理/

{ while(1)

{ c=bioskey(0);

if(c==6512) break;

}

goto begin3;

}

if(c==8051||c==20480) spd=1; /加速(spd==1表示加速状态)/

if(c==4471||c==18432) /旋转的处理/

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

{ dx[i]=dotx[i];dy[i]=doty[i]; }

/dx[]与dy[]是临时变量,这样一旦判断为不能旋转,就可方便的回复旋转前的坐标/

cir(); /旋转/

jiance(); /判断旋转是否能进行/

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

{ dotx[i]=(j) dx[i] : dotx[i]; doty[i]=(j)dy[i] : doty[i]; }

/根据jiance()得到的j值,判断是对dotx[]与doty[]赋旋转后的还是旋转前的值/

if(j==1) /如果旋转可已经行,就对原方块的状态进行改变/

{ an=(j||bn);zt2=zt2+1;

if(zt2>maxzt[zt1]) zt2=1;

goto overif; /结束旋转的处理/

}

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

{ dx[i]=dotx[i]+1;dy[i]=doty[i]; }

/如果不能旋转,再判断坐标右移一个后能否旋转/

cir();

jiance();

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

{ dotx[i]=(j) dx[i] : dotx[i]; doty[i]=(j)dy[i] : doty[i]; }

if(j==1)

{ an=(j||bn);zt2=zt2+1;

if(zt2>maxzt[zt1]) zt2=1;

goto overif;

}

if(dotx[2]==1) goto overif;

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

{ dx[i]=dotx[i]-1;dy[i]=doty[i]; }

/判断坐标左移一个后能否旋转/

cir();

jiance();

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

{ dotx[i]=(j) dx[i] : dotx[i]; doty[i]=(j)dy[i] : doty[i]; }

if(j==1)

{ an=(j||bn);zt2=zt2+1;

if(zt2>maxzt[zt1]) zt2=1;

goto overif;

}

overif: ;

}

}

begin3: for(i=0;i<4;i++) /方块下移的处理/

{ dx[i]=dotx[i];dy[i]=doty[i]+1; }

jiance();

bn=j;

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

doty[i]=(j) dy[i] : doty[i];

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

{ gotoxy(dotx[i]+1,doty[i]+4);printf("%c",15);

ddx=dotx[i];ddy=doty[i];

str[ddx][ddy]=15;

}

if(j==1&&spd==1) { spd=0;goto speed; }

if(j==1||an>0) goto begin2;

for(u=17;u>0;u--) /方块停止下移(方块移动到底了)的处理/

{ for(i=1;i<11;i++) /判断每一行是否排满/

if(str[i][u]==15) b[i]=1;

if (b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8]+b[9]+b[10]<10)

{ for(o=1;o<11;o++) b[o]=0;

continue;

}

for(o=1;o<11;o++) b[o]=0;

a[t]=u;t++;

}

score+=(t)(t-1)/2;

for(i=1;i<11;i++)

if(str[i][1]==15) b[i]=1;

if (b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8]+b[9]+b[10]>0 &&t==1) goto over;

for(o=1;o<11;o++) b[o]=0;

if(t==1) goto ran;

switch(t) /消除方块的处理,t=要消除的函数+1/

{ case 5: for(u=a[4];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }

/将要消除的行中,最上面一行,上面的方格整体下移,下面的case 4,3,2类似/

case 4: for(u=a[3];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }

case 3: for(u=a[2];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }

case 2: for(u=a[1];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }

}

t=1;

for(u=1;u<18;u++)

{ for(i=1;i<11;i++)

{ gotoxy(i+1,u+4);

printf("%c",str[i][u]);

}

}

ran: zt1=rzt1;zt2=rzt2;rzt1=rand()%7+1; /生成下两个方块/

if(rzt1==2) rzt2=1;

if(rzt1==1||rzt1==4||rzt1==5) rzt2=rand()%2+1;

if(rzt1==3||rzt1==6||rzt1==7) rzt2=rand()%4+1;

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

{ dotx[i]=rotx[i];doty[i]=roty[i];

gotoxy(dotx[i]+1,doty[i]+4);printf("%c",15);

}

switch(rzt110+rzt2)

{ case 11: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=7;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=2;

break;

case 12: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=5;

roty[0]=4;roty[1]=3;roty[2]=2;roty[3]=1;

break;

case 21: rotx[0]=5;rotx[1]=6;rotx[2]=5;rotx[3]=6;

roty[0]=1;roty[1]=1;roty[2]=2;roty[3]=2;

break;

case 31: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=5;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 32: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=2;

break;

case 33: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=5;

roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;

break;

case 34: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;

roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=2;

break;

case 41: rotx[0]=6;rotx[1]=5;rotx[2]=5;rotx[3]=4;

roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 42: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=3;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 51: rotx[0]=4;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 52: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=1;roty[1]=2;roty[2]=2;roty[3]=3;

break;

case 61: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 62: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;

break;

case 63: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;

roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;

break;

case 64: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;

roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 71: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;

roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;

break;

case 72: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;

roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;

break;

case 73: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;

roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;

break;

case 74: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;

roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;

break;

}

for(i=6;i<12;i++) /刷新一下用来显示下一个方块的那个区域/

{ gotoxy(16,i);printf("|");gotoxy(23,i);printf("|"); }

for(i=6;i<12;i++)

for(u=17;u<23;u++) { gotoxy(u,i);printf("%c",32); }

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

{ gotoxy(rotx[i]+14,roty[i]+6);printf("%c",15); }

c=bioskey(1);an=0;

if(c!=0) c=bioskey(0);

if(spd==1) { spd=0;goto speed; }

goto begin2;

over: system("cls");

gotoxy(36,11);printf("GAME OVER");

bioskey(0);

system("cls");

printf("Your score is %d\n\n",score);

printf("Press 'Q' to exit\nIf you want to play again,please press other keys");

score=0;

c=bioskey(0);

if(c!=4209) goto begin;

}

当时做得时候工具用turboC 20开发的,课程设计

具体的代码网上可以搜到很多,我就不细说了

当时编码的时候,通常把俄罗斯方块的编码工作分成几个小块完成,我描述一下:

1 当前下落块的控制逻辑

2 用户输入的控制逻辑,这个是用中断控制,比如bioskey()函数去获取当前的输入值,具体的我记不清了

3 判断一行是否能够消去逻辑(公共环境是用2012的数组来存放)

4 难度以及其他配置模块管理,模块划分清楚之后,编码较为容易

希望可以有帮助: )

以上就是关于一个C语言写的俄罗斯方块的不懂之处请指教全部的内容,包括:一个C语言写的俄罗斯方块的不懂之处请指教、怎样用C语言写俄罗斯方块,求指教,谢谢!、寻求c语言版的俄罗斯方块程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9987933.html

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

发表评论

登录后才能评论

评论列表(0条)

保存