这个2048游戏是我编的第6个小游戏,历程相对比较顺利。


图形版程序见我的博客 【C++ 程序】 2048游戏(EasyX 图形界面)。


程序

请使用(C++/11)标准编译该程序。

//This is a simple 2048 game.#include <iostream>
#include <vector>
#include <Windows.h>
#include <string>
#include <random>
#include <ctime>
#include <conio.h>
using namespace std;unsigned long score = 0;
int stop = 0;
string s0 = "    ";
string s2 = " 2  ";
string s4 = " 4  ";
string s8 = " 8  ";
string s16 = " 16 ";
string s32 = " 32 ";
string s64 = " 64 ";
string s128 = "128 ";
string s256 = "256 ";
string s512 = "512 ";
string s1024 = "1024";
string s2048 = "2048";
string s4096 = "4096";
string s8192 = "8192";vector<vector<string>> p = { {s0, s0, s0, s0}, {s0, s2, s0, s0}, {s0, s0, s0, s0}, {s0, s0, s0, s0} };int equal_int(string str)
{if (str == s2) return 4;else if (str == s4) return 8;else if (str == s8) return 16;else if (str == s16) return 32;else if (str == s32) return 64;else if (str == s64) return 128;else if (str == s128) return 256;else if (str == s256) return 512;else if (str == s512) return 1024;else if (str == s1024) return 2048;else if (str == s2048) return 4096;else if (str == s4096) return 8192;else return 0;
}string equal_str(string str)
{int num = equal_int(str);switch (num){case 4: return s4;case 8: return s8;case 16: return s16;case 32: return s32;case 64: return s64;case 128: return s128;case 256: return s256;case 512: return s512;case 1024: return s1024;case 2048: return s2048;case 4096: return s4096;case 8192: return s8192;default: return "    ";}
}void change(int n)
{switch (n){case 3: // leftfor (int i = 0; i != 4; i++){if (p[i][0] == s0){p[i][0] = p[i][1];p[i][1] = p[i][2];p[i][2] = p[i][3];p[i][3] = s0;}if (p[i][0] == s0){p[i][0] = p[i][1];p[i][1] = p[i][2];p[i][2] = s0;}if (p[i][0] == s0){p[i][0] = p[i][1];p[i][1] = s0;}if (p[i][1] == s0){p[i][1] = p[i][2];p[i][2] = p[i][3];p[i][3] = s0;}if (p[i][1] == s0){p[i][1] = p[i][2];p[i][2] = s0;}if (p[i][2] == s0){p[i][2] = p[i][3];p[i][3] = s0;}}for (int i = 0; i != 4; i++){if (p[i][0] == p[i][1] && p[i][0] != s0){score += equal_int(p[i][0]);p[i][0] = equal_str(p[i][0]);p[i][1] = p[i][2];p[i][2] = p[i][3];p[i][3] = s0;if (p[i][1] == p[i][2] && p[i][1] != s0){score += equal_int(p[i][1]);p[i][1] = equal_str(p[i][1]);p[i][2] = p[i][3];}}else if (p[i][1] == p[i][2] && p[i][1] != s0){score += equal_int(p[i][1]);p[i][1] = equal_str(p[i][1]);p[i][2] = p[i][3];p[i][3] = s0;}else if (p[i][2] == p[i][3] && p[i][2] != s0){score += equal_int(p[i][2]);p[i][2] = equal_str(p[i][2]);p[i][3] = s0;}}break;case 4: // rightfor (int i = 0; i != 4; i++){if (p[i][3] == s0){p[i][3] = p[i][2];p[i][2] = p[i][1];p[i][1] = p[i][0];p[i][0] = s0;}if (p[i][3] == s0){p[i][3] = p[i][2];p[i][2] = p[i][1];p[i][1] = s0;}if (p[i][3] == s0){p[i][3] = p[i][2];p[i][2] = s0;}if (p[i][2] == s0){p[i][2] = p[i][1];p[i][1] = p[i][0];p[i][0] = s0;}if (p[i][2] == s0){p[i][2] = p[i][1];p[i][1] = s0;}if (p[i][1] == s0){p[i][1] = p[i][0];p[i][0] = s0;}}for (int i = 0; i != 4; i++){if (p[i][3] == p[i][2] && p[i][3] != s0){score += equal_int(p[i][3]);p[i][3] = equal_str(p[i][3]);p[i][2] = p[i][1];p[i][1] = p[i][0];p[i][0] = s0;if (p[i][2] == p[i][1] && p[i][2] != s0){score += equal_int(p[i][2]);p[i][2] = equal_str(p[i][2]);p[i][1] = p[i][0];}}else if (p[i][2] == p[i][1] && p[i][2] != s0){score += equal_int(p[i][2]);p[i][2] = equal_str(p[i][2]);p[i][1] = p[i][0];p[i][0] = s0;}else if (p[i][1] == p[i][0] && p[i][1] != s0){score += equal_int(p[i][1]);p[i][1] = equal_str(p[i][1]);p[i][0] = s0;}}break;case 1: // upfor (int i = 0; i != 4; i++){if (p[0][i] == s0){p[0][i] = p[1][i];p[1][i] = p[2][i];p[2][i] = p[3][i];p[3][i] = s0;}if (p[0][i] == s0){p[0][i] = p[1][i];p[1][i] = p[2][i];p[2][i] = s0;}if (p[0][i] == s0){p[0][i] = p[1][i];p[1][i] = s0;}if (p[1][i] == s0){p[1][i] = p[2][i];p[2][i] = p[3][i];p[3][i] = s0;}if (p[1][i] == s0){p[1][i] = p[2][i];p[2][i] = s0;}if (p[2][i] == s0){p[2][i] = p[3][i];p[3][i] = s0;}}for (int i = 0; i != 4; i++){if (p[0][i] == p[1][i] && p[0][i] != s0){score += equal_int(p[0][i]);p[0][i] = equal_str(p[0][i]);p[1][i] = p[2][i];p[2][i] = p[3][i];p[3][i] = s0;if (p[1][i] == p[2][i] && p[1][i] != s0){score += equal_int(p[1][i]);p[1][i] = equal_str(p[1][i]);p[2][i] = p[3][i];}}else if (p[1][i] == p[2][i] && p[1][i] != s0){score += equal_int(p[1][i]);p[1][i] = equal_str(p[1][i]);p[2][i] = p[3][i];p[3][i] = s0;}else if (p[2][i] == p[3][i] && p[2][i] != s0){score += equal_int(p[2][i]);p[2][i] = equal_str(p[2][i]);p[3][i] = s0;}}break;case 2: // downfor (int i = 0; i != 4; i++){if (p[3][i] == s0){p[3][i] = p[2][i];p[2][i] = p[1][i];p[1][i] = p[0][i];p[0][i] = s0;}if (p[3][i] == s0){p[3][i] = p[2][i];p[2][i] = p[1][i];p[1][i] = s0;}if (p[3][i] == s0){p[3][i] = p[2][i];p[2][i] = s0;}if (p[2][i] == s0){p[2][i] = p[1][i];p[1][i] = p[0][i];p[0][i] = s0;}if (p[2][i] == s0){p[2][i] = p[1][i];p[1][i] = s0;}if (p[1][i] == s0){p[1][i] = p[0][i];p[0][i] = s0;}}for (int i = 0; i != 4; i++){if (p[3][i] == p[2][i] && p[3][i] != s0){score += equal_int(p[3][i]);p[3][i] = equal_str(p[3][i]);p[2][i] = p[1][i];p[1][i] = p[0][i];p[0][i] = s0;if (p[2][i] == p[1][i] && p[2][i] != s0){score += equal_int(p[2][i]);p[2][i] = equal_str(p[2][i]);p[1][i] = p[0][i];}}else if (p[2][i] == p[1][i] && p[2][i] != s0){score += equal_int(p[2][i]);p[2][i] = equal_str(p[2][i]);p[1][i] = p[0][i];p[0][i] = s0;}else if (p[1][i] == p[0][i] && p[1][i] != s0){score += equal_int(p[1][i]);p[1][i] = equal_str(p[1][i]);p[0][i] = s0;}}break;default:break;}
}void input()
{char c1 = _getch();char c2 = _getch();switch (c2){case 72: // upchange(1);break;case 80: // downchange(2);break;case 75: // leftchange(3);break;case 77: // rightchange(4);break;default:break;}
}void random_n(vector<vector<string>> q, unsigned n)
{vector<unsigned> xx, yy;char c = 'A';for (int i = 0; i != 4; i++){for (int j = 0; j != 4; j++)if (q[i][j] == s0){q[i][j] = "";(q[i][j]).push_back(c);xx.push_back(i);yy.push_back(j);++c; // move to next character}}if (c == 'A') stop = 1; // indicate the end of the gameelse{srand((unsigned)time(NULL));int ran = rand() % (c - 'A'); // generate a random numberstring random_number = (n % 7 == 6) ? s4 : s2;p[xx[ran]][yy[ran]] = random_number;}
}void print()
{std::cout << "+----+----+----+----+" << endl;for (int i = 0; i != 4; i++){for (int j = 0; j != 4; j++)std::cout << "|" << p[i][j];std::cout << "|\n+----+----+----+----+" << endl;}
}int main()
{HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(hOut, &cci);cci.bVisible = FALSE;SetConsoleCursorInfo(hOut, &cci);// The five lines above are used to hide the Console Cursor.    std::cout << "This is a simple 2048 game.\nProgrammer:Teddy van Jerry" << endl;std::cout << "\nYou can use ↑,↓,←,→ to control." << endl;std::cout << "\nNow you have 3 seconds to get ready. After that, we will begin.\n" << endl;for (int i = 3; i != 0; i--){std::cout << i;Sleep(1000); // wait for a second;std::cout << " ";}std::cout << "Go!\n" << endl;long time_start = clock(); // the starting pointunsigned cnt = 0;print();while (stop == 0) // when it's unfinshed{input();random_n(p, cnt);print();std::cout << "Your current score is " << score << "." << endl;std::cout << "\n" << endl;++cnt;}long total_time = clock() - time_start;int min = total_time / 60000;int second = (total_time % 60000) / 1000;string zero = (second < 10) ? "0" : "";std::cout << "The game is over." << endl;std::cout << "Your final score is " << score << "." << endl;std::cout << "The total time is " << min << "'" << zero << second << "\"." << endl;std::cout << "\nALL RIGHTS RESERVED (c) 2020 Teddy van Jerry" << endl;char anything;std::cin >> anything;return 0;
}//Copyright :2020 Teddy van Jerry

输出示例

分析

  • 有没有觉得这样的表格不那么好看?那么浏览我的博客 【C++ 程序】 九九乘法表来自己修改一下吧。
  • 这个就是分类讨论细致些,比如巨长的change(int n)的讨论。一个 subscript 写错就有可能造成 bug。每一个方向分别两步走:1. 先将空位取消,移动到一端。 2.再判断相邻连个是否相等,在进行输出(此处我又写了2个function)和加分。
  • 胜负判断为随机的一个数无法加上去(即没有空位,全部填满)。
  • 其他与之前的几个类似,分析见 贪吃蛇游戏移动迷宫游戏
  • 修改说明(2020.09.08)
    程序经试验(同学玩的时候发现的)发现存在bug,如下图:

    于是回到程序中寻找,发现169,170,307,308行有错误。
    下面改好又试验了以下:
    (就是输出示例的图)
    为了保险起见,决定做一下计算。

    先不考虑自动生成4的情况,此时每个数字对应得分是可以算出来的,然后这样算出的数字减去程序中算出的总分,可求出大致的操作数为245(因为每7次生成一次4),这是差不多的。因而程序基本上不存在bug了。

ALL RIGHTS RESERVED © 2020 Teddy van Jerry
欢迎转载,转载请注明出处。


See also

Teddy van Jerry 的导航页
【C++ 程序】 井字棋游戏(人 VS 人)
【C++ 程序】 井字棋游戏(人 VS Lv1电脑)
【C++ 程序】 井字棋游戏(人 VS Lv2电脑)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)
【C++ 程序】 五子棋游戏(人 VS 人)
【C++ 程序】 随机数
【C++ 程序】 贪吃蛇游戏
【C++ 程序】 移动迷宫游戏
【C++ 程序】 数字推盘游戏(15-puzzle)
【C++ 程序】 井字棋游戏(人 VS 人)(EasyX 图形界面)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)
【C++ 程序】 2048游戏(EasyX 图形界面)
【C++ 程序】 贪吃蛇游戏(EasyX 图形界面)
【C++ 程序】 井字棋游戏(人 VS 人)(EasyX 图形界面)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)
【C++ 程序】 2048游戏(EasyX 图形界面)
【C++ 程序】 贪吃蛇游戏(EasyX 图形界面)

【C++ 程序】 2048游戏相关推荐

  1. 2048游戏-AI程序算法分析

    针对目前火爆的2048游戏,有人实现了一个AI程序,可以以较大概率(高于90%)赢得游戏,并且作者在stackoverflow上简要介绍了AI的算法框架和实现思路.但是这个回答主要集中在启发函数的选取 ...

  2. linux上安装游戏程序,分享|如何在 Linux 中安装 2048 游戏

    流行的移动益智游戏 2048 也可以在 Ubuntu 和 Linux 发行版上玩.啊!你甚至可以在 Linux 终端上玩 2048.如果你的生产率因为这个让人上瘾的游戏下降,请不要怪我. 早在 201 ...

  3. 2048游戏小程序案例

    项目描述: 2048游戏微信小程序源码,适合新手学习. 开发语言: WXML .WXSS 技术框架: 无 开发工具: 微信开发者工具 数据库: 无 相关资料: 无 项目截图: 代码在公众号:师哥帮忙 ...

  4. 200 行代码实现 2048 游戏

    创建游戏文件 2048.py 首先导入需要的包: import curses from random import randrange, choice from collections import ...

  5. 使用python开发网页游戏_不敢想!不敢想!我用Python自动玩转2048游戏

    近来在折腾selenium自动化, 感觉配合爬虫很有意思, 大多数以前难以模拟登录的网站都可以爬了,折腾了这么久,于是想自动玩个2048游戏!嘿嘿, 我是一个不擅长玩游戏的人, 以前玩2048就经常得 ...

  6. 花了一个深夜,才用C语言写了一个2048游戏雏形

    12年我毕业的第二个月工资,我就买了一个IPAD,然后在IPAD上下了一个2048游戏,玩起来非常爽. 然后这几天看到好几个公众号都发了自己写这个游戏的代码,然后我自己也想试试,所以就有了这篇文章,写 ...

  7. 2048游戏代码python_200 行代码实现简易版 2048 游戏 (python)

    当然这一篇需要你有一定的python基础?如果你没有python基础不要着急,你可以先去找一些python的基础教程去了解了解学习学习这门短小精悍的语言. 好了,说了那么说没用的话,现在正式开始 创建 ...

  8. python200行代码小游戏_200 行python 代码实现 2048 游戏

    创建游戏文件 2048.py 首先导入需要的包: import curses from random import randrange, choice from collections import ...

  9. 【C++】2048游戏系列---优化模块第一稿【加载图片】

    [C++]2048游戏系列---优化模块第一稿[加载图片] (更新中--) 参考博客: https://blog.csdn.net/qq_39151563/article/details/104283 ...

最新文章

  1. 用友云平台,真正的云原生架构,加速云应用落地
  2. 项目管理利器taiga快速安装
  3. [世界杯]世界杯的哲学思想
  4. Spring Boot 异步请求和异步调用,一文搞定!
  5. ospf hello时间和dead_使用OSPF协议使SPOKE端正常通信
  6. 北京招聘 | 澜舟科技招聘NLP工程师、NLP研究员、产品项目经理
  7. 女人口口相传的快乐和语气
  8. Python笔记(十五)_异常处理
  9. mysql换成oracle_从mysql转换到oracle数据库
  10. java spring eventbus_spring集成guava的event bus
  11. Java加密与解密的艺术~数字证书~模型分析
  12. java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)
  13. 算法篇【枚举2 -- 生理周期】
  14. 定了!华为“最强5G旗舰手机”正式官宣:3月26日见
  15. Flask实现发送邮件功能
  16. python字符串补空格输出_python实现指定字符串补全空格、前面填充0的方法
  17. 所谓的开发是java还是PLC_SCL是否将成为PLC的主流编程语言?
  18. PN序列的产生以及相关函数的计算
  19. FPGA零基础学习之旅#1 AC620V2开发板测试
  20. 【报表福利大放送】100余套报表模板免费下

热门文章

  1. 计算机应用教程第9,计算机应用教程
  2. Python + Excel——飞速处理数据分析与处理
  3. 如何进行自动化测试?提高测试效率,缩短开发周期。
  4. OpenStack Train Magnum部署Kubernetes(2)--使用OpenStack界面部署虚拟机
  5. 2022年起重机司机(限桥式起重机)考试题模拟考试题库及模拟考试
  6. C/C++动态申请空间
  7. chrome浏览器收藏夹小技巧
  8. 【CPA | 会计】【课程笔记】07 长期股权投资与合营安排(一)
  9. opencv检测乒乓球
  10. Android--数字签名和数字证书