【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)

发布时间:2025-12-09 20:37:12 浏览次数:4

也是比较简单的程序,基于我的博客 【C++ 程序】 数字推盘游戏(15-puzzle)的逻辑,运用我的博客 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)的EasyX使用技巧完成此程序。

程序

//This is a simple 15-puzzle game.#include <iostream>#include <vector>#include <Windows.h>#include <string>#include <random>#include <ctime>#include <conio.h>#include <graphics.h>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 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, char c2){c1 = _getch();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>>, unsigned long); // declarationvoid print_time(unsigned long); // declarationvoid 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 secondsloadimage(&iGo, _T("Go.jpg"), 320, 100);putimage(780, 500, &iGo);Sleep(500); // 0.5 secondloadimage(&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 coloursettextstyle(120, 50, _T("Times New Roman")); // set the sytlesettextcolor(BLUE); // set the colourTCHAR 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 firstouttextxy(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 pointinit(time_start);unsigned cnt = 0;while (p != p0) // when it's unfinshed{if (clock() - time_start > (3600000 + 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, inputprint(p, time_start);++cnt;}}loadimage(&iOver, _T("Over.jpg"), 320, 100);putimage(780, 500, &iOver);end: // a labelgetchar();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

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477