推箱子设计报告书

合集下载

推箱子问题的设计与实现

推箱子问题的设计与实现

《推箱子问题的设计与实现》实验报告班级:计本四班学号: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);}}}四、总结通过对推箱子游戏的编程和设计,进一步巩固了数据结构和算法设计与分析所学的知识,在查阅了有关推箱子游戏问题编程的相关知识的同时,也进一步了解了结构体之间的密切关系,并加深和巩固了函数调用的方法和技巧。

推箱子项目实训报告

推箱子项目实训报告

一、项目背景推箱子游戏是一款经典的益智游戏,起源于日本。

玩家需要在狭小的仓库中,通过移动人物,将箱子推到指定的位置。

这款游戏不仅考验玩家的逻辑思维和空间想象力,还锻炼玩家的耐心和策略。

为了提高自身的编程能力,我们选择推箱子游戏作为实训项目。

二、实训目的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,处理用户操作。

推箱子游戏实践报告

推箱子游戏实践报告

推箱子游戏设计实践报告一、游戏介绍在一定的范围里,要求人把木箱从开始位置推放到指定的位置。

由于箱子只能推不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

该游戏一共有三道关卡,按下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

推箱子程序设计与报告.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++推箱子课程设计报告材料

武汉理工大学华夏学院课程设计报告书课程名称:软件综合题目:基于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引言最经典的推箱子游戏,类似的游戏你一定早就玩过。

推箱子游戏设计报告书

推箱子游戏设计报告书

推箱子游戏设计报告书需求介绍:推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带这种游戏。

它既能锻炼思维的严密性,又有很多乐趣。

本设计将用C语言实现一个简单的推箱子游戏,旨在阐述推箱子游戏的实现方法。

设计目的:本设计旨在训练开发者的基本编程技巧,其中涉及软中断、二维数组、键盘操作及图形化函数等方面的知识。

通过本设计的训练,开发者能基本掌握显示器中断寄存器的设置、二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示和定位,以及部分图形函数的使用。

功能描述:本游戏共有4关,由易到难,每一关都有初始化、按键处理、重置及退出功能。

(1)初始化包括屏幕初始化和每一关关卡的初始化,屏幕被初始化宽80列,高25行。

(2)按键处理包括移动小人和移动箱子,通过移动上下左右键控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为通关。

(3)每一关都可以重置,按空格键可以重置当前关。

(4)按ESC键可以在任何时候退出游戏。

总体设计:1.功能模块设计(1)系统模块图本设计包括5个模块,分别是初始化模块、图画模块、移动箱子模块、移动小人模块和功能控制模块,如图1所示。

各个模块的功能描述如下。

1)初始化模块该模块包括屏幕初始化和游戏每一关的初始化。

屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。

2)图画模块。

该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。

3)移动箱子模块该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。

4)移动小人模块该模块用于控制小人移动,从而推动箱子到目的地。

5)功能控制模块该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

图1 系统模块图(2)任务执行流程图游戏从第一任务开始(第一关),按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按Esc键退出。

推箱子C课程设计报告

推箱子C课程设计报告

程序设计课程设计报告书学生:孟祥煜指导老师: 曾宇容课程设计名称:推箱子小游戏班级: 软件11401一、设计任务介绍推箱子游戏得实现方法,并逐步介绍C语言图形编程得方法与技巧。

在C语言编写软件WIN-TC上,涉及软中断、二维数组、键盘操作及图形化函数等方法,显示器中断寄存器得设置、二维数组得定义、键盘上键值得获取、图形方式下光标得显示与定位,以及部分图形函数得使用实现了一个完整得推箱子游戏界面,界面清晰可见。

二、设计目得训练学生掌握C得数据结构与综合编程能力与游戏开发技巧等应用能力。

初步设想推箱子就是一款经典得益智小游戏,目得就是在训练人得逻辑思考能力。

在一个狭小得空间中,要求把木箱从起始位置处推放到指定位置。

在空间中有地方限制,稍不小心就会出现箱子无法移动或者通道被堵住得情况,而且箱子只能推不能拉,所以需要玩家巧妙得利用有限得空间与通道,合理得移动次序与位置,才能完成任务。

本游戏一共分14关,由易到难,每一关都随着关数得增加来增加难度,从而达到吸引游戏玩家得目得。

三功能1、菜单功能,玩家通过瞧目录按对应得键可以进入对应得功能菜单,其中1进入游戏,2选择游戏关卡,3游戏帮助指南 ,4退出游戏。

2 游戏功能: 玩家可以通过操纵键盘中得上下左右键进入游戏进行各种操作来完成游戏。

3 循环功能:当玩家正在游戏得时候如果某一步走错了,导致游戏无法完成,可以随时重新开始游戏来完成关卡,游戏过程中可以随时按Ctrl+V退出游戏。

4 顺序功能:当玩家完成了某一关之后,随着进入下一关门可以按顺序进入下一关,继续开始更有挑战得关卡,如果该关就是最后一关,则显示通关完成。

三、总体设计1、功能模块设计函数功能描述本程序包括5个模块,分别就是初始化模块、画图模块、移动箱子模块、移动小人模块与功能控制模块。

各个模块功能得功能描述如下:(1)初始化模块。

该模块包括屏幕初始化与游戏第一关到第最后一关得初始化。

屏幕初始化用于输出欢迎信息与操作提示,游戏每一关得初始化就是构建每一关得关卡。

推箱子实验报告

推箱子实验报告

引言概述推箱子是一种常见的游戏,也是计算机算法和研究中的经典问题,它涉及的算法和方法有助于提高问题解决能力和逻辑思维能力。

本文将对推箱子实验进行详细分析和讨论,包括推箱子游戏的定义、规则和目标,以及解决推箱子难题的算法和策略。

正文内容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遗传算法:通过基因编码和演化算子的操作,寻找最优的解决方案。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 & _" 二、企鹅最后停留的位置为本关的起始位置。

相关文档
最新文档