C语言实现俄罗斯方块小游戏
C语言实现俄罗斯方块小游戏的制作代码,具体内容如下
#include#include #include #defineTTY_PATH"/dev/tty" #defineSTTY_ON"sttyraw-echo-F" #defineSTTY_OFF"stty-rawecho-F" intmap[21][14]; chardirect; intnode[7][4][16]={ {{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},//长方形 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}}, {{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},//正方形 {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}}, {{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},//3边加一中点 {0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0}, {0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0}, {0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}, {{0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0},//右锄头型 {0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0}, {0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}, {1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}}, {{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},//左锄头型 {0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0}, {0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}}, {{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},//右曲折型 {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0}, {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}}, {{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},//左曲折型 {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, {0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}, {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}} }; typedefstructblock { intx; inty; intblockType; intblockDirect; }Block; Blockbl; voidinit_map()//初始化边框 { inti,j; for(i=0;i<21;i++) for(j=0;j<14;j++) { if(j==0||j==13) map[i][j]=200; elseif(i==20) map[i][j]=201; else map[i][j]=0; } } voidnew_block()//生成随机的俄罗斯方块 { intblockType=rand()%7; intblockDirect=rand()%4; intx=1; inty=5; bl.x=x; bl.y=y; bl.blockType=blockType; bl.blockDirect=blockDirect; } voidinput()//将移动后的俄罗斯方块,导入地图中作标记 { inti,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) { map[bl.x+i][bl.y+j]=1; } } voidoutput()//移动时,将之前俄罗斯方块在地图信息清空。 { inti,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) { map[bl.x+i][bl.y+j]=0; } } voidchange()//俄罗斯方格在碰撞后融入,固定 { inti,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) { map[bl.x+i][bl.y+j]=10; } for(j=1;j<13;j++) if(map[5][j]==10) { system("clear"); printf("gameover!!!!!!!!!\n"); exit(1); } } voidprint_map()//打印地图,显示信息 { inti,j; for(i=5;i<21;i++) { for(j=0;j<14;j++) { if(map[i][j]==200)//左右边界 printf("#"); elseif(map[i][j]==201)//下边界 printf("#"); elseif(map[i][j]==0)//空白地 printf(""); elseif(map[i][j]==1)//移动的俄罗斯方块 printf("*"); elseif(map[i][j]==10)//固定的俄罗斯方块 printf("@"); } printf("\n"); } } voiddelLine(intn)//消行 { inti,j; for(j=1;j<13;j++) map[n][j]=0; for(i=n;i>5;i--) for(j=1;j<13;j++) if(map[i-1][j]!=1) map[i][j]=map[i-1][j]; } voidisFillLine()//是否满足消行条件 { inti,j; intfals; for(i=19;i>5;i--) { fals=1; for(j=1;j<13;j++) { if(map[i][j]!=10) { fals=0; continue; } } if(fals) { delLine(i); } } } voiddown()//下移 { inti,j; intfale=1; for(i=3;i>=0;i--) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) if(map[bl.x+i+1][bl.y+j]==10||map[bl.x+i+1][bl.y+j]==201) { change(); fale=0; new_block(); isFillLine(); return; } if(fale) { output(); bl.x+=1; input(); } } voidright()//右移 { inti,j; intfale=1; for(i=3;i>=0;i--) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) if(map[bl.x+i][bl.y+j+1]==10||map[bl.x+i][bl.y+j+1]==200) { fale=0; return; } if(fale) { output(); bl.y+=1; input(); } } voidleft()//左移 { inti,j; intfale=1; for(i=3;i>=0;i--) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) if(map[bl.x+i][bl.y+j-1]==10||map[bl.x+i][bl.y+j-1]==200) { fale=0; return; } if(fale) { output(); bl.y-=1; input(); } } voidchange_block()//俄罗斯方块变形 { inti,j; output(); intfals=1; bl.blockDirect+=1; bl.blockDirect%=4; for(i=0;i<4;i++) for(j=0;j<4;j++) if(node[bl.blockType][bl.blockDirect][i*4+j]==1) if(map[bl.x+i][bl.y+j]!=0) { fals=0; break; } if(fals) { input(); }else { bl.blockDirect-=1; input(); } } charin_direct()//非堵塞输入 { fd_setfd; structtimevaltv; charch; FD_ZERO(&fd); FD_SET(0,&fd); tv.tv_sec=0; tv.tv_usec=10; if(select(1,&fd,NULL,NULL,&tv)>0) { ch=getchar(); } returnch; } intmain()//q退出游戏,a,d左右移动,空格变形 { srand(time(NULL)); init_map(); new_block(); input(); charch; intnum=0; while(1) { usleep(500000); system(STTY_ONTTY_PATH); ch=in_direct(); system(STTY_OFFTTY_PATH); system("clear"); if(ch=='a'&&num<=1) { left(); print_map(); num++; continue; }elseif(ch=='d'&&num<=1) { right(); print_map(); num++; continue; }elseif(ch==''&&num<=1) { change_block(); print_map(); num++; continue; }elseif(ch=='q') { system("clear"); printf("gaveover!!!!!\n"); exit(0); } down(); print_map(); num=0; } return0; }
更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合进行学习。
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
JavaScript经典游戏玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。