2048小游戏怎么使用C语言实现
作者
这篇文章将为大家详细讲解有关2048小游戏怎么使用C语言实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下
环境运行 vc6.0 ,cpp文件。
基本上是c写的,但是改变字体颜色,在控制台移动光标等等好像不是c中的。
代码:
#include<time.h> #include<stdlib.h> #include<conio.h> #include<stdio.h> #include<windows.h> #definex026 #definey01 HANDLEhOutput=GetStdHandle(STD_OUTPUT_HANDLE); /*显示声明*/ voidp(int*a,inti,intx,inty); /*部分刷新声明*/ voidshua(void); /*胜利画面测试函数声明*/ inttest(void); /*字体空格声明*/ voidkg(int*a); /*画长条函数的声明*/ voidct(intx,inty,intl,intk,intc); /*标题字幕2048*/ voidp2048(intx,inty); /*单个颜色返回值声明*/ intcol(int*a); /*移动光标*/ voidgotoxy(intx,inty) { COORDcoordScreen={0,0}; coordScreen.X=x; coordScreen.Y=y; SetConsoleCursorPosition(hOutput,coordScreen); } /*字体颜色*/ voidtextcolor(intcolor) { SetConsoleTextAttribute(hOutput,color); } /*显示函数*/ voidprin(int*a,int*score,int*scoremax) { inti; for(i=0;i<16;i++) { p(a,i,x0,y0); } printf("\n\nscore=%dMAXscore=%d\n",*score,*scoremax); } /*产生随机数*/ intshu(void) { ints=0; s=1+(int)(12.0*rand()/(RAND_MAX+1.0)); if(s==12) return4; else return2; } /*决定位置*/ intrands(void) { return(int)(16.0*rand()/(RAND_MAX+1.0)); } /*主函数*/ intmain(void) { intflag=0,c=0,pd=1,n=0,i=0,m=0,j= 0,sj,sj1,sj2,a[16]={0},b[16]={0},x=0,score=0,t=0,jx=0,scoremax=0,ks=1,yx=0; charsr,an; //开始画面 p2048(17,1); textcolor(255); gotoxy(35,15); for(;;) { an=getch(); switch(an) { case72: if(ks==1) ks=0; else ks=1; break; case80: if(ks==1) ks=0; else ks=1; break; case'\r': yx=1; break; default: break; } if(ks==1) gotoxy(35,15); else gotoxy(34,18); if(ks==1&&yx==1) break; elseif(ks==0&&yx==1) { textcolor(240); gotoxy(0,0); for(i=0;i<=500;i++) { printf(""); } gotoxy(0,0); ct(12,5,58,10,223); gotoxy(13,6); printf("2048游戏说明"); gotoxy(13,8); printf("通过按数字键移动数字,合并相同的数字来的取得更大的数。"); gotoxy(13,9); printf("得到2048时游戏即胜利,当然您也可以选择继续挑战。"); gotoxy(13,11); printf("按键操作:"); gotoxy(13,13); printf("上:↑下:↓左:←右:→重新开始:r退出游戏:e"); textcolor(240); printf("\n\n\n\n\nIknow"); getch(); p2048(17,1); textcolor(255); gotoxy(34,18); } yx=0; } //隐藏光标 HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFOcci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=FALSE; SetConsoleCursorInfo(hOut,&cci); //刷新画面 textcolor(240); gotoxy(0,0); for(i=0;i<=500;i++) { printf(""); } gotoxy(0,0); /*设置时间种子*/ srand((int)time(0)); /*设置初始值*/ sj=rands(); sj1=rands(); sj2=rands(); for(;;) { if(sj==sj1||sj==sj2||sj1==sj2) { sj1=rands(); sj2=rands(); } else break; } a[sj]=shu(); a[sj1]=shu(); a[sj2]=shu(); /*显示*/ prin(a,&score,&scoremax); for(;;) { /*无回显输入*/ sr=getch(); /*scanf("%d",&n);*//*记录之前的位置,将用以比较移动是否有效*/ for(j=0;j<16;j++) b[j]=a[j]; switch(sr) { /*向上移动*/ case72: /*全部移到上边*/ for(j=0;j<4;j++) { for(c=0;c<3;c++) { if(a[j]==0) { a[j]=a[j+4]; a[j+4]=0; } if(a[j+4]==0) { a[j+4]=a[j+8]; a[j+8]=0; } if(a[j+8]==0) { a[j+8]=a[j+12]; a[j+12]=0; } } /*移到上面后的合并操作*/ if(a[j]==a[j+4]) { a[j]=a[j]*2; score=score+a[j]; a[j+4]=a[j+8]; a[j+8]=a[j+12]; a[j+12]=0; if(a[j+4]==a[j+8]) { a[j+4]=2*a[j+4]; score=score+a[j+4]; a[j+8]=0; } } elseif(a[j+4]==a[j+8]) { a[j+4]=2*a[j+4]; score=score+a[j+4]; a[j+8]=a[j+12]; a[j+12]=0; } elseif(a[j+8]==a[j+12]) { a[j+8]=2*a[j+8]; score=score+a[j+8]; a[j+12]=0; } else; } break; /*向下移动*/ case80: /*全部移动到下面*/ for(j=12;j<16;j++) { for(c=0;c<3;c++) { if(a[j]==0) { a[j]=a[j-4]; a[j-4]=0; } if(a[j-4]==0) { a[j-4]=a[j-8]; a[j-8]=0; } if(a[j-8]==0) { a[j-8]=a[j-12]; a[j-12]=0; } } /*移到下面后的合并操作*/ if(a[j]==a[j-4]) { a[j]=a[j]*2; score=score+a[j]; a[j-4]=a[j-8]; a[j-8]=a[j-12]; a[j-12]=0; if(a[j-4]==a[j-8]) { a[j-4]=2*a[j-4]; score=score+a[j-4]; a[j-8]=0; } } elseif(a[j-4]==a[j-8]) { a[j-4]=2*a[j-4]; score=score+a[j-4]; a[j-8]=a[j-12]; a[j-12]=0; } elseif(a[j-8]==a[j-12]) { a[j-8]=2*a[j-8]; score=score+a[j-8]; a[j-12]=0; } else; } break; /*向左移动*/ case75: /*全部移动到左面*/ for(j=0;j<=12;j=j+4) { for(c=0;c<3;c++) { if(a[j]==0) { a[j]=a[j+1]; a[j+1]=0; } if(a[j+1]==0) { a[j+1]=a[j+2]; a[j+2]=0; } if(a[j+2]==0) { a[j+2]=a[j+3]; a[j+3]=0; } } /*移到左面后的合并操作*/ if(a[j]==a[j+1]) { a[j]=a[j]*2; score=score+a[j]; a[j+1]=a[j+2]; a[j+2]=a[j+3]; a[j+3]=0; if(a[j+1]==a[j+2]) { a[j+1]=2*a[j+1]; score=score+a[j+1]; a[j+2]=0; } } elseif(a[j+1]==a[j+2]) { a[j+1]=2*a[j+1]; score=score+a[j+1]; a[j+2]=a[j+3]; a[j+3]=0; } elseif(a[j+2]==a[j+3]) { a[j+2]=2*a[j+2]; score=score+a[j+2]; a[j+3]=0; } else; } break; /*向右移动*/ case77: /*全部移动到右面*/ for(j=3;j<=16;j=j+4) { for(c=0;c<3;c++) { if(a[j]==0) { a[j]=a[j-1]; a[j-1]=0; } if(a[j-1]==0) { a[j-1]=a[j-2]; a[j-2]=0; } if(a[j-2]==0) { a[j-2]=a[j-3]; a[j-3]=0; } } /*移到右面后的合并操作*/ if(a[j]==a[j-1]) { a[j]=a[j]*2; score=score+a[j]; a[j-1]=a[j-2]; a[j-2]=a[j-3]; a[j-3]=0; if(a[j-1]==a[j-2]) { a[j-1]=2*a[j-1]; score=score+a[j-1]; a[j-2]=0; } } elseif(a[j-1]==a[j-2]) { a[j-1]=2*a[j-1]; score=score+a[j-1]; a[j-2]=a[j-3]; a[j-3]=0; } elseif(a[j-2]==a[j-3]) { a[j-2]=2*a[j-2]; score=score+a[j-2]; a[j-3]=0; } else; } break; /*重新开始*/ case'r': for(j=0;j<16;j++) a[j]=0; sj1=rands(); sj2=rands(); for(;;) { if(sj1==sj2) { sj1=rands(); sj2=rands(); } else break; } a[sj1]=shu(); a[sj2]=shu(); flag=0; score=0; jx=0; break; /*退出*/ case'e': shua(); ct(32,19,15,3,207); printf("游戏已退出!"); textcolor(255); gotoxy(0,0); getch(); return0; break; /*其他情况(刷新)*/ default: ; break; } /*windows下的系统清屏函数*/ //system("cls"); /*判断最高分*/ if(score>scoremax) scoremax=score; /*判断是否胜利(是否含有2048)*/ for(j=0;j<16;j++) { if(a[j]==2048&&jx==0) { /*胜利时输出游戏结果*/ /*显示*/ prin(a,&score,&scoremax); shua(); ct(20,19,15,3,207); printf("游戏胜利!"); textcolor(159); gotoxy(38,19); printf("Continue"); textcolor(239); gotoxy(49,20); printf("Restart"); textcolor(175); gotoxy(49,21); printf("Exit"); t=2; an=75; yx=0; for(;;) { an=getch(); switch(an) { case72: if(t==2) { t=3; textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(38,21); printf("Exit"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(47,19); printf("Continue"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(49,20); printf("Restart"); } elseif(t==1) { t=2; textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(38,19); printf("Continue"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(47,20); printf("Restart"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(49,21); printf("Exit"); } else { t=1; textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(38,20); printf("Restart"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(47,21); printf("Exit"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(49,19); printf("Continue"); } break; case80: if(t==2) { t=1; textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(38,20); printf("Restart"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(47,19); printf("Continue"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(49,21); printf("Exit"); } elseif(t==1) { t=3; textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(38,21); printf("Exit"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(47,20); printf("Restart"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(49,19); printf("Continue"); } else { t=2; textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(38,19); printf("Continue"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(47,21); printf("Exit"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(49,20); printf("Restart"); } break; case'\r': yx=1; break; } if(yx==1) { yx=0; break; } } shua(); textcolor(255); gotoxy(0,0); /*重新开始游戏*/ if(t==1) { shua(); pd=1; x=0; for(j=0;j<16;j++) a[j]=0; sj1=rands(); sj2=rands(); for(;;) { if(sj1==sj2) { sj1=rands(); sj2=rands(); } else break; } a[sj1]=shu(); a[sj2]=shu(); for(j=0;j<16;j++) b[j]=a[j]; flag=0; score=0; break; } /*继续游戏*/ elseif(t==2) { jx=1; shua(); } else { shua(); ct(32,19,15,3,207); printf("游戏已退出!"); textcolor(255); gotoxy(0,0); getch(); return0; } } } /*决定是否产生新的数及其位置以及游戏是否失败*/ /*flag,pd,x赋初值*/ flag=0; pd=1; x=0; /*判断移动后是否有空位:pd=0为有空位,pd=1为无空位*/ for(j=0;j<16;j++) { if(a[j]==0) pd=0; } /*移动是否有效:x=1有效,x=0无效*/ for(j=0;j<16;j++) { if(a[j]!=b[j]) { x=1; break; } } /*移动有效时且有空位时产生新数*/ if(pd==0&&x==1) { for(;;) { sj=rands(); if(a[sj]==0) { a[sj]=shu(); break; } else; } } /*游戏是否失败的判定*/ /*移动后无空位*/ elseif(pd!=0) { /*判断是否还有可合并的项*/ for(j=0;j<16;j++) { if(j!=3&&j!=7&&j!=11&&j!=15&&a[j]==a[j+1]) { flag=flag+1; } if(j!=12&&j!=13&&j!=14&&j!=15 &&a[j]==a[j+4]) { flag=flag+1; } if(j!=0&&j!=4&&j!=8&&j!=12&&a[j]==a[j-1]) { flag=flag+1; } if(j!=0&&j!=1&&j!=2&&j!=3&&a[j]==a[j-4]) { flag=flag+1; } } /*无空位且没有可合并的项时游戏失败*/ if(flag==0) { /*失败时输出游戏结果*/ /*显示*/ prin(a,&score,&scoremax); shua(); ct(20,19,15,3,271); printf("游戏结束!"); textcolor(240); gotoxy(38,19); printf("Whethercontinuethegame?"); gotoxy(44,21); printf("@YesNo"); gotoxy(44,21); t=1; an=75; yx=0; for(;;) { an=getch(); switch(an) { case75: if(t==1) { t=0; gotoxy(53,21); printf("@"); gotoxy(44,21); printf(""); } else { t=1; gotoxy(44,21); printf("@"); gotoxy(53,21); printf(""); } break; case77: if(t==1) { t=0; gotoxy(53,21); printf("@"); gotoxy(44,21); printf(""); } else { t=1; gotoxy(44,21); printf("@"); gotoxy(53,21); printf(""); } break; case'\r': yx=1; break; } if(yx==1) { yx=0; break; } } shua(); textcolor(255); gotoxy(0,0); if(t==1) { for(j=0;j<16;j++) a[j]=0; sj=rands(); sj1=rands(); sj2=rands(); for(;;) { if(sj1==sj2||sj1==sj||sj2==sj) { sj1=rands(); sj2=rands(); } else break; } a[sj]=shu(); a[sj1]=shu(); a[sj2]=shu(); score=0; jx=0; } else { shua(); ct(32,19,15,3,207); printf("游戏已退出!"); textcolor(255); gotoxy(0,0); getch(); return0; } } } else; /*显示结果*/ prin(a,&score,&scoremax); } return0; } /*显示函数*/ voidp(int*a,inti,intx,inty) { intx1=x,y1=y; textcolor(col(a+i)); x1=x+(i%4)*7; y1=y+(i/4)*4; gotoxy(x1,y1); printf(""); gotoxy(x1,y1+1); kg(a+i); gotoxy(x1,y1+2); printf(""); textcolor(240); } /*字体空格声明*/ voidkg(int*a) { if(*a==0) printf("",*a); elseif(*a<10) printf("%d",*a); elseif(*a<100) printf("%d",*a); elseif(*a<1000) printf("%d",*a); elseif(*a<10000) printf("%d",*a); else printf("%d",*a); } /*单个颜色返回值*/ intcol(int*a) { intco=127; if(*(a)==0) co=127; elseif(*(a)==2) co=143; elseif(*(a)==4) co=191; elseif(*(a)==8) co=175; elseif(*(a)==16) co=239; elseif(*(a)==32) co=223; elseif(*(a)==64) co=207; elseif(*(a)==128) co=95; elseif(*(a)==256) co=159; elseif(*(a)==512) co=63; elseif(*(a)==1024) co=111; elseif(*(a)==2048) co=79; elseif(*(a)==4096) co=287; else co=271; returnco; } /*标题字幕2048*/ voidp2048(intx,inty) { inti; textcolor(240); gotoxy(0,0); for(i=0;i<=500;i++) { printf(""); } //2 textcolor(207); gotoxy(x,y); printf(""); gotoxy(x,y+1); printf(""); gotoxy(x+7,y+2); printf(""); gotoxy(x+7,y+3); printf(""); gotoxy(x,y+4); printf(""); gotoxy(x,y+5); printf(""); gotoxy(x,y+6); printf(""); gotoxy(x,y+7); printf(""); gotoxy(x,y+8); printf(""); gotoxy(x,y+9); printf(""); //0 textcolor(239); gotoxy(x+13,y); printf(""); gotoxy(x+13,y+1); printf(""); gotoxy(x+13,y+2); printf(""); gotoxy(x+13+7,y+2); printf(""); gotoxy(x+13,y+3); printf(""); gotoxy(x+13+7,y+3); printf(""); gotoxy(x+13,y+4); printf(""); gotoxy(x+13+7,y+4); printf(""); gotoxy(x+13,y+5); printf(""); gotoxy(x+13+7,y+5); printf(""); gotoxy(x+13,y+6); printf(""); gotoxy(x+13+7,y+6); printf(""); gotoxy(x+13,y+7); printf(""); gotoxy(x+13+7,y+7); printf(""); gotoxy(x+13,y+8); printf(""); gotoxy(x+13,y+9); printf(""); //4 textcolor(159); gotoxy(x+26,y); printf(""); gotoxy(x+26+7,y); printf(""); gotoxy(x+26,y+1); printf(""); gotoxy(x+26+7,y+1); printf(""); gotoxy(x+26,y+2); printf(""); gotoxy(x+26+7,y+2); printf(""); gotoxy(x+26,y+3); printf(""); gotoxy(x+26+7,y+3); printf(""); gotoxy(x+26,y+4); printf(""); gotoxy(x+26,y+5); printf(""); gotoxy(x+26,y+6); printf(""); gotoxy(x+26,y+7); printf(""); gotoxy(x+26,y+8); printf(""); gotoxy(x+26,y+9); printf(""); //8 textcolor(175); for(i=0;i<10;i++) { gotoxy(x+39,y+i); printf(""); } textcolor(240); gotoxy(x+42,y+2); printf(""); gotoxy(x+42,y+3); printf(""); gotoxy(x+42,y+6); printf(""); gotoxy(x+42,y+7); printf(""); //长条 ct(35,15,20,1,240); printf("GameSart"); ct(35,18,20,1,240); printf("Howtoplay"); printf("\n"); printf("\n\n\nMadebyMrYan"); gotoxy(35-25,15); textcolor(255); gotoxy(0,0); } /*画长条函数*/ voidct(intx,inty,intl,intk,intc) { inti=0,j=0; textcolor(c); gotoxy(x,y); for(i=0;i<k;i++) { gotoxy(x,y+i); for(j=0;j<l;j++) { printf(""); } } gotoxy(x+1,y+k/2); } voidshua(void) { gotoxy(0,18); textcolor(255); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); gotoxy(0,0); } /*胜利画面测试函数*/ inttest(void) { inti,t,yx; charan; textcolor(240); gotoxy(0,0); for(i=0;i<=500;i++) { printf(""); } gotoxy(0,0); HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFOcci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=FALSE; SetConsoleCursorInfo(hOut,&cci); //printf("\n游戏胜利!t\n重新开始游戏请按1\n继续游戏请按2\n退出请按其他键3\n");213 /* 2继续选中textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(38,19); printf("Continue"); 2继续平常textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(49,19); printf("Continue"); 1重新选中textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(38,20); printf("Restart"); 1重新平常textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(49,20); printf("Restart"); 3退出选中textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(38,21); printf("Exit"); 3退出平常textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(49,21); printf("Exit"); //000000000000000000000000024 */ shua(); ct(20,19,15,3,207); printf("游戏胜利!"); textcolor(159); gotoxy(38,19); printf("Continue"); textcolor(239); gotoxy(49,20); printf("Restart"); textcolor(175); gotoxy(49,21); printf("Exit"); t=2; an=75; yx=0; for(;;) { an=getch(); switch(an) { case72: if(t==2) { t=3; textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(38,21); printf("Exit"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(47,19); printf("Continue"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(49,20); printf("Restart"); } elseif(t==1) { t=2; textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(38,19); printf("Continue"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(47,20); printf("Restart"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(49,21); printf("Exit"); } else { t=1; textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(38,20); printf("Restart"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(47,21); printf("Exit"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(49,19); printf("Continue"); } break; case80: if(t==2) { t=1; textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(38,20); printf("Restart"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(47,19); printf("Continue"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(49,21); printf("Exit"); } elseif(t==1) { t=3; textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(38,21); printf("Exit"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(47,20); printf("Restart"); textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(49,19); printf("Continue"); } else { t=2; textcolor(240); gotoxy(36,19); printf(""); textcolor(159); gotoxy(38,19); printf("Continue"); textcolor(240); gotoxy(36,21); printf(""); textcolor(175); gotoxy(47,21); printf("Exit"); textcolor(240); gotoxy(36,20); printf(""); textcolor(239); gotoxy(49,20); printf("Restart"); } break; case'\r': yx=1; break; } if(yx==1) { yx=0; break; } } shua(); textcolor(255); gotoxy(0,0); textcolor(240); if(t==2) printf("Continue"); elseif(t==1) printf("Restart"); else printf("Exit"); return0; }
关于“2048小游戏怎么使用C语言实现”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
目录
推荐阅读
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~