最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2048小游戏C语言实现代码
时间:2022-06-25 04:31:09 编辑:袖梨 来源:一聚教程网
本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下
大一时学c语言写的,写的不好但当时感觉还行。
环境运行 vc6.0 ,cpp文件。
基本上是c写的,但是改变字体颜色,在控制台移动光标等等好像不是c中的。
代码:
#include#include #include #include #include #define x0 26 #define y0 1 HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE); /*显示声明*/ void p(int*a,int i,int x,int y); /*部分刷新声明*/ void shua(void); /*胜利画面测试函数声明*/ int test(void); /*字体空格声明*/ void kg(int*a); /*画长条函数的声明*/ void ct(int x,int y,int l,int k,int c); /*标题字幕2048*/ void p2048(int x,int y); /*单个颜色返回值声明*/ int col(int*a); /*移动光标*/ void gotoxy(int x,int y) { COORD coordScreen={0,0}; coordScreen.X=x; coordScreen.Y=y; SetConsoleCursorPosition(hOutput,coordScreen); } /*字体颜色*/ void textcolor(int color) { SetConsoleTextAttribute(hOutput,color); } /*显示函数*/ void prin(int*a,int*score,int*scoremax) { int i; for (i = 0; i < 16; i++) { p(a,i,x0,y0); } printf("nn score=%d MAXscore=%d n", *score, *scoremax); } /* 产生随机数 */ int shu(void) { int s = 0; s = 1 + (int)(12.0 * rand() / (RAND_MAX + 1.0)); if (s == 12) return 4; else return 2; } /* 决定位置 */ int rands(void) { return (int)(16.0 * rand() / (RAND_MAX + 1.0)); } /* 主函数*/ int main(void) { int flag = 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; char sr,an; //开始画面 p2048(17,1); textcolor(255); gotoxy(35,15); for(;;) { an=getch(); switch(an) { case 72: if(ks==1) ks=0; else ks=1; break; case 80: 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; else if(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("nnnnn I know "); getch(); p2048(17,1); textcolor(255); gotoxy(34,18); } yx=0; } //隐藏光标 HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; 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) { /* 向上移动 */ case 72: /* 全部移到上边 */ 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; } } else if (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; } else if (a[j + 8] == a[j + 12]) { a[j + 8] = 2 * a[j + 8]; score = score + a[j + 8]; a[j + 12] = 0; } else; } break; /* 向下移动 */ case 80: /* 全部移动到下面 */ 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; } } else if (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; } else if (a[j - 8] == a[j - 12]) { a[j - 8] = 2 * a[j - 8]; score = score + a[j - 8]; a[j - 12] = 0; } else; } break; /* 向左移动 */ case 75: /* 全部移动到左面 */ 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; } } else if (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; } else if (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 77: /* 全部移动到右面 */ 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; } } else if (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; } else if (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(); return 0; 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) { case 72: 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 "); } else if(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; case 80: 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 "); } else if(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; } /* 继续游戏 */ else if (t == 2) { jx = 1; shua(); } else { shua(); ct(32,19,15,3,207); printf(" 游戏已退出!"); textcolor(255); gotoxy(0,0); getch(); return 0; } } } /* 决定是否产生新的数及其位置以及游戏是否失败 */ /* 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; } } /* 游戏是否失败的判定 */ /* 移动后无空位 */ else if (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("Whether continue the game ?"); gotoxy(44,21); printf("@Yes No"); gotoxy(44,21); t=1; an=75; yx=0; for(;;) { an=getch(); switch(an) { case 75: 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 77: 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(); return 0; } } } else; /* 显示结果 */ prin(a,&score,&scoremax); } return 0; } /*显示函数*/ void p(int*a,int i,int x,int y) { int x1=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); } /*字体空格声明*/ void kg(int*a) { if(*a==0) printf(" ",*a); else if(*a<10) printf(" %d ",*a); else if(*a<100) printf(" %d ",*a); else if(*a<1000) printf(" %d ",*a); else if(*a<10000) printf("%d ",*a); else printf("%d",*a); } /*单个颜色返回值*/ int col(int*a) { int co=127; if(*(a)==0) co=127; else if(*(a)==2) co=143; else if(*(a)==4) co=191; else if(*(a)==8) co=175; else if(*(a)==16) co=239; else if(*(a)==32) co=223; else if(*(a)==64) co=207; else if(*(a)==128) co=95; else if(*(a)==256) co=159; else if(*(a)==512) co=63; else if(*(a)==1024) co=111; else if(*(a)==2048) co=79; else if(*(a)==4096) co=287; else co=271; return co; } /*标题字幕2048*/ void p2048(int x,int y) { int i; 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(" Game Sart"); ct(35,18,20,1,240); printf("How to play"); printf("n"); printf("nnn Made by Mr Yan"); gotoxy(35-25,15); textcolor(255); gotoxy(0,0); } /*画长条函数*/ void ct(int x,int y,int l,int k,int c) { int i=0,j=0; textcolor(c); gotoxy(x,y); for(i=0;i
相关文章
- 江南百景图碎金泉怎么样 12-26
- 江南百景图游宴廊怎么样 江南百景图游宴廊建筑介绍 12-26
- 江南百景图碎金泉怎么样 江南百景图碎金泉建筑介绍 12-26
- 炉石传说兑换码大全 12-26
- 重返未来1999趋光性研究夜幕之外怎么玩 趋光性夜幕之外活动介绍 12-26
- 光遇12.26大蜡烛在哪里 光遇12月26日大蜡烛位置攻略 12-26