也是比较简单的程序,基于我的博客 【C++ 程序】 数字推盘游戏(15-puzzle)的逻辑,运用我的博客 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)的EasyX使用技巧完成此程序。
程序
//This is a simple 15-puzzle game. #include
#include
#include
#include
#include
#include
#include
#include
using namespace std; IMAGE i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, iGo, iFail, iOver, iCover, iReady; int sx = 3, sy = 3; // int connot be replaced by unsigned vector<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 state void change(int n) {
switch (n) {
case 1: // up if (sx + 1 <= 3) {
p[sx][sy] = p[sx + 1][sy]; p[sx + 1][sy] = ' '; ++sx; } break; case 2: // down if (sx - 1 >= 0) {
p[sx][sy] = p[sx - 1][sy]; p[sx - 1][sy] = ' '; --sx; } break; case 3: // left if (sy + 1 <= 3) {
p[sx][sy] = p[sx][sy + 1]; p[sx][sy + 1] = ' '; ++sy; } break; case 4: // right if (sy - 1 >= 0) {
p[sx][sy] = p[sx][sy - 1]; p[sx][sy - 1] = ' '; --sy; } break; default: break; } } void input(char c1, char c2) {
c1 = _getch(); c2 = _getch(); switch (c2) {
case 72: // up change(1); break; case 80: // down change(2); break; case 75: // left change(3); break; case 77: // right change(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 199 for (int i = ran; i != ran + 200; i++) // make 200 moves change(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>>, unsigned long); // declaration void print_time(unsigned long); // declaration void init(unsigned long t0) {
initgraph(1200, 800); loadimage(0, _T("Welcome.jpg"), 1200, 800); Sleep(3000); loadimage(0, _T("Instruction.jpg"), 1200, 800); Sleep(3000); loadimage(0, _T("Board.jpg"), 1200, 800); loadimage(&iReady, _T("Ready.jpg"), 320, 100); putimage(780, 500, &iReady); print(p, t0); Sleep(4500); // 4.5 seconds loadimage(&iGo, _T("Go.jpg"), 320, 100); putimage(780, 500, &iGo); Sleep(500); // 0.5 second loadimage(&iCover, _T("Cover.jpg"), 320, 100); putimage(780, 500, &iCover); } void print1(size_t i, size_t j) {
if (p[i][j] == ' ') {
loadimage(&i0, _T("0.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i0); } else if (p[i][j] == '1') {
loadimage(&i1, _T("1.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i1); } else if (p[i][j] == '2') {
loadimage(&i2, _T("2.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i2); } else if (p[i][j] == '3') {
loadimage(&i3, _T("3.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i3); } else if (p[i][j] == '4') {
loadimage(&i4, _T("4.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i4); } else if (p[i][j] == '5') {
loadimage(&i5, _T("5.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i5); } else if (p[i][j] == '6') {
loadimage(&i6, _T("6.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i6); } else if (p[i][j] == '7') {
loadimage(&i7, _T("7.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i7); } else if (p[i][j] == '8') {
loadimage(&i8, _T("8.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i8); } else if (p[i][j] == '9') {
loadimage(&i9, _T("9.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i9); } else if (p[i][j] == 'A') {
loadimage(&i10, _T("10.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i10); } else if (p[i][j] == 'B') {
loadimage(&i11, _T("11.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i11); } else if (p[i][j] == 'C') {
loadimage(&i12, _T("12.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i12); } else if (p[i][j] == 'D') {
loadimage(&i13, _T("13.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i13); } else if (p[i][j] == 'E') {
loadimage(&i14, _T("14.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i14); } else if (p[i][j] == 'F') {
loadimage(&i15, _T("15.jpg"), 150, 150); putimage(50 + 155 * j, 130 + 155 * i, &i15); } } void print_time(unsigned long t0) {
if (clock() - t0 > 10000) {
unsigned long total_time = clock() - t0 - 10000; // it's is dangerous, so be careful(it's unsigned) setbkcolor(RGB(253, 236, 166)); // set the background colour settextstyle(120, 50, _T("Times New Roman")); // set the sytle settextcolor(BLUE); // set the colour TCHAR s01[5], s02[5], s03[5], s04[5]; swprintf_s(s01, _T("%d"), total_time / 1000 % 60 % 10); swprintf_s(s02, _T("%d"), total_time / 1000 % 60 / 10); swprintf_s(s03, _T("%d"), total_time / 1000 / 60 % 10); swprintf_s(s04, _T("%d"), total_time / 1000 / 60 / 10); // change into string first outtextxy(778, 300, s04); outtextxy(842, 300, s03); outtextxy(906, 300, _T('\'')); outtextxy(940, 300, s02); outtextxy(1004, 300, s01); outtextxy(1068, 300, _T('\"')); // print } } void print(vector<vector<char>> q, unsigned long t) {
for (int i = 0; i != 4; i++) {
for (int j = 0; j != 4; j++) print1(i, j); // print a single one } print_time(t); } int main() {
random_start(); long time_start = clock(); // the starting point init(time_start); unsigned cnt = 0; while (p != p0) // when it's unfinshed {
if (clock() - time_start > ( + 10000)) // longer than an hour, FAIL {
loadimage(&iFail, _T("Fail.jpg"), 320, 100); putimage(780, 500, &iFail); goto end; // the program ends here } else {
char a1 = '\0', a2 = '\0'; if (_kbhit()) input(a1, a2); // if there is a click on the keyboard, input print(p, time_start); ++cnt; } } loadimage(&iOver, _T("Over.jpg"), 320, 100); putimage(780, 500, &iOver); end: // a label getchar(); return 0; } //Copyright :2020 Teddy van Jerry
输出示例



(我水平很差,花了这么长时间才复原)
素材
- 0.jpg – 15.jpg(略)
(这个可以自己设计)
- Board.jpg

- Cover.jpg

- Fail.jpg

- Go.jpg

- Instruction,jpg

- Over.jpg

- Ready.jpg

- Welcome.jpg

分析
- 263行在原基础上增加
if判断以使秒数不停变化。这个可以自己揣摩一下其中的意味。 - 对于
unsigned的减法也要小心,比如254行。 - 注意108-109行的声明,否则
init(unsigned long t0)就会用到未定义的函数。 - 其他详见我的博客 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)。
See also
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217719.html原文链接:https://javaforall.net
