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

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

也是比较简单的程序,基于我的博客 【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 

输出示例

1
2
3
(我水平很差,花了这么长时间才复原)






素材

  • 0.jpg – 15.jpg(略)
    (这个可以自己设计)

  • Board.jpg
    Board

  • Cover.jpg
    Cover

  • Fail.jpg
    Fail

  • Go.jpg

Go

  • Instruction,jpg
    Instruction

  • Over.jpg

Over

  • Ready.jpg
    Ready

  • Welcome.jpg
    Welcome

分析

  • 263行在原基础上增加if判断以使秒数不停变化。这个可以自己揣摩一下其中的意味。
  • 对于unsigned的减法也要小心,比如254行。
  • 注意108-109行的声明,否则init(unsigned long t0)就会用到未定义的函数。
  • 其他详见我的博客 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)。

See also

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217719.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:55
下一篇 2026年3月18日 上午8:55


相关推荐

  • tomcat部署war包访问显示404

    tomcat部署war包访问显示404在eclipse导出的maven项目war包,放到tomcat下启动,顺利启动且无报错,但是浏览器访问该项目时显示404原因:未在server.xml中配置这几个项目,导致服务器查找不到解决方法:&lt;HostappBase="webapps"autoDeploy="true"name="localhost"unpackWARs="true"&gt;…

    2022年6月10日
    220
  • ios分发平台搭建_app分发下载

    ios分发平台搭建_app分发下载iOS的内侧包管理,内部分发,或者企业包的分发和Android略有不同,需要通过manifest文件以及Safari内置命令来触发安装。

    2025年5月26日
    5
  • Java instanceof用法详解

    Java instanceof用法详解instanceof 是 Java 的保留关键字 它的作用是测试它左边的对象是否是它右边的类的实例 返回 boolean 的数据类型 instanceofin 是 Java 中的二元运算符 左边是对象 右边是类 当对象是右边类或子类所创建对象时 返回 true 否则 返回 false 这里说明下 类的实例包含本身的实例 以及所有直接或间接子类的实例 instance

    2026年3月20日
    2
  • git拉取远程分支并创建本地分支

    git拉取远程分支并创建本地分支一 查看远程分支使用如下 git 命令查看所有远程分支 gitbranch r 二 拉取远程分支并创建本地分支方法一使用如下命令 gitcheckout b 本地分支名 xorigin 远程分支名 x 使用该方式会在本地新建分支 x 并自动切换到该本地分支 x 方式二使用如下命令 gitfetchorig 远程分支名 x 本地分支名 x 使用该方式会在本地新建分支 x 但是不会自动切换到该本地分支 x 需要

    2026年3月16日
    1
  • JS数组遍历的6种方法

    JS数组遍历的6种方法1 for 遍历数组 1 1for 的普通遍历 varname Peter Stark Jack for 循环 for vari 0 i

    2026年3月26日
    2
  • spring 整合 mybatis原理

    spring 整合 mybatis原理SqlSessionFactoryBean的创建1.SqlSessionFactoryBean这个类实现了三个接口,一个是InitializingBean,另一个是FactoryBean,还有就是ApplicationListener接口。下面说明一下实现了这三个接口的,有什么作用InitializingBean接口:实现了这个接口,那么当bean初始化的时候,spring就会调用该接口的实现…

    2022年6月3日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号