博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2048小游戏
阅读量:6033 次
发布时间:2019-06-20

本文共 17622 字,大约阅读时间需要 58 分钟。

废话不多,直接上源码

#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("\n\n 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("\n\n\n\n\n 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 <= 2000; 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(" "); gotoxy(x + 44, 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("\n\n\n Made by 柳猫"); printf("\n\n\n 更多干货资料请加群710520381"); 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
 

附上效果图:

游戏开始界面:

游戏进行中:

游戏结束:(更多干货和资料请直接联系我,也可以加群710520381,邀请码:柳猫,欢迎大家共同讨论)

你可能感兴趣的文章
vc中ASSERT()和VERIFY()区别
查看>>
centOS 搭建SVN服务器,提交自动发布代码,详细教程,及注意事项
查看>>
HTML<div><span>字符实体
查看>>
CentOS6.3安装PowerVault MD Storage Manager
查看>>
HTML 表格
查看>>
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
查看>>
php 未实例化类调用方法的问题
查看>>
Anaconda jupyter notebook 出现 kernel error 解决办法
查看>>
我对读计算机软件专业硕士的几点看法
查看>>
【枚举】bzoj1800 [Ahoi2009]fly 飞行棋
查看>>
用JS写CSS
查看>>
TOJ4537: n阶行列式
查看>>
算法刷题笔记-stack-四则运算
查看>>
3.16
查看>>
Linux下arp用法
查看>>
表单文件上传与文件下载
查看>>
jquery 中prop()的使用方法
查看>>
下午考
查看>>
WKWebView
查看>>
创建字符设备的三种方法
查看>>