C语言实现2048游戏
本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下
具有以下特点:
1.linux下完成
2.非堵塞键盘读取
3.随机生成2和4
#include#include #include #defineTTY_PATH"/dev/tty" #defineSTTY_ON"sttyraw-echo-F" #defineSTTY_OFF"stty-rawecho-F" intmap[4][4]; typedefstructnode { intx; inty; intnum; }Node; Nodenode; voidinit_map()//初始化全部方格 { inti,j; for(i=0;i<4;i++) for(j=0;j<4;j++) map[i][j]=0; } voidnew_node()//新增方格,避免重复。 { intx=0,y=0,num=0; do{ intfals=1; inti,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(map[i][j]==0) fals=0; if(fals)//新方格无法被填入,游戏失败 { system("clear"); printf("gameover!!!!!!!!!!!\n"); exit(0); } x=rand()%4; y=rand()%4; num=rand()%2; if(num==0) num=3; elseif(num==1) num=5; }while(map[x][y]>0); node.x=x; node.y=y; node.num=num; map[x][y]=node.num; } voidshow()//彩色打印数字 { inti,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(map[i][j]%2==1) { map[i][j]-=1; printf("\33[31m%d\33[0m\t",map[i][j]); } elseif(map[i][j]==0) { printf("%d\t",map[i][j]); } elseif(map[i][j]==2) { printf("\33[32m%d\33[0m\t",map[i][j]); } elseif(map[i][j]==4) { printf("\33[33m%d\33[0m\t",map[i][j]); } elseif(map[i][j]==8) { printf("\33[34m%d\33[0m\t",map[i][j]); } elseif(map[i][j]==16) { printf("\33[35m%d\33[0m\t",map[i][j]); } elseif(map[i][j]==32) { printf("\33[36m%d\33[0m\t",map[i][j]); } else { printf("\33[44m%d\33[0m\t",map[i][j]); } } printf("\n"); } } voidleft() { inti,j,z,tmp; for(i=0;i<4;i++)//全体方格左移 for(j=0;j<4;j++) if(map[i][j]==0) for(z=j+1;z<4;z++) if(map[i][z]>0) { tmp=map[i][j]; map[i][j]=map[i][z]; map[i][z]=tmp; break; } for(i=0;i<4;i++)//如果方格数字相同则,相加,通过主函数多次调用,排列好 for(j=0;j<4;j++) if(map[i][j]>0) for(z=j+1;z<4;z++) if(map[i][z]>0) if(map[i][z]==map[i][j]) { map[i][j]*=2; map[i][z]=0; }else break; else break; else break; } voidright() { inti,j,z,tmp; for(i=0;i<4;i++) for(j=3;j>=0;j--) if(map[i][j]==0) for(z=j-1;z>=0;z--) if(map[i][z]>0) { tmp=map[i][j]; map[i][j]=map[i][z]; map[i][z]=tmp; break; } for(i=0;i<4;i++) for(j=3;j>=0;j--) if(map[i][j]>0) for(z=j-1;z>=0;z--) if(map[i][z]>0) if(map[i][z]==map[i][j]) { map[i][j]*=2; map[i][z]=0; }else break; else break; else break; } voidup() { inti,j,z,tmp; for(i=0;i<4;i++) for(j=0;j<4;j++) if(map[j][i]==0) for(z=j+1;z<4;z++) if(map[z][i]>0) { tmp=map[j][i]; map[j][i]=map[z][i]; map[z][i]=tmp; break; } for(i=0;i<4;i++) for(j=0;j<4;j++) if(map[j][i]>0) for(z=j+1;z<4;z++) if(map[z][i]>0) if(map[z][i]==map[j][i]) { map[j][i]*=2; map[z][i]=0; }else break; else break; else break; } voiddown() { inti,j,z,tmp; for(i=0;i<4;i++) for(j=3;j>=0;j--) if(map[j][i]==0) for(z=j-1;z>=0;z--) if(map[z][i]>0) { tmp=map[j][i]; map[j][i]=map[z][i]; map[z][i]=tmp; break; } for(i=0;i<4;i++) for(j=3;j>=0;j--) if(map[j][i]>0) for(z=j-1;z>=0;z--) if(map[z][i]>0) if(map[z][i]==map[j][i]) { map[j][i]*=2; map[z][i]=0; }else break; else break; else break; } voidmove(charch) { switch(ch) { case'a': left(); break; case'd': right(); break; case'w': up(); break; case's': down(); break; } } 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() { srand(time(NULL)); init_map(); new_node(); show(); charch; inti=0; while(1) { system(STTY_ONTTY_PATH); ch=in_direct(); system(STTY_OFFTTY_PATH); if(ch=='a'||ch=='d'||ch=='s'||ch=='w') { system("clear"); for(i=0;i<3;i++)//重复多次才能排序好 move(ch); new_node(); show(); } if(ch=='q')//退出游戏 { system("clear"); printf("gameover!!!!!!!!\n"); break; } usleep(500000); } return0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。