【C++ 程序】 数字推盘游戏(15-puzzle)
这个游戏我认为是很考验思维含量的,毕竟登上了最强大脑的舞台。
然而写这个程序也累(主要有一个大bug没找出来,详见后面的分析)。
EasyX 图形界面版:【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)
程序
//This is a simple 15-puzzle game.#include <iostream>
#include <vector>
#include <Windows.h>
#include <string>
#include <random>
#include <ctime>
#include <conio.h>
using namespace std;int sx = 3, sy = 3; // int connot be replaced by unsignedvector<vector<char>> p = {{'1','2','3','4'},{'5','6','7','8'},{'9','A','B','C'},{'D','E','F',' '}};vector<vector<char>> p0 = p; // the finished statevoid change(int n)
{switch (n){case 1: // upif (sx + 1 <= 3){p[sx][sy] = p[sx + 1][sy];p[sx + 1][sy] = ' ';++sx;}break;case 2: // downif (sx - 1 >= 0){p[sx][sy] = p[sx - 1][sy];p[sx - 1][sy] = ' ';--sx;}break;case 3: // leftif (sy + 1 <= 3){p[sx][sy] = p[sx][sy + 1];p[sx][sy + 1] = ' ';++sy;}break;case 4: // rightif (sy - 1 >= 0){p[sx][sy] = p[sx][sy - 1];p[sx][sy - 1] = ' ';--sy;}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_start() // create a random plate
{ default_random_engine random;vector<int> ivec;for (int i = 0; i != 400; i++)ivec.push_back(random() % 4 + 1);srand((unsigned)time(NULL));int ran = rand() % 200; // generate a random number ranging from 0 to 199for (int i = ran; i != ran + 200; i++) // make 200 moveschange(ivec[i]);if (sx == 0) change(1);if (sx == 1) change(1);if (sx == 2) change(1);if (sy == 0) change(3);if (sy == 1) change(3);if (sy == 2) change(3); // move the empty place to p[3][3]
}void print(vector<vector<char>> q)
{for (int i = 0; i != 4; i++){for (int j = 0; j != 4; j++)cout << "|" << q[i][j];cout << "|" << 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. cout << "This is a simple 15-puzzle game.\nProgrammer:Teddy van Jerry" << endl;random_start();cout << "\nYou can move the number ranging from 1 to F using ↑,↓,←,→.\n" << endl;print(p);cout << "\nNow you have 10 seconds to get ready. After that, we will begin.\n" << endl;for (int i = 10; i != 0; i--){cout << i;Sleep(1000); // wait for a second;cout << " ";}cout << "Go!\n" << endl;long time_start = clock(); // the starting pointunsigned cnt = 0;while (p != p0) // when it's unfinshed{input();print(p);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" : "";cout << "You made it!" << endl;cout << "You made " << cnt << " moves. ";cout << "The total time is " << min << "'" << zero << second << "\"." << endl;cout << "\nALL RIGHTS RESERVED (c) 2020 Teddy van Jerry" << endl;char anything;cin >> anything;return 0;
}//Copyright :2020 Teddy van Jerry
输出示例
分析
- 首先说最令人头疼的bug!一直是以下错误:
然后发现问题就在move()
函数中,好久之后发现move()
是overloaded,改成change()
还是错的,又搞了好久好久(一共已经两个多小时了),考虑了各种各样的情况,重看了不知道多少遍,最终忽然发现一切都是unsigned
造成的。虽然空位的坐标不可能为负,但是在change()
函数中判断是否为合法输入时有-1
的操作,(事实上移到右边就对了)因为unsigned
在0
时-1
就会翻上去一轮,就是很大很大的值,判断一定成立,因而就会有vector subscript out of range
。
- 注意151行输出
"
要用转义字符\
。 - 其他的类似于贪吃蛇游戏中问题,可以举一反三。
- 编写注意:随机生成初始状态时注意 n-puzzle 问题的无解情况,即要求逆序对数必须为偶数(数学证明详见我的博客 【离散数学】 MIT 6.042J 笔记 - Lecture 3 Strong Induction)。所以这个程序中的随机生成采用了移动的方式,是肯定有解的。
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++ 程序】 2048游戏
【C++ 程序】 井字棋游戏(人 VS 人)(EasyX 图形界面)
【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)
【C++ 程序】 2048游戏(EasyX 图形界面)
【C++ 程序】 贪吃蛇游戏(EasyX 图形界面)
问一下有没有发现bug的图有些异样?这其实是 Snake Game 里的,但被我用 3D Paint 给改过了。
【C++ 程序】 数字推盘游戏(15-puzzle)相关推荐
- 【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)
也是比较简单的程序,基于我的博客 [C++ 程序] 数字推盘游戏(15-puzzle)的逻辑,运用我的博客 [C++ 程序] 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)的 ...
- python数字推盘游戏怎么显示步数_Python游戏开发:《最强大脑》同款游戏【数字华容道】...
今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...
- python数字推盘游戏怎么显示步数_Python游戏开发:数字华容道
今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...
- 数字推盘游戏java_最强大脑数字推盘游戏-最强大脑数字推盘游戏官方版 v1.0预约_手机乐园...
游戏简介 最强大脑数字推盘游戏是一款根据同名综艺节目的挑战项目改变制作的益智闯关游戏.游戏中玩家你要走的就是将各个数字合理的进行移动与组合,而且是要在规则的限制下进行移动,这样一来你就能组出对应的数字 ...
- 数字推盘游戏java_数字推盘游戏下载_数字推盘最强大脑app游戏下载最新版 v1.0-安族游戏网...
数字推盘游戏是一款让千万玩家们都为之沉迷的华容道数字解谜闯关类小游戏.在这个让人感受到真实互动的挑战模式之中,玩家们可以发挥自己的无限想象能力.空间推理能力以及你的聪明脑力开始你的数字挑战赛.简约清新 ...
- Python—数字推盘游戏设计
目标: 了解pygame模块的框架与基础函数: 熟悉MVC设计模式: 掌握自顶向下的程序设计方式. 内容: 完成数字推盘游戏设计 步骤: 代码如下: import pygame import time ...
- Python实现数字推盘游戏重排九宫8-puzzle
Python实现数字推盘游戏重排九宫8-puzzle 数字推盘游戏是一种经典的智力拼图游戏,玩家需要移动数字块,将它们按照正确的顺序排列.而8-puzzle就是数字推盘游戏中最经典的版本之一.本文将介 ...
- python:实现数字推盘游戏重排九宫8-puzzle(附完整源码)
python:实现数字推盘游戏重排九宫8-puzzle from collections import deque from copy import deepcopy from queue impor ...
- python 九宫重排_算法:数字推盘游戏--重排九宫(8-puzzle)
1 packagealgorithm;2 3 importjava.util.Comparator;4 importjava.util.PriorityQueue;5 6 /** 7 * 重排九宫,或 ...
最新文章
- Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
- PHP 使用 Memcached
- CodeVS 1081 线段树练习 2
- 译 | 你到底有多精通 C# ?
- datastage配置jdbc_DataStage 错误集(持续更新)
- DataNode逻辑结构
- CSS ::selection 选中文字效果
- matplotlib动态图和视频保存
- 如何通过Geth、Node.js和UNIX/PHP访问以太坊节点 1
- tbopen链接生成工具_愚人节必备工具,有了它们就是朋友圈最靓的仔
- 晶体三极管的输入特性和输出特性
- 锁定计算机和睡眠有什么区别,电脑休眠、睡眠、关机之间有什么区别?三者之间区别介绍...
- #344 – 通过CanExecute控制按钮是可用(The CommandBinding CanExecute Determines Whether a Button is Enabled)
- 求职招聘微信小程序源码下载v4.1.78 修复首页授权空白问题
- Human Pose Estimation with Spatial Contextual Information(CVPR2019)
- 粉象生活优惠券项目优势
- 前端小作业~大风车案例
- ieee 754四字节转浮点数c语言实现,IEEE-754标准浮点数,十六进制与十进制转换方法(附C代码)...
- QT读书笔记—绘图基础
- C语言获取数组左上,左下,右上,右下三角形的元素