推箱子设计报告书
推箱子问题的设计与实现
![推箱子问题的设计与实现](https://img.taocdn.com/s3/m/d67c798b83d049649b66587e.png)
《推箱子问题的设计与实现》实验报告班级:计本四班学号:2012020386 姓名:刘宝同一、问题描述码头仓库是划分为n×m个格子的矩形阵列。
有公共边的格子是相邻格子。
当前仓库中有的格子是空闲的;有的格子则已经堆放了沉重的货物。
由于堆放的货物很重,单凭仓库管理员的力量是无法移动的。
仓库管理员有一项任务,要将一个小箱子推到指定的格子上去。
管理员可以在仓库中移动,但不能跨过已经堆放了货物的格子。
管理员站在与箱子相对的空闲格子上时,可以做一次推动,把箱子推到另一相邻的空闲格子。
推箱时只能向管理员的对面方向推。
由于要推动的箱子很重,仓库管理员想尽量减少推箱子的次数。
二、问题求解分析对于给定的仓库布局,以及仓库管理员在仓库中的位置和箱子的开始位置和目标位置,设计一个解推箱子问题的分支限界法,计算出仓库管理员将箱子从开始位置推到目标位置所需的最少推动次数。
数据输入:由文件input.txt 提供输入数据。
输入文件第1行有2个正整数n 和m (1<=n,m<=100),表示仓库是n×m个格子的矩形阵列。
接下来有n 行,每行有m个字符,表示格子的状态。
S 表示格子上放了不可移动的沉重货物;w 表示格子空闲;M 表示仓库管理员的初始位置;P 表示箱子的初始位置;K 表示箱子的目标位置。
结果输出:将计算出的最少推动次数输出到文件output.txt。
如果仓库管理员无法将箱子从开始位置推到目标位置则输出“No solution!”。
三、源程序关键代码#include <stdio.h>#include <stdlib.h>#include <conio.h>int map1(int a[9][10]);char move(char t,int map[9][10]){int i,j,x,y;system("CLS"); //清屏for(i=0;i<9;i++) // 查找当前人位置{for(j=0;j<10;j++)if(map[i][j]==4 || map[i][j]==6){x=i,y=j;};}switch(t){case '8':{ if(map[x-1][y]==1)//如果人面前时路{map[x-1][y]=4;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}else if(map[x-1][y]==3)//人面前是箱子{if(map[x-2][y]==2)// 人前箱子箱子前面是空位{map[x-1][y]=4;map[x-2][y]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}else if(map[x-2][y]==0 || map[x-2][y]==3 || map[x-2][y]==5)//人前是箱子箱子前面是墙箱子已在空位上的箱子{printf("\a");}else if(map[x-2][y]==1)// 人前是箱子箱子前面是路{map[x-1][y]=4;map[x-2][y]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};}elseif(map[x-1][y]==0) //人前是墙{printf("\a");}else if(map[x-1][y]==2){map[x-1][y]=6;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}else if(map[x-1][y]==5)//人前是已在空位的箱子{if(map[x-2][y]==2)//人前是已在空位是的箱子箱子前是一个空位{map[x-1][y]=6;map[x-2][y]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x-2][y]==0 || map[x-2][y]==3 || map[x-2][y]==5)//人前是已在空位是的箱子箱子前是墙箱子已在空位上的箱子{printf("\a");}elseif(map[x-2][y]==1)//人前是已在空位上的箱子箱子前是路{map[x-1][y]=6;map[x-2][y]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};};};break;case '6':{ if(map[x][y+1]==1)//如果人面前时路{map[x][y+1]=4;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y+1]==3)//人面前是箱子{if(map[x][y+2]==2)// 人前箱子箱子前面是空位{map[x][y+1]=4;map[x][y+2]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y+2]==0 || map[x][y+2]==3 || map[x][y+2]==5)//人前是箱子箱子前面是墙箱子已在空位上的箱子{printf("\a");}elseif(map[x][y+2]==1)// 人前是箱子箱子前面是路{map[x][y+1]=4;map[x][y+2]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};}elseif(map[x][y+1]==0) //人前是墙{printf("\a");}else if(map[x][y+1]==2){map[x][y+1]=6;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y+1]==5)//人前是已在空位的箱子{if(map[x][y+2]==2)//人前是已在空位是的箱子箱子前是一个空位{map[x][y+1]=6;map[x][y+2]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y+2]==0 || map[x][y+2]==3 || map[x][y+2]==5)//人前是已在空位是的箱子箱子前是墙箱子已在空位上的箱子{printf("\a");}elseif(map[x][y+2]==1)//人前是已在空位上的箱子箱子前是路{map[x][y+1]=6;map[x][y+2]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};};};break;case '2':{ if(map[x+1][y]==1)//如果人面前时路{map[x+1][y]=4;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x+1][y]==3)//人面前是箱子{if(map[x+2][y]==2)// 人前箱子箱子前面是空位{map[x+1][y]=4;map[x+2][y]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x+2][y]==0 || map[x+2][y]==3 || map[x+2][y]==5)//人前是箱子箱子前面是墙箱子已在空位上的箱子{printf("\a");}else if(map[x+2][y]==1)// 人前是箱子箱子前面是路{map[x+1][y]=4;map[x+2][y]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};}elseif(map[x+1][y]==0) //人前是墙{printf("\a");}else if(map[x+1][y]==2){map[x+1][y]=6;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x+1][y]==5)//人前是已在空位的箱子{if(map[x+2][y]==2)//人前是已在空位是的箱子箱子前是一个空位{map[x+1][y]=6;map[x+2][y]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x+2][y]==0 || map[x+2][y]==3 || map[x+2][y]==5)//人前是已在空位是的箱子箱子前是墙箱子已在空位上的箱子{printf("\a");}elseif(map[x+2][y]==1)//人前是已在空位上的箱子箱子前是路{map[x+1][y]=6;map[x+2][y]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};};};break;case '4':{ if(map[x][y-1]==1)//如果人面前时路{map[x][y-1]=4;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y-1]==3)//人面前是箱子{if(map[x][y-2]==2)// 人前箱子箱子前面是空位{map[x][y-1]=4;map[x][y-2]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y-2]==0 || map[x][y-2]==3 || map[x][y-2]==5)//人前是箱子箱子前面是墙箱子已在空位上的箱子{printf("\a");}elseif(map[x][y-2]==1)// 人前是箱子箱子前面是路{map[x][y-1]=4;map[x][y-2]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};}elseif(map[x][y-1]==0) //人前是墙{printf("\a");}else if(map[x][y-1]==2){map[x][y-1]=6;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}else if(map[x][y-1]==5)//人前是已在空位的箱子{if(map[x][y-2]==2)//人前是已在空位是的箱子箱子前是一个空位{map[x][y-1]=6;map[x][y-2]=5;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;}elseif(map[x][y-2]==0 || map[x][y-2]==3 || map[x][y-2]==5)//人前是已在空位是的箱子箱子前是墙箱子已在空位上的箱子{printf("\a");}elseif(map[x][y-2]==1)//人前是已在空位上的箱子箱子前是路{map[x][y-1]=6;map[x][y-2]=3;if(map[x][y]==4) map[x][y]=1;else map[x][y]=2;};};};break;}map1(map);return (map[9][10]);}int map1(int a[9][10]){int i,j;static int count=0;system("cls");printf("\n\n\t\t\t 欢迎选玩*【推箱子游戏】O(∩_∩)O~~~ \n\n\t\t\t\t\t 游戏规则:\n\t\t□:代表墙×:代表路○:代表空位\n\t\t ●:代表箱子♀:代表人※:代表箱子已在空位上\n\t\t\t\t\t 8:向上移动\n\t\t\t\t\t 2:向下移动\n\t\t\t\t\t 4:向左移动\n\t\t\t\t\t 6:向右移动\n\t\t\t\t\t") ;for(i=0;i<9;i++){printf("\n\t\t\t\t ");for(j=0;j<10;j++){switch(a[i][j]){case 0:printf("□");break;//"□"代表墙case 1:printf("×");break;//"×"代表路case 2:printf("○");break;//"○"代表空位case 3:printf("●");break;//"●"代表箱子case 4:printf("♀");break;//"♀"代表人case 5:printf("※");break;//"※"代表箱子已在空位上case 6:printf("♀");break;}}}printf("\n\t\t\t\t步数:%d",count++);printf("\n\t\t\t\t"); return (a[9][10]);}int main(){char c;int map[9][10]={{0,0,0,0,0,0,0,0,0,0},{0,0,0,1,1,2,1,0,0,0},{0,1,3,2,3,3,3,1,1,0},{0,1,0,1,0,2,1,0,1,0},{0,1,4,2,1,2,1,0,1,0},{0,0,0,0,1,3,1,1,1,0},{0,0,0,0,3,2,0,0,0,0},{0,0,0,0,1,1,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};system("color E9");map1(map);while(1){ c=getch();if(c=='8' || c=='6' || c=='2' || c=='4'){ move(c,map);}}}四、总结通过对推箱子游戏的编程和设计,进一步巩固了数据结构和算法设计与分析所学的知识,在查阅了有关推箱子游戏问题编程的相关知识的同时,也进一步了解了结构体之间的密切关系,并加深和巩固了函数调用的方法和技巧。
推箱子项目实训报告
![推箱子项目实训报告](https://img.taocdn.com/s3/m/ada02cb4b9f67c1cfad6195f312b3169a451eaf6.png)
一、项目背景推箱子游戏是一款经典的益智游戏,起源于日本。
玩家需要在狭小的仓库中,通过移动人物,将箱子推到指定的位置。
这款游戏不仅考验玩家的逻辑思维和空间想象力,还锻炼玩家的耐心和策略。
为了提高自身的编程能力,我们选择推箱子游戏作为实训项目。
二、实训目的1. 学习和掌握Java编程语言的基本语法和常用库;2. 熟悉图形用户界面(GUI)编程;3. 提高逻辑思维和编程能力;4. 实现一个具有良好用户体验的推箱子游戏。
三、项目设计1. 系统架构推箱子游戏采用MVC(模型-视图-控制器)架构,将游戏逻辑、界面展示和用户交互分离,提高代码的可读性和可维护性。
2. 关卡设计游戏共包含10个关卡,每个关卡都有不同的地图和目标。
关卡难度逐渐增加,以满足不同玩家的需求。
3. 游戏功能(1)基本功能1)地图展示:游戏开始时,展示当前关卡的地图,包括人物、箱子、目的地和墙壁;2)人物移动:玩家可以通过键盘或鼠标控制人物上下左右移动;3)箱子移动:当人物站在箱子旁边时,按空格键将箱子推到目标位置;4)胜利判断:所有箱子都推到目标位置,游戏胜利;5)失败判断:人物无法移动或通道被堵住,游戏失败。
(2)扩展功能1)悔棋功能:玩家可以撤销上一步操作,回到之前的状态;2)重置关卡:玩家可以重新开始当前关卡;3)关卡选择:玩家可以选择不同的关卡进行游戏;4)音乐和音效:游戏过程中,播放背景音乐和音效,增强游戏氛围。
四、关键技术1. Java编程语言:使用Java编程语言实现游戏逻辑、界面展示和用户交互;2. Swing库:使用Swing库实现图形用户界面;3. 图像处理:使用ImageIO类加载和显示游戏地图、人物、箱子等图片;4. 事件监听:使用ActionListener、KeyListener等监听器处理用户操作。
五、项目实现1. 创建项目:使用Eclipse创建Java项目,导入Swing库和ImageIO类;2. 设计界面:创建JFrame作为主窗口,添加JPanel作为游戏区域,添加JButton作为按钮控件;3. 游戏逻辑:定义游戏地图、人物、箱子等数据结构,实现人物移动、箱子移动、胜利判断和失败判断等功能;4. 图像处理:加载游戏地图、人物、箱子等图片,使用ImageIO类进行显示;5. 事件监听:为按钮控件添加ActionListener和KeyListener,处理用户操作。
推箱子游戏实践报告
![推箱子游戏实践报告](https://img.taocdn.com/s3/m/c7f9b10416fc700abb68fccf.png)
推箱子游戏设计实践报告一、游戏介绍在一定的范围里,要求人把木箱从开始位置推放到指定的位置。
由于箱子只能推不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
该游戏一共有三道关卡,按下F1和F2可以切换关卡,并且通过移动上下左右键来控制小人的移动,从而推动箱子。
当人把箱子全部推到指定的目的地时过关。
附图:二、设计思想程序关键的地方有两部分,一是加载地图,二是用方向键控人的移动。
画地图主要由两个函数来实现,首先用加载位图函数来画出单个图片,然后再用调用加载位图的函数来画出整体的地图。
用方向键控制人的移动时,要注意全面地考虑到各方面的问题,需要详细的分析各种情况。
三、游戏的部分实现(1)加载地图部分程序void drawmap(HWND hWnd,int map[][8])//画地图函数{ HDC hdc;hdc = GetDC(hWnd);RECT rt;GetClientRect(hWnd, &rt);for(int y=0; y<8; y++){ for(int x=0; x<8; x++){switch(mapIndex[y][x]){case 2:drawImage(hdc, "aim.bmp", x * 48,y* 48,48,48);break;case 1:drawImage(hdc,"ground.bmp", x * 48,y* 48,48,48);break;case 0:drawImage(hdc, "wall.bmp", x* 48,y* 48,48,48);break;case 4:drawImage(hdc, "man.bmp", x* 48,y* 48,48,48);break;case 6:case 3:drawImage(hdc, "box.bmp", x* 48,y* 48,48,48);break;}}}ReleaseDC(hWnd, hdc)}voiddrawImage( HDC hdc, char * fileName, int x, int y , int w, int h){HDC srcdc = CreateCompatibleDC(hdc);HBITMAP hbmp = (HBITMAP)LoadImage(NULL, fileName,IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);SelectObject(srcdc, hbmp);BitBlt(hdc, x,y, w,h, srcdc, 0,0, SRCCOPY );DeleteObject(hbmp);DeleteDC(srcdc);}(2)方向键移动部分程序voidkeydown_down(HWND hWnd){switch (mapIndex[humans.y+1][humans.x]){case 0:break;case 1:case 2:humans.y+=1;break;case 3://人的下面为箱子switch (mapIndex[humans.y+2][humans.x]){case 0:case 6:case 3:break;case 1:MoveResult();mapIndex[humans.y+2][humans.x]=3;mapIndex[humans.y+1][humans.x]=1;humans.y+=1;break;case 2:MoveResult();mapIndex[humans.y+2][humans.x]=6;mapIndex[humans.y+1][humans.x]=1;humans.y+=1;break;}break;case 6://箱子在目标上switch (mapIndex[humans.y+2][humans.x]){case 0:break;case 6:break;case 3:break;case 1:MoveResult();mapIndex[humans.y+2][humans.x]=3;mapIndex[humans.y+1][humans.x]=2;humans.y+=1;break;case 2:MoveResult();mapIndex[humans.y+2][humans.x]=6;mapIndex[humans.y+1][humans.x]=2;humans.y+=1;break;}break;}}voidMoveResult(){if(mapIndex[humans.y][humans.x]!=2) {mapIndex[humans.y][humans.x]=1;}else if(mapIndex[humans.y][humans.x]==2){mapIndex[humans.y][humans.x]=2;} }四、测试结果五、设计心得体会在设计这个程序中我主要学会了如何运用以下有关C语言的知识1)函数定义是要做到顾名思义是很重要的,它对读程序的人正确认识程序十分重要,在修改这个程序的过程中也能很快找到程序各模块的作用,大大增加了程序的可读性。
推箱子程序设计与报告.doc
![推箱子程序设计与报告.doc](https://img.taocdn.com/s3/m/f015fe09366baf1ffc4ffe4733687e21ae45ff5b.png)
推箱子程序设计与报告.doc推箱子是一款经典的益智游戏,我们本次设计的推箱子程序主要基于Java语言实现,通过使用IDEA开发环境以及JavaFX图形界面库,提供用户友好的交互界面,使得用户可以愉快地通过游戏锻炼自己的智力。
1. 总体设计推箱子需要先定义一些基本的数据结构,包括地图、箱子和人物。
对于地图而言,我们采用一个二维数组来表示,每个元素用数字来表示:0代表空位,1代表墙,2代表目的地。
对于箱子和人物的位置,我们同样采用二维数组表示。
其中0代表箱子或人物当前位置为空,1代表箱子或人物在该位置。
通过这三个数组,可以完整地表示游戏的基本状态。
2. 游戏规则游戏的基本规则如下:1)箱子、人物、目的地都是由矩形表示。
2)人物可以沿着地图上的通路走动,但不能与障碍物墙相交。
3)人物可以对着箱子推动箱子,但只能向前推,并且不能推到障碍物墙。
4)箱子只能单向推动,即只能向人物朝向的方向推动,并且只能顺着通路推动。
5)每一个箱子必须都推到一个目的地上,游戏才算成功过关。
3. 程序实现在代码实现上,我们采用Model-View-Controller架构,将游戏分为Model(模型)、View(视图)和Controller(控制器)三个部分。
Model主要处理游戏数据,包括游戏地图、箱子和人物的位置。
View则主要负责游戏界面的展示,包括游戏地图、箱子和人物的图形展示、以及用户交互界面的设计等。
Controller则主要负责调度Model和View之间的数据通信和相互交互。
4. 用户界面我们提供了以下用户交互界面:1)菜单:在菜单中,用户可以选择开始新游戏,或者退出程序。
2)选关界面:在选关界面中,用户可以选择所需的关卡。
3)游戏界面:在游戏界面中,实现了地图的显示、箱子和人物的移动、关卡完成情况的判断等功能。
5. 应用技术本次推箱子程序的开发采用了以下技术:1)Java语言编写2)JavaFX图形界面库3)MVC软件设计模式4)Git版本控制5)IntelliJ IDEA开发IDE6. 结论本次推箱子程序的开发成功实现了一款经典益智游戏的主要功能,同时也提供了用户友好的交互界面。
C++推箱子课程设计报告材料
![C++推箱子课程设计报告材料](https://img.taocdn.com/s3/m/645baa5daf1ffc4ffe47ac9f.png)
武汉理工大学华夏学院课程设计报告书课程名称:软件综合题目:基于VC++6.0的“推箱子”游戏软件的开发与测试系名:信息工程系专业班级:姓名:指导教师:2013 年元月 18日课程设计任务书学生姓名:专业班级:软件2101 指导教师:工作单位:信息系计算机教研室设计题目:基于VC++6.0的“推箱子”游戏软件的开发与测试初始条件:1.已完成c语言程序设计、软件工程、数据库概论或数据库技术等课程的学习2. 系统环境:Intel 奔腾4以上处理器,1G以上内存,40G以上硬盘,Windows编程环境,Visual C++ 6.0编程工具要求完成的主要任务:(在规定的时间内完成下列任务)(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)主要任务:系统完成用户登录及管理员增加、删除、修改、查询功能1.按系统功能进行游戏背景区域(移动区域、围墙)的设计与绘制:2.根据系统实现的功能,绘出功能图、系统流程图3.模块调试,运行结果正确,并经教师检查及答辩;设计报告撰写格式要求:(课程设计报告按统一通用格式书写)具体内容如下:①设计任务与要求②总体方案与说明③程序主要模块的流程图④问题分析与解决方案的设计思想和改进设想⑤系统的调试记录、调试报告(即在调试中遇到的主要问题、解决方法及改进设想)⑥小结与体会附录:①使用说明②参考资料时间安排:2012年12月29日---2013年元18日(共三周)指系主任签字:年月日目录1 引言 (1)2 项目需求分析 (1)3 系统概要设计 (1)3.1 功能控制模块 (1)3.2 系统流程图 (2)3.3 推箱子游戏具有的功能 (3)3.3.1 能够显示主菜单和界面 (3)3.3.2 能够实现键盘操作功能 (3)3.3.3 能够把放置到位置的箱子进行变色显示 (4)3.3.4 游戏胜负判断功能 (4)3.3.5 支持关口选择功能 (4)3.4 推箱子功能框架 (4)3.5 游戏界面设计 (5)3.5.1 游戏主界面 (5)3.5.2 游戏菜单与帮助结构设计 (5)3.5.3 游戏中关卡选择对话框设计 (6)3.6 游戏的界面实现 (6)3.7 关卡选择对话框的实现 (7)4 详细设计 (10)4.1 地图文件读取模块的设计与实现 (10)4.2 地图绘制模块的设计与实现 (10)4.3 键盘操作模块的设计与实现 (12)4.4 游戏规则模块设计与实现 (12)5 VC调试方法介绍 (14)5.1 调试快捷键 (14)5.2 跟踪调试 (14)5.3 异常调试 (15)6 功能测试 (17)6.1 主菜单和界面显示功能测试 (17)6.2 键盘操作功能测试 (17)6.3 箱子放置到指定位置时变色显示功能测试 (19)6.4 支持地图扩展功能的演示 (20)7 特殊问题及解决方法 (21)8 设计小结 (21)9 参考文献 (21)1引言最经典的推箱子游戏,类似的游戏你一定早就玩过。
推箱子游戏设计报告书
![推箱子游戏设计报告书](https://img.taocdn.com/s3/m/aa9ee336f111f18583d05a2c.png)
推箱子游戏设计报告书需求介绍:推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带这种游戏。
它既能锻炼思维的严密性,又有很多乐趣。
本设计将用C语言实现一个简单的推箱子游戏,旨在阐述推箱子游戏的实现方法。
设计目的:本设计旨在训练开发者的基本编程技巧,其中涉及软中断、二维数组、键盘操作及图形化函数等方面的知识。
通过本设计的训练,开发者能基本掌握显示器中断寄存器的设置、二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示和定位,以及部分图形函数的使用。
功能描述:本游戏共有4关,由易到难,每一关都有初始化、按键处理、重置及退出功能。
(1)初始化包括屏幕初始化和每一关关卡的初始化,屏幕被初始化宽80列,高25行。
(2)按键处理包括移动小人和移动箱子,通过移动上下左右键控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为通关。
(3)每一关都可以重置,按空格键可以重置当前关。
(4)按ESC键可以在任何时候退出游戏。
总体设计:1.功能模块设计(1)系统模块图本设计包括5个模块,分别是初始化模块、图画模块、移动箱子模块、移动小人模块和功能控制模块,如图1所示。
各个模块的功能描述如下。
1)初始化模块该模块包括屏幕初始化和游戏每一关的初始化。
屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
2)图画模块。
该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
3)移动箱子模块该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
4)移动小人模块该模块用于控制小人移动,从而推动箱子到目的地。
5)功能控制模块该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
图1 系统模块图(2)任务执行流程图游戏从第一任务开始(第一关),按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。
推箱子C课程设计报告
![推箱子C课程设计报告](https://img.taocdn.com/s3/m/d0943a87eefdc8d377ee3266.png)
程序设计课程设计报告书学生:孟祥煜指导老师: 曾宇容课程设计名称:推箱子小游戏班级: 软件11401一、设计任务介绍推箱子游戏得实现方法,并逐步介绍C语言图形编程得方法与技巧。
在C语言编写软件WIN-TC上,涉及软中断、二维数组、键盘操作及图形化函数等方法,显示器中断寄存器得设置、二维数组得定义、键盘上键值得获取、图形方式下光标得显示与定位,以及部分图形函数得使用实现了一个完整得推箱子游戏界面,界面清晰可见。
二、设计目得训练学生掌握C得数据结构与综合编程能力与游戏开发技巧等应用能力。
初步设想推箱子就是一款经典得益智小游戏,目得就是在训练人得逻辑思考能力。
在一个狭小得空间中,要求把木箱从起始位置处推放到指定位置。
在空间中有地方限制,稍不小心就会出现箱子无法移动或者通道被堵住得情况,而且箱子只能推不能拉,所以需要玩家巧妙得利用有限得空间与通道,合理得移动次序与位置,才能完成任务。
本游戏一共分14关,由易到难,每一关都随着关数得增加来增加难度,从而达到吸引游戏玩家得目得。
三功能1、菜单功能,玩家通过瞧目录按对应得键可以进入对应得功能菜单,其中1进入游戏,2选择游戏关卡,3游戏帮助指南 ,4退出游戏。
2 游戏功能: 玩家可以通过操纵键盘中得上下左右键进入游戏进行各种操作来完成游戏。
3 循环功能:当玩家正在游戏得时候如果某一步走错了,导致游戏无法完成,可以随时重新开始游戏来完成关卡,游戏过程中可以随时按Ctrl+V退出游戏。
4 顺序功能:当玩家完成了某一关之后,随着进入下一关门可以按顺序进入下一关,继续开始更有挑战得关卡,如果该关就是最后一关,则显示通关完成。
三、总体设计1、功能模块设计函数功能描述本程序包括5个模块,分别就是初始化模块、画图模块、移动箱子模块、移动小人模块与功能控制模块。
各个模块功能得功能描述如下:(1)初始化模块。
该模块包括屏幕初始化与游戏第一关到第最后一关得初始化。
屏幕初始化用于输出欢迎信息与操作提示,游戏每一关得初始化就是构建每一关得关卡。
推箱子实验报告
![推箱子实验报告](https://img.taocdn.com/s3/m/d7757a2f1fd9ad51f01dc281e53a580216fc50dd.png)
引言概述推箱子是一种常见的游戏,也是计算机算法和研究中的经典问题,它涉及的算法和方法有助于提高问题解决能力和逻辑思维能力。
本文将对推箱子实验进行详细分析和讨论,包括推箱子游戏的定义、规则和目标,以及解决推箱子难题的算法和策略。
正文内容1.推箱子游戏的定义、规则和目标1.1定义:推箱子是一种益智类游戏,玩家需要将箱子推到指定位置,才能过关。
1.2规则:玩家通过控制一个游戏角色,推动箱子向指定位置移动,但箱子无法直接移动至目标位置。
1.3目标:玩家需要以最少的移动步数将所有箱子推至目标位置,即完成关卡。
2.解决推箱子难题的算法和策略2.1盲目搜索算法2.1.1深度优先搜索算法:从初始状态开始,一直沿着一个方向推动箱子,直到遇到障碍物为止。
2.1.2广度优先搜索算法:在每一步中,尝试所有可能的移动方向,并记录每个状态的移动路径,直到找到解决方案。
2.1.3双向搜索算法:从初始位置和目标位置同时开始搜索,直到两个搜索路径相交为止。
2.2启发式搜索算法2.2.1A算法:根据启发函数估计当前状态到目标状态的距离,选择距离最小的下一步移动方向。
2.2.2剪枝算法:通过预判某些状态的不可行性,提前排除无需尝试的移动方向。
2.2.3贪心算法:每次选择距离目标位置最近的箱子进行推动,以减少总体移动步数。
2.3知识表示与推理2.3.1逻辑推理:使用逻辑规则和推理算法进行箱子和角色的位置推理。
2.3.2状态空间搜索:将推箱子问题转化为状态空间搜索问题,通过搜索解空间来获得解法。
2.3.3约束满足问题:将箱子移动约束转化为约束满足问题,使用约束满足算法找到解决方案。
2.4强化学习方法2.4.1Q学习:使用状态动作奖励状态的马尔可夫决策过程进行学习和决策的强化学习方法。
2.4.2深度强化学习:基于深度神经网络的强化学习方法,通过大量样本数据进行模型训练和优化。
2.4.3遗传算法:通过基因编码和演化算子的操作,寻找最优的解决方案。
推箱子游戏详细设计报告
![推箱子游戏详细设计报告](https://img.taocdn.com/s3/m/7df4e1cfdd3383c4bb4cd2fd.png)
推箱子游戏详细设计报告一、 引言在前一阶段(概要设计)中,已解决了实现该游戏需求的程序模块设计问题。
包括游戏模块间的关系设计,以及数据结构和模块结构的设计等。
在以下的详细设计报告中将对在本阶段中对游戏所做的所有详细设计进行说明。
本阶段依据概要设计的要求,确定应该如何具体地实现所要求的游戏,从而在编码阶段可以把这个描述直接翻译成用具体的 程序语言书写的程序。
具体包括各功能模块信息的录入和修改以及删除等。
1.2目的目的是在训练你的逻辑思考能力。
在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
可以开发青少年学生的智力,又可以防止老年痴呆症。
1.3参考资料《C 程序设计(第三版)》,谭浩强编,清华大学出版社《Turbo C 2.0实用大全》,常玉龙等编写,北京航空航天大学出版社 《C 语言趣味程序百例精解》,陈朔鹰 陈英主编,北京理工大学出版社 《C 游戏编程从入门到精通》,浦滨著, 北京希望电子出版社 《C 函数实用手册》,张曜 郭立山 吴天著, 冶金工业出版社 二、总体设计2.1需求概要用户在进入游戏后,可以根据自己的想法自由移动箱子,游戏提供自由选关的功能模块,凭借这些模块,玩家可以实现对游戏快速通关! 2.2软件各模块结构 1、初始化模块:该模块包括和游戏。
屏幕初始化用于输出游戏的操作提示,游戏的每一关的初始化是初始化模块每一关的初始化2、 图画模块:该模块主要是被其它模块调用,用于画墙、在空地画箱子、在目的地画箱子、和画目的地。
画墙画箱子画图模块 画小人画目的地目的地画箱子3、移动箱子模块:空地之间箱子的移动移动箱子模块 目的地之间箱子的移动 目的地与空地之间的箱子移动4、移动小人模块:小人移动移动小人推动箱子到目的地5、功能控制模块:屏幕输出功能功能控制模块 指定位置状态判断功能关卡重置功能三、程序描述1初始化模块○1:开始主要的初始化就是屏幕初始化,用于输出游戏的操作提示,使玩家能知道游戏怎么玩!○2:每一个关卡的初始化,在游戏不能通关时,按空格键回到刚开始玩这个关卡的初始状态以实现玩家能快速通关!○3:进行下一关的初始化,就是这一关已经通关,要进入下一关的游戏,使游戏显示下一关的初始状态!2图画模块这个模块的功能不是很多,也比较简单,主要就是:○1:画墙:用方块表示,画出墙的形状和大小,以确定该关卡的难度。
推箱子项目设计报告
![推箱子项目设计报告](https://img.taocdn.com/s3/m/7d87b60aa9956bec0975f46527d3240c8447a196.png)
推箱子项目设计报告1. 项目背景推箱子游戏是一种经典的益智游戏,玩家需要通过移动箱子将它们推到指定的位置,完成关卡。
这种游戏既能够开发玩家的空间思维和逻辑思维能力,又能够提升他们的耐心和毅力。
本项目旨在开发一款推箱子游戏,提供给用户进行娱乐。
2. 项目目标本项目的目标是设计并实现一款推箱子游戏,具体目标包括:1. 实现基本的推箱子游戏功能,包括角色移动、箱子推动、关卡设计等;2. 设计多个不同难度的关卡,供玩家挑战;3. 提供游戏分数计算和排行榜功能,让玩家可以比较自己在每个关卡的成绩。
3. 项目设计3.1 游戏界面设计游戏界面将采用图形化的方式呈现,使用2D画面。
界面主要由以下几部分组成:1. 游戏地图:用来展示当前关卡的地图布局。
2. 角色:用来表示玩家在地图上的位置。
3. 箱子:用来表示玩家需要推到指定位置的箱子。
4. 目标位置:用来表示箱子需要推到的目标位置。
3.2 关卡设计关卡将由固定的地图布局、起始位置、目标位置以及箱子位置组成。
地图布局采用二维数组的形式表示,每个元素表示一个地图块的类型,如墙、地板等。
通过设计多个不同的地图布局,可以实现多个不同难度的关卡。
3.3 角色移动玩家可以通过键盘或鼠标控制角色的移动。
在每个关卡中,玩家可以向上、下、左、右四个方向移动角色,并且判断是否能够移动。
如果角色前方有箱子,并且箱子的前方是可移动的地板,则玩家可以将角色和箱子一起移动。
3.4 箱子推动玩家可以将箱子向上、下、左、右四个方向推动。
在推动箱子之前,需要判断箱子前方是否是可移动的地板,以及是否有其他箱子或墙阻挡。
如果箱子的前方是可移动的地板,则可以进行推动。
3.5 游戏分数和排行榜每个关卡都会记录玩家完成关卡所用的时间和步数,根据时间和步数计算玩家的得分。
玩家可以查看自己在每个关卡的得分,并与其他玩家进行比较,以达到竞争和娱乐的目的。
4. 开发计划4.1 需求分析和设计阶段(1周)在这个阶段,我们将进行游戏需求分析,并进行游戏界面和核心功能的设计。
推箱子游戏-详细设计
![推箱子游戏-详细设计](https://img.taocdn.com/s3/m/9bacd50916fc700abb68fca7.png)
详细设计报告报告名称:推箱子详细设计报告组长座号:3120306205组长姓名:林艺芬组员的座号及姓名:3120306202-林丽萍3120306219-陈飞滨目录一实验目的 (3)二实验步骤 (3)三实验报告内容 (3)1 概述 (3)1.1 修正之后的软件结构图、关系模型 (3)1.2 用程序流程图或盒图或PAD图详细描述每个功能 (4)1.3 详细设计数据库中的存储过程、触发器、视图等 (4)一实验目的–熟悉系统详细设计的相关内容–将结构图中的每个功能用程序流程图或盒图或PAD图描述详细设计二实验步骤- 修正软件结构图和关系模型- 对结构图中每一个模块进行详细设计,用合适图形工具表达三实验报告内容1 概述1.1 修正之后的软件结构图、关系模型软件结构图关系模型1.2 用程序流程图或盒图或PAD 图详细描述每个功能 初始化数据登录游戏推箱子过关成功更新分数过关失败游戏结束键盘操作移动到指定位置变色载入新地图1.3 详细设计数据库中的存储过程、触发器、视图等视图(游戏排行榜)create view rinksas select Username,Usercourse,dengjiname,rank() as 排名 from T_users,T_ranks order byUsercourse desc top 10触发器(更新用户分数)create trigger tr1 on T_userfor updateasif update(usercourse)beginupdate T_usersset usercourse=ercoursefrom T_users,Deleted d ,Inserted i where T_erID=erID end存储过程(排名)create proc courses@UserdengjiID char(20),@Usercourse char(20)asbeginif @usercourse/2500>=1 UserdengjiID=5if @usercourse/2000>=1 UserdengjiID=4if @usercourse/1500>=1 UserdengjiID=3if @usercourse/1000>=1 UserdengjiID=2if @usercourse/500>=1 UserdengjiID=1End。
推箱子地图设计报告
![推箱子地图设计报告](https://img.taocdn.com/s3/m/71ffd82c1fd9ad51f01dc281e53a580217fc5042.png)
推箱子地图设计报告1. 引言推箱子(Sokoban)是一款经典的益智游戏,具有简单的规则和有趣的挑战。
玩家需要在规定的移动次数内将所有的箱子推到目标位置,而不得堵住关键通道。
本报告旨在介绍推箱子地图设计的过程和实现。
2. 地图设计方法推箱子地图设计的目标是创建具有合理难度和挑战性的关卡。
以下是设计地图的一般步骤:2.1 确定地图尺寸和目标数首先确定地图的尺寸,通常以格子为单位。
然后根据游戏难度确定需要推到目标位置的箱子数量。
这个步骤可以根据实际情况进行调整。
2.2 设计地图背景地图背景包括墙壁、地板和目标位置。
墙壁的设置需要考虑通路和难度,不得过多或过少。
地板是箱子和角色可以移动的区域。
目标位置是箱子需要推到的目标格子。
2.3 箱子和角色的位置确定箱子和角色的初始位置。
这个过程需要考虑到地图的平衡性和挑战性。
箱子和角色的位置必须能够形成一个合理的初始状态,使得箱子能够推动到目标位置,但不得过于简单或过于复杂。
2.4 路径规划和优化确保地图中没有死路和无法达到目标位置的区域。
对于复杂的地图,路径规划和优化算法可以用来检查地图的合理性并提供最佳推箱子路径。
3. 推箱子地图设计实例以下是一个推箱子地图设计实例的步骤:3.1 地图尺寸和目标数假设我们选择一个10x10的地图,并设置3个目标位置。
3.2 地图背景我们在地图的四周设置墙壁,并将其余区域设为地板。
然后在地图中间随机设置3个目标位置。
............................................................................3.3 箱子和角色的位置我们将箱子和角色的位置设为以下初始状态:.....................................................@......XXX.........符号"@" 表示角色的初始位置,符号"X" 表示箱子的初始位置。
推箱子程序设计与报告
![推箱子程序设计与报告](https://img.taocdn.com/s3/m/38ee64be59eef8c75ebfb335.png)
程序设计与实验报告设计内容:推箱子姓名:黄庭班级:电信1101学号:23目录一.引言二.需求分析与系统设计三.开发技术四.程序中的主要模块五. 心得体会六. 程序全文一.引言在实际编写程序的过程中,产生的一些疑惑与不解,在同学和老师的帮助下圆满解决,对于老师和同学们的帮助,在此我表示衷心的感谢。
因为一开始构架的问题造成了一些功能的不能实现。
经多方努力仍不能解决,留下遗憾,希望随着日后能力的提高能解决今天留下的问题。
二.需求分析与系统设计设计目的通过本学期对游戏程序的研究,我们掌握了运用win32来制作游戏的技术,虽然不娴熟还有待提高,但是一些技术含量较低的小游戏还是很容易让我们掌握的。
此次游戏程序设计的目的,主要是通过win32来制作游戏来更好的掌握编程语言。
通过win32这个平台,熟习在制作游戏方面所需要的技巧,将自己的游戏尽可能多的运用所学到的技术,并且将在课程上面学到的知识付诸于实践,并从实际操作中,找出自己的不足之处进行弥补。
每一次的课程设计,都是一次小小的软件工程,所以需要我们用百分百认真的态度来对待。
对于小一点的程序,我们一个人足以应付,但是这并不是说我们可以单独一个人为所欲为,其实质应该是通过课程设计来培养自己独立自主的能力。
而对于那些相对于麻烦的程序,便需要我们的协作,这样对我们以后进入企业公司发展打下了更多的基础。
设计要求这次课程设计的要求并不像以往那么紧,老师让给了我们充足的时间来制作游戏,虽然是计划做一款较为大众的经典游戏,并且能力有限,但还是对游戏做出了较高的期望,对于功能做出了较多的设想。
例如,背景音乐的播放,时间的显示,自动切换关卡,难度的选择等。
界面设计图进入后的主界面图素材图片集合这个程序是一个益智类的游戏,是一个单机游戏,人物通过推动箱子到达目的地以在游戏中取胜,同一时刻只能有一位玩家进行游戏。
图英雄榜图关于游戏图选择关卡截图游戏流程系统流程图:游戏开始选择关卡进行游戏完成游戏自动切换下一关结束游戏游戏开局出现如图1,然后进行难度的选择,再是关卡的选择,然后就可以游戏了,游戏完成之后会自动切换下一关,游戏者可手动选择结束游戏。
推箱子程序设计实训报告
![推箱子程序设计实训报告](https://img.taocdn.com/s3/m/9dd6c85678563c1ec5da50e2524de518964bd398.png)
一、实训背景与目的随着计算机技术的发展,程序设计已成为计算机科学与技术专业学生必须掌握的核心技能之一。
为了提高学生的编程能力、逻辑思维能力和团队协作能力,我们选择了“推箱子”游戏作为程序设计实训的项目。
推箱子游戏是一款经典的益智游戏,玩家需要通过控制角色将箱子推到指定位置,游戏中包含多种障碍和复杂路径,对玩家的策略思维和操作技巧提出了挑战。
本次实训旨在通过设计和实现推箱子游戏,让学生掌握以下技能:1. 熟悉C语言编程环境,掌握基本的语法和编程技巧。
2. 理解数据结构和算法在游戏设计中的应用。
3. 学会使用图形库进行游戏界面设计。
4. 提高团队协作能力和沟通能力。
二、实训内容本次实训分为以下几个阶段:1. 需求分析:明确游戏的目标、规则和功能,确定游戏界面和交互方式。
2. 系统设计:设计游戏的数据结构、算法和流程图。
3. 编码实现:使用C语言编写游戏代码,实现游戏功能。
4. 测试与调试:对游戏进行测试,修复bug,优化性能。
5. 文档编写:撰写实训报告,总结实训过程和经验。
三、系统设计1. 数据结构:游戏使用二维数组存储地图信息,包括墙壁、箱子、目标点、玩家位置等。
同时,使用结构体存储玩家的状态,包括位置、方向、速度等。
2. 算法:游戏采用穷举法寻找最短路径,将玩家的移动方向和箱子移动方向进行组合,遍历所有可能的移动方案,找到最短路径。
3. 流程图:游戏流程包括初始化、游戏循环、输入处理、移动计算、碰撞检测、界面绘制等。
四、编码实现1. 初始化:读取地图数据,初始化玩家、箱子、目标点等状态。
2. 游戏循环:不断检测玩家的输入,根据输入更新玩家的状态,计算箱子移动方向,进行碰撞检测和地图更新。
3. 输入处理:监听键盘输入,根据输入更新玩家的移动方向。
4. 移动计算:根据玩家的移动方向计算箱子移动方向,更新箱子和玩家的位置。
5. 碰撞检测:检测玩家和箱子是否与墙壁、其他箱子或目标点发生碰撞,根据碰撞结果调整移动方向或停止移动。
推箱子总体设计报告
![推箱子总体设计报告](https://img.taocdn.com/s3/m/6ed3519a250c844769eae009581b6bd97e19bc51.png)
推箱子总体设计报告1. 引言推箱子是一款经典的益智游戏,玩家需要将箱子推动到指定位置,完成关卡。
本报告旨在介绍推箱子游戏的总体设计方案,包括游戏的目标、规则、界面设计、关卡设计等内容,以及相关技术实现细节。
2. 游戏目标和规则2.1 游戏目标玩家需要将游戏中的箱子推动到指定的目标位置,完成关卡。
2.2 游戏规则玩家可以通过上、下、左、右四个方向键来移动人物角色,人物可以推动箱子,但只能推动未被阻挡的箱子。
箱子只能被推动,而不能被拉动或跳过。
当所有的箱子都被成功推到目标位置时,玩家即可通关。
2.3 关卡设计每个关卡都由地图、箱子、人物角色和目标位置组成。
地图由固定大小的方格组成,每个方格可以是墙壁(无法通过)、地面(可通行)或目标位置(箱子需要推到的位置)。
每个关卡的地图和目标位置安排都会有所不同,以增加游戏的难度和挑战性。
3. 游戏界面设计3.1 主界面游戏主界面包括开始游戏、选择关卡、查看帮助和退出游戏等功能按钮。
在选择关卡界面,玩家可以根据自己的游戏进度选择已通关的关卡或未解锁的关卡。
3.2 游戏界面游戏界面会显示当前关卡的地图、箱子、人物角色和目标位置。
玩家可以通过方向键来控制人物角色移动。
游戏界面还会显示当前关卡的时间计时器和步数计数器,以提供用户对游戏进度的实时反馈。
4. 技术实现细节4.1 程序架构推箱子游戏的程序可以采用面向对象的架构,将地图、人物、箱子等游戏元素抽象为对象。
同时,可以采用MVC(模型-视图-控制器)设计模式,将游戏逻辑和界面显示分离,提高代码的可维护性和可扩展性。
4.2 地图生成地图可以通过读取关卡配置文件进行生成。
配置文件可以使用文本格式,通过字符来表示地图的不同元素,例如墙壁用""表示,地面用"."表示,目标位置用"O"表示。
通过解析配置文件,程序可以动态生成关卡地图。
4.3 碰撞检测碰撞检测是实现人物和箱子移动的关键技术。
推箱子_Java课程设计报告书
![推箱子_Java课程设计报告书](https://img.taocdn.com/s3/m/43866f937f1922791688e8e2.png)
《面向对象程序设计》课程设计报告题目:经典推箱子趣味游戏设计与实现院(系):信息科学与工程学院专业班级:计算机科学与技术1201班学生:程伟学号: 20121183011指导教师:吴奕20 14 年 12 月 29 日至20 15 年 1 月 9 日华中科技大学武昌分校制面向对象程序设计课程设计任务书目录1需求与总体设计 (1)1.1需求分析 (1)1.2总体设计 (2)2详细设计 (4)2.1 mainFrame类 (4)2.2 mainpanel类 (5)2.3S o u n d类 (7)2.4 Readmap类 (7)3 编码实现 (9)3.1游戏源码 (9)4系统测试 (42)总结 (45)1需求与总体设计1.1需求分析1.1.1功能结构图推箱子游戏的功能结构图如图1.1所示。
在系统中,编写4个Java类:mainFrame,mainpanel,Sound,Readmap;分别对应初始化游戏界面,游戏操作,背景音乐,绘制地图。
图1.11.1.2 UML类图推箱子系统除了上述4个Java类外,还需要Java系统提供的一些重要的类。
这些类之间的UML图如图1.2所示。
图1.21.2总体设计1.2.1 mainFrame类mainFrame类负责创建系统的主窗口。
mainFrame类有多种重要类型的对象,这些对象构成了游戏界面的简明与美观,并且通过监听实现方法赋予了这些组件的相应功能。
MainFrame类通过调用Readmap类来实现将地图绘制在游戏主界面,通过调用Sound 类来实现对背景音乐的管理,实现音乐开关以及选择上一曲下一曲的操作。
设计中包括了所有你所能直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:"选项""设置音乐""帮助"。
按钮包括:"重来""悔一步""第一关""上一关""下一关""最终关""选关""音乐"等。
推箱子实验报告
![推箱子实验报告](https://img.taocdn.com/s3/m/70c20231f342336c1eb91a37f111f18582d00c7d.png)
推箱子实验报告推箱子实验报告引言:推箱子是一种经典的益智游戏,通过移动箱子将它们推到指定位置,是一项考验智力和策略的活动。
本次实验旨在通过推箱子游戏,探讨人类思维的规律和策略,并分析不同因素对游戏结果的影响。
实验方法:本次实验采用了电脑版推箱子游戏,共设置了10个关卡。
每个关卡都有不同的地图布局和箱子数量,参与者需要通过键盘控制人物移动,将所有箱子推到指定的目标位置。
实验过程中记录了每个参与者完成每个关卡所用时间,并进行了数据统计和分析。
实验结果:通过对实验数据的统计和分析,我们发现参与者在不同关卡中的表现存在明显差异。
在较简单的关卡中,参与者往往能够快速找到解决方案,并在较短的时间内完成任务。
然而,在难度较高的关卡中,参与者往往需要花费更多的时间来思考和尝试不同的策略。
这表明推箱子游戏的难度与参与者的思维能力和策略选择密切相关。
进一步分析发现,参与者在解决问题时往往会采用一定的规律和策略。
例如,他们倾向于先将箱子推向墙壁或角落,以便在后续的移动中有更多的空间和选择。
此外,参与者还会尝试不同的路径和移动顺序,以找到最佳的解决方案。
这些策略的使用表明了人类思维的灵活性和创造性。
讨论:推箱子游戏作为一种益智游戏,不仅能够锻炼参与者的思维能力和逻辑思维,还能够培养他们的耐心和坚持不懈的精神。
通过实验,我们不仅可以了解人类思维的规律和策略,还可以为教育和培训领域提供一些启示。
首先,推箱子游戏可以被应用于教育中,帮助学生培养解决问题的能力和创造性思维。
通过让学生参与推箱子游戏,他们可以在游戏中体验到思维的乐趣,学会分析问题、制定策略,并在尝试中不断提高自己的能力。
其次,推箱子游戏还可以被应用于团队建设和合作学习中。
在推箱子游戏中,参与者需要与其他队员密切合作,共同制定策略和解决问题。
这种合作学习的方式可以培养学生的团队合作精神和沟通能力,提高他们的协作能力。
结论:通过本次推箱子实验,我们深入了解了人类思维的规律和策略,并发现了推箱子游戏在教育和培训中的潜力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
推箱子游戏设计使用说明书一、项目背景本实训要求对“推箱子游戏”进行分析、设计及编程实现。
本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。
同时,本实训中了解图形界面设计基本技术。
通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。
二、需求分析:经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。
在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。
在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
本游戏一共4关,由易到难。
开始,移动,重新开始,选择关卡,上一关,下一关,退出七个过程。
(1)初始化包括屏幕初始化和每一关卡的初始化(2)保存没一关的地图(3)需要时读取所需要的地图(4)下载入新的地图(5)绘制地图快(6)确认退出,保存提示(7)按键处理包括移动小人和移动箱子,通过移动上下左右或ASDW键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
(8)每一关都可以重置。
(9)记录走的步数,创建文件,记录每关的最好成绩。
(10)整个画面刷新三、目的、意义和研究现状分析1、目的、意义本次课程设计的重要目的及任务就是将平时所学应用到具体设计中,能够熟练的应用学习中的各种方法。
重在提高自身的vb编程能力。
2、研究现状分析1.系统结构的总体设计决定系统的总体结构,包括整个系统分哪些部分,各部分之间有什么联系以及已确定的需求对这些组成部分如何分配等方面。
1)初始化模块该模块包括屏幕初始化和游戏每一关的初始化。
屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。
2)图画模块。
该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。
3)移动箱子模块该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
4)移动小人模块该模块用于控制小人移动,从而推动箱子到目的地。
5)功能控制模块该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。
2.详细设计对各功能模块的功能定义,说明模块之间的调用关系与接口(参数)。
3.编码及调试根据详细设计的要求,按照统一的要求和编码规范,用vb语言编码实现,同时负责每个模块的独立调试。
4.最终效果三、主要解决的问题在整个的游戏实现过程中,主要有七个模块,开始,移动,重新开始,选择关卡,上一关,下一关,退出七个过程.在具体实现的时候主要问题有,按键的处理问题,在各种情况下,下一步分别是什么图片;还有在撤销的时候,需要对上一步进行判断,在进行恢复退步。
选关的时候需要定义临时变量来传递玩家所选择的关数。
五、主要开发环境与工具、技术路线和解决方案课程设计的实验环境软件:Microsoft Visual Studio 2005课程设计的预备知识熟悉Visual Basic .net程序设计的基本语法知识及常用技巧。
六、系统分析与设计流程图七、系统编码Option ExplicitEnd SubOption Explicit' API函数声明Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long' 全局常量Private Const MAXX As Integer = 20 ' 鼠标小人X轴定位Private Const MAXY As Integer = 15 ' 鼠标小人Y轴定位Private Const SIZE As Integer = 302 ' 制定小人大小Private Const D_LEFT As Integer = 1 '控制小人向左运动Private Const D_RIGHT As Integer = 0 '控制小人向右运动Private Const D_UP As Integer = 2 '控制小人向上运动Private Const D_DOWN As Integer = 3 '控制小人向下运动Private Const B_GROUND As Integer = &H0 '定义空白Private Const B_DEST As Integer = &H1 '定义小人Private Const B_BOX As Integer = &H2 '定义盒子Private Const B_WALL As Integer = &H4 '定义墙Private Const B_BACK As Integer = &H8 '定义背景' 全局变量'private 指只在只在推箱子的窗口可用Private Map(MAXX, MAXY) As Integer '定义地图的大小Private ScenesCount As Integer, CurrScene As Integer '定义场景和当前场景Private BoxCount As Integer, Completed As IntegerPrivate X As Integer, Y As Integer, Dir As Integer '定义当前的位置Private FileNum As IntegerPrivate MapLoading As Boolean '定义地图下载为逻辑变量Private Playing As Boolean '定义为逻辑变量' 游戏开始Private Sub Form_Load()Playing = False '游戏开始MapLoading = False '地图下载InitGame '定义一个过程名End Sub' 游戏初始化Private Sub InitGame() '定义一个过程名FileNum = FreeFile'一个整型函数,把文件赋给一个变量,下一个OPEN可以供文件使用的文件序号Open "Map.dat" For Binary Access Read As FileNum '文件以二进制形式记录打开 ScenesCount = LOF(FileNum) / SIZE '文件尾函数/每关地图长度If ScenesCount = 0 Then '如果输出的场景为错,则输出没有可用的地图文件或文件格式出错,""请把可用的 Map.dat 文件和游戏放在同一目录。
"文件读取错误"MsgBox "没有可用的地图文件或文件格式出错," & vbCrLf & _"请把可用的 Map.dat 文件和游戏放在同一目录。
", _vbOKOnly Or vbExclamation, "文件读取错误"EndEnd IfLoadMap 1 '地图下载成功Playing = True '玩游戏End Sub' 读取关卡数据Private Function LoadMap(Scene As Integer) As BooleanIf MapLoading Then Exit Function '系统推出功能If Scene < 1 Or Scene > ScenesCount Then '如果场景是1或当前场景 LoadMap = False '加载失败Exit Function '则退出功能End IfMapLoading = True '地图下载正确CurrScene = Scene '运行当前场景Caption = "推箱子第" & CurrScene & "关" '显示推箱子在第几关BoxCount = 0: Completed = 0Dir = 0 '定义方向键Dim Data As ByteGet FileNum, (CurrScene - 1) * SIZE + 1, Data '选择场景加一X = Data 'x方向的数据Get FileNum, , DataY = Data 'Y方向的数据Dim i As Long, j As LongFor i = 0 To MAXY - 1For j = 0 To MAXX - 1Get FileNum, , DataMap(j, i) = Data '定义地图的大小If Map(j, i) And B_DEST Then BoxCount = BoxCount + 1NextNextDrawMapLoadMap = TrueMapLoading = FalseEnd Function' 选择关卡Private Sub SelectMap() '选择关卡Dim Temp As IntegerTemp = Val(InputBox("请输入关数(1~" & Trim(ScenesCount) & ")", "选择一关", 1))If Temp >= 1 And Temp <= ScenesCount Then CurrScene = Temp '如果temp>=1并且<=当前场景那么就选择此为当前场景LoadMap TempEnd Sub' 显示整个游戏画面Private Sub DrawMap()Dim i As Long, j As LongFor i = 0 To MAXY - 1For j = 0 To MAXX - 1DrawBox j, i, Map(j, i) '显示游戏画面的大小NextNextDrawMan X, YpicMain.RefreshEnd Sub' 显示背景块(包括地面、墙、箱子等)Private Sub DrawBox(ByVal X As Integer, ByVal Y As Integer, ByVal BoxType As Integer)Dim Offset As IntegerSelect Case BoxTypeCase B_BACKOffset = 0 '背景Case B_GROUND '空白处的背景Offset = 1Case B_DEST '显示目标图片Offset = 2Case B_BOX '显示盒子Offset = 3Case B_WALL '显示墙Offset = 4End SelectBitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picBoxs.hDC, Offset * 32, 0, vbSrcCopyEnd Sub' 显示小人Private Sub DrawMan(ByVal X As Integer, ByVal Y As Integer) '使用API 函数,定义小人控件的位置,大小BitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picMan.hDC, Dir * 32, 32, vbSrcAnd BitBlt picMain.hDC, X * 32, Y * 32, 32, 32, picMan.hDC, Dir * 32, 0, vbSrcPaint End Sub' 游戏操作(按键处理)Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If Not Playing Then Exit SubSelect Case KeyCodeCase 37 '小人的位置向上移动ManMove -1, 0Case 38ManMove 0, -1 '小人的位置向下移动Case 39ManMove 1, 0 '小人的位置向左移动Case 40ManMove 0, 1 '小人的位置向右移动Case 32LoadMap CurrScene '场景的切换Case 33LoadMap CurrScene - 1 '关卡减一关Case 34LoadMap CurrScene + 1 '关卡加一关Case 13SelectMap '选择地图Case 27Unload Me '下载推出End SelectEnd Sub' 游戏结束Private Sub Form_Unload(Cancel As Integer)Close '关闭窗口退出EndEnd Sub' 小人移动Private Sub ManMove(OffsetX As Integer, OffsetY As Integer)Dim DestX As Integer, DestY As IntegerIf OffsetY = -1 Then '小人向上移动Dir = D_UPElseIf OffsetY = 1 ThenDir = D_DOWN '小人向下移动ElseIf OffsetX = -1 ThenDir = D_LEFT '向左移动ElseDir = D_RIGHT '向右移动End IfDestX = X + OffsetX: DestY = Y + OffsetYIf DestX < 0 Or DestX >= MAXX Or DestY < 0 Or DestY >= MAXY Then Exit Sub If Map(DestX, DestY) And B_WALL Or Map(DestX, DestY) And B_BACK Then Exit SubIf Map(DestX, DestY) And B_BOX Then ‘定义地图的目标地址值Push DestX, DestY, OffsetX, OffsetY '推动箱子ElseDrawMan DestX, DestY '小人的位置DrawBox X, Y, Map(X, Y)X = DestX: Y = DestYpicMain.RefreshEnd IfEnd Sub' 推动箱子Private Sub Push(SourceX As Integer, SourceY As Integer, OffsetX As Integer, OffsetY As Integer)Dim DestX As Integer, DestY As Integer '定义场景的大小DestX = SourceX + OffsetX: DestY = SourceY + OffsetYIf DestX < 0 Or DestX >= MAXX Or DestY < 0 Or DestY >= MAXY Then Exit SubIf Map(DestX, DestY) And B_WALL Or Map(DestX, DestY) And B_BACK Or _Map(DestX, DestY) And B_BOX Then Exit SubMap(SourceX, SourceY) = Map(SourceX, SourceY) - B_BOX '地图大小为减去盒子的大小Map(DestX, DestY) = Map(DestX, DestY) + B_BOX '地图大小为加上盒子的大小DrawBox DestX, DestY, B_BOX '画出盒子的大小DrawBox SourceX, SourceY, Map(SourceX, SourceY)DrawMan SourceX, SourceY '定义小人位置DrawBox X, Y, Map(X, Y) '定义地图位置X = SourceX: Y = SourceYpicMain.Refresh '刷新If Map(SourceX, SourceY) And B_DEST Then Completed = Completed - 1If Map(DestX, DestY) And B_DEST Then Completed = Completed + 1If Completed = BoxCount Then WinEnd Sub' 过关处理Private Sub Win()If MsgBox("你太聪明了!要继续玩下一关吗?", vbYesNo, "过关!") = vbNo Then '过关了以后如果不继续则下载当前玩的场景Unload MeEnd IfIf Not LoadMap(CurrScene + 1) ThenIf MsgBox("你已经过了最后一关!还要继续吗?", vbYesNo, "真厉害!") = vbYes ThenLoadMap CurrScene '过关后如果选择继续则下载下一关的地图ElseUnload MeEnd IfEnd IfEnd SubPrivate Sub picMan_Click()End SubOption Explicit' API函数声明Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long' 全局常量Private Const MaxX As Integer = 20 '定义场景X轴的宽度Private Const MaxY As Integer = 15 '定义场景y轴的宽度Private Const B_GROUND As Integer = &H0 '定义总背景常量并赋H0Private Const B_DEST As Integer = &H1 '定义小人常量并赋H1Private Const B_BOX As Integer = &H2 '定义盒子常量并赋H2Private Const B_WALL As Integer = &H4 '定义墙常量并赋H3Private Const B_BACK As Integer = &H8 '定义背景常量并赋H4' 全局变量Private Map(MaxX, MaxY) As IntegerPrivate X As Integer, Y As IntegerPrivate ScenesCount As Integer, CurrScene As IntegerPrivate FileNum As IntegerPrivate CurrBox As Integer ' 当前使用的地图块Private Changed As Boolean ' 地图是否改变,如果是,在切换和退出时提示保存' 初始化Private Sub Form_Load()lblHelp.Caption = _"方向键 - 移动" & vbCrLf & _" 空格 - 选图" & vbCrLf & _" Ctrl - 绘图" & vbCrLf & _" N - 新地图" & vbCrLf & _" PgUp - 上一关" & vbCrLf & _"PgDown - 下一关" & vbCrLf & _" S - 保存" & vbCrLf & _" Esc - 退出" & vbCrLf & _vbCrLf & _"其它说明:" & vbCrLf & _" 一、任何未保存的操作都会有提示;" & vbCrLf & _" 二、企鹅最后停留的位置为本关的起始位置。