寻求c语言版的俄罗斯方块程序

寻求c语言版的俄罗斯方块程序,第1张

#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;

}

俄罗斯方块用C语言编写的可以算是应用软件,应用软件是指为特定用户群体和特定应用场景而开发的可执行软件,它们提供特定的应用功能,以满足用户的需求。俄罗斯方块就是一款为特定用户群体开发的游戏软件,它能够满足用户的需求,所以可以算作应用软件。

你好。试试这个#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);/打开1212汉字苦/

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=0;i<12;i++)/12行/

for(j=0;j<2;j++)/两个字节/

for(k=0;k<8;k++)/8位/

if (((buffer[i2+j]>>(7-k))&0x1)!=NULL)/是一就画点/

putpixel(x0+8j+k,y0+i,color);

s+=2;/一个汉字占两个字节,现在将指针移动两个字节/

x0+=w;/显示坐标也按照间隔移动/

}

else/显示非汉字字符/

{ settextstyle(0,0,1);

setcolor(color);

str[0]=s;str[1]=0;

outtextxy(x0,y0+3,str);/显示单个字符/

x0+=w-7;/显示单个字符后的x坐标变化/

s++;/指针移动到下一个字节/

}

}

fclose(fp);

}

void translation() /把相对坐标解释为绝对坐标/

{ if(RARx==1)

{ RAx1=1; RAx2=16; }

else

{ RAx1=16(RARx-1); RAx2=16RARx; }

if(RARy==1)

{ RAy1=1; RAy2=16; }

else

{ RAy1=16(RARy-1); RAy2=16RARy; }

}

int check_b() /检查是否到达低部/

{ int x,y,i,zf=0; /zf为是否有颜色填充记录/

for(i=0;i<7;i++,i++)

{ x=RARx+p[rs1]co[i];

y=RARy+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=1;i<11;i++)

tfull+=r_f[i][1];

if(tfull!=0)

return 1; /告诉judge()可以结束了/

}

int check_l() /检查形状是否与左接触/

{ int x,y,i,zf=0;

for(i=0;i<7;i++,i++)

{ x=RARx+p[rs1]co[i];

y=RARy+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=0;i<7;i++,i++)

{

x=RARx+p[rs1]co[i];

y=RARy+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=RARx,recordy=RARy;

for(i=0;i<7;i++,i++)

{ RARx+=p[rs1]co[i];

RARy+=p[rs1]co[i+1];

if(RARy<=6)

{ RARx=recordx;

RARy=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[RARx-15][RARy-6]=1; /置对应数组标记元素/

}

bar(RAx1+1,RAy1+1,RAx2-1,RAy2-1);

RARx=recordx;

RARy=recordy;

}

}

void mov(int key) /向下,左,右移动方块/

{ draw(2);

if(key==LEFT&&nleft)

RARx--;

else

if(key==RIGHT&&nright)

RARx++;

else

RARy++;

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=0;i<7;i++,i++) /检查变化形状后是否与已存形状发生冲突/

{ x=RARx+p[rs1]co[i];

y=RARy+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=xcors;xcor<=xcorb;xcor++)

for(ycor=ycors;ycor<=ycorb;ycor++)

{ if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb)

{ RARx=xcor;

RARy=ycor;

translation();

setfillstyle(1,DARKGRAY);

bar(RAx1+1,RAy1+1,RAx2-1,RAy2-1);

}

}

}

void erasure(int k)

{ int i,j,recordx=RARx,recordy=RARy;

{ j=k-1;

for(;j>0;j--)

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

{ r_f[i][j+1]=r_f[i][j];

RARx=i+15;

RARy=j+1+6;

translation();

if(r_f[i][j+1]==1)

setfillstyle(1,WHITE);

else

setfillstyle(1,BLACK);

bar(RAx1+1,RAy1+1,RAx2-1,RAy2-1);

RARx=recordx;

RARy=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=1;j<21;j++) /判断某一行是否满了/

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

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=0;i<12;i++)

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

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()

{ RARx=18;

RARy=6-p[rs1]co[7];;

RAx1=0;

RAx2=0;

RAy1=0;

RAy2=0;

}

void next_shape() /画下一形状提示框/

{ int recordx=RARx,recordy=RARy,buffer;

RARx=3;

RARy=7;

draw(2);

buffer=rs1;

rs1=rs2;

rs2=buffer;

draw(1);

RARx=recordx;

RARy=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();

}

1定义各基本的图形单元,并把它们实现。

2定义显示区域中行、列数,实现可以按1中定义的单元进行填充(显示)

3定义数据结构,进行各行填充满时的判断,此时可以进行消除。并把上面各行依次下移。

  (注意:1中定义的图元,在下落到最底行时,就不必要保持图元的信息,而是把相对应的2中

  定义的行列区域进行填充,这实际上就是3中定义的数据结构的 *** 作,图形只是按照数据结构

  中对应的定义显示出来而已,实际上,你先把3定义好之后,再做1,2更合适)

4加上对图元的控制(加快速度,左右翻转,左右移动)

5增加积分设计,增加分值对速度的影响等。

6增加其它好玩的设计,如:爆炸效果、消除时的特效等等。

7有耐心的话,增加其它元素,如:连网对战,双人对战,历史积分记录等等功能。

8图形美化,等等其它细节。

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

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

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

1 当前下落块的控制逻辑

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

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

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

希望可以有帮助: )

以上就是关于寻求c语言版的俄罗斯方块程序全部的内容,包括:寻求c语言版的俄罗斯方块程序、用c语言编写的俄罗斯方块属于应用软件吗、用C语言编写的俄罗斯方块代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存