可视化程序设计大作业推箱子小游戏班级:21531学号:2153127姓名:黎楠指导教师:沈哲东北大学秦皇岛分校计算机与通信工程学院2018.012一、任务描述:1.题目:推箱子小游戏2.功能描述:(1)箱子只能推动而不能拉动。一次只能推动一个箱子。(2)在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况。(3)本游戏的目的就是把所有的箱子都推到目标位置上。(4)通过使用键盘的方向键来控制移动方向。(5)具有重玩本关、跳过本关的功能。二、成员负责部分:独立完成(6分)三、正文1.功能设计:(1).能够显示主菜单和界面:允许玩家对游戏关卡进行设置,增设关卡,把编辑好的关卡进行存储,并能弹出窗体提示当前设计完成的关卡数;(2).能够实现键盘操作功能:使用上、下、左、右方向键控制工人的移动方向,空格键重玩;(3).能够把放置到目的地的箱子进行变色显示;(4).游戏胜负判断功能:当玩家把箱子移动到指定位置时,成功通过当前关卡;(5).可以切换上一关、下一关、增加关卡以及重玩当前关卡;(6).可以判断当前的关卡数,在处于第一关和最后一关时分别不能进行“前一关”和“后一关”操作,并弹出窗体进行提示;2.界面设计:用到的图片及窗体设计33.具体设计:(1).地图编辑器Form2:使用地图编辑器来编辑每一关游戏的界面,就是在窗体上点击生成墙、工人、箱子、通道、目的地,将地图转换为一个一维数组:010101234567...其中0代表墙,1代表人,2代表箱子,3代表路,4代表目的地,5代表人在目的地,6代表放到目的地的箱子,通过这个数组游戏就可以进行初始化布局了。最后导出一个关卡的配置的plist文件.info,里面存储的即为初始化数组。4Form2里面共两个控件。toolStripBtn:进行增加关卡时,选中编辑地图所需要的图片,在编辑地图时直接将要用到的图片拖到窗口内,进行布局;pictureBox:用于编辑地图时,存放布局的样式;(2).游戏窗口Form1:通过依次读取已保存在固定位置的plist文件进行初始化页面信息,生成相应的游戏界面;并定义控制功能,实现用键盘方向键控制工人的移动方向;实现对关卡的切换,如上一关、下一关,能增加关卡以及重玩当前关卡。Form1共两个控件ToolStripMenuItem:游戏菜单中分为四个子菜单,分别为上一关、下一关、重玩、编辑地图和退出上一关:进入上一个关卡下一关:进入下一个关卡重玩:对本关卡初始化,重新开始本关编辑地图:增加关卡退出:退出游戏pictureBox:用于显示地图内容4.运行结果:567源代码:Form1:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;namespace推箱子游戏{publicpartialclassForm1:Form{privateintx;//工人当前位置(x,y)privateinty;//privateboolflag=true;//0代表墙,1代表人,2代表箱子,3代表路,4代表目的地//5代表人在目的地,6代表放到目的地的箱子privateenumMap_State{None=-1,Wall=0,Worker,Box,Passageway,Destination,WorkerInDest,RedBox};privateMap_State[,]myArray;//privateint[,]my;privateintOrder=1;//游戏关的序号publicForm1(){InitializeComponent();}8privatevoidReadMap(intn){stringfilename=map\\map_+n.ToString()+.info;FileStreamfs=newFileStream(filename,FileMode.Open,FileAccess.Read);BinaryReaderr=newBinaryReader(fs);//读取数据for(inti=0;i7;i++)for(intj=0;j7;j++)myArray[i,j]=(Map_State)r.ReadByte();for(inti=0;i7;i++)for(intj=0;j7;j++)if(myArray[i,j]==Map_State.Worker){x=i;y=j;}r.Close();fs.Close();}publicvoidinitdata(){myArray=newMap_State[7,7];ReadMap(Order);}privatevoidForm1_Load(objectsender,System.EventArgse){initdata();drawimage();}//绘制整个游戏区域图形privatevoiddrawimage(){Bitmapbit=newBitmap(this.pictureBox1.Width,this.pictureBox1.Height);Graphicsg=Graphics.FromImage(bit);SolidBrushredBrush=newSolidBrush(Color.Red);System.Drawing.Imageimage=newBitmap(worker.gif);for(inti=0;i7;i++){for(intj=0;j7;j++){if(myArray[i,j]==Map_State.Wall){image=newBitmap(wall.gif);g.DrawImage(image,i*50,j*50,50,50);9}if(myArray[i,j]==Map_State.Worker){image=newBitmap(worker.gif);g.DrawImage(image,i*50,j*50,50,50);}if(myArray[i,j]==Map_State.Box){image=newBitmap(box.gif);g.DrawImage(image,i*50,j*50,50,50);}if(myArray[i,j]==Map_State.Passageway){image=newBitmap(passageway.gif);g.DrawImage(image,i*50,j*50,50,50);}if(myArray[i,j]==Map_State.Destination){image=newBitmap(destination.gif);g.DrawImage(image,i*50,j*50,50,50);}if(myArray[i,j]==Map_State.WorkerInDest){image=newBitmap(worker.gif);g.DrawImage(image,i*50,j*50,50,50);}if(myArray[i,j]==Map_State.RedBox){image=newBitmap(redbox.gif);g.DrawImage(image,i*50,j*50,50,50);}}}this.pictureBox1.Image=bit;}privatevoidForm1_KeyDown(objectsender,System.Windows.Forms.KeyEventArgse){intx1,y1,x2,y2;//工人当前位置(x,y)switch(e.KeyCode)//分析按键消息{//向上caseKeys.Up:10x1=x;y1=y-1;x2=x;y2=y-2;//将所有位置输入以判断并作地图更新MoveTo(x1,y1,x2,y2);break;//向下caseKeys.Down:x1=x;y1=y+1;x2=x;y2=y+2;MoveTo(x1,y1,x2,y2);break;//向左caseKeys.Left:x1=x-1;y1=y;x2=x-2;y2=y;MoveTo(x1,y1,x2,y2);break;//向右caseKeys.Right:x1=x+1;y1=y;x2=x+2;y2=y;MoveTo(x1,y1,x2,y2);break;caseKeys.Space://空格键重玩ToolStripMenuItem_Click(null,null);break;}}privatevoidMoveMan(intx,inty){if(myArray[x,y]==Map_State.Worker)myArray[x,y]=Map_State.Passageway;elseif(myArray[x,y]==Map_State.WorkerInDest)myArray[x,y]=Map_State.Destination;}11privatevoidMoveTo(intx1,inty1,intx2,inty2){Map_StateP1,P2;P1=P2=Map_State.None;if(IsInGameArea(x1,y1))//判断是否在游戏区域P1=myArray[x1,y1];if(IsInGameArea(x2,y2))P2=myArray[x2,y2];if(P1==Map_State.Passageway)//P1处为通道{MoveMan(x,y);x=x1;y=y1;myArray[x1,y1]=Map_State.Worker;}if(P1==Map_State.Destination)//P1处为目的地{MoveMan(x,y);x=x1;y=y1;myArray[x1,y1]=Map_State.WorkerInDest;}if(P1==Map_State.Wall||!IsInGameArea(x1,y1))//P1处为墙或出界{return;}if(P1==Map_State.Box)//P1处为箱子if(P2==Map_State.Wall||!IsInGameArea(x1,y1)||P2==Map_State.Box)////P2处为墙或出界{return;}//以下P1处为箱子//P1处为箱子,P2处为通道if(P1==Map_State.Box&&P2==Map_State.Passageway){MoveMan(x,y);x=x1;y=y1;myArray[x2,y2]=Map_State.Box;myArray[x1,y1]=Map_State.Worker;}if(P1==Map_State.Box&&P2==Map_State.Destination){MoveMan(x,y);12x=x1;y=y1;myArray[x2,y2]=Map_State.RedBox;myArray[x1,y1]=Map_State.Worker;}//P1处为放到目的地的箱子,P2处为通道if(P1==Map_State.RedBox&&P2==Map_State.Passageway){MoveMan(x,y);x=x1;y=y1;myArray[x2,y2]=Map_State.Box;myArray[x1,y1]=Map_State.WorkerInDest;}//P1处为放到目的地的箱子,P2处为目的地if(P1==Map_State.RedBox&&P2==Map_State.Destination){MoveMan(x,y);x=x1;y=y1;myArray[x2,y2]=Map_State.RedBox;myArray[x1,y1]=Map_State.WorkerInDest;}drawimage();//这里要验证是否过关if(Is