如何写一个Java版推箱子

思路是先想好要准备的种种细节,将其都考虑好之后甚至写了一部分功能代码后,再从整体上考虑优化。

细节上要了解

1.  swing 包

掌握图像,动画与事件监听等基本知识。能够明白每推动一次箱子就是使用双缓冲技术重绘一次 JPanel,如此则可以将视图和逻辑相分离。

将地图映射为一个二维数组,为相应的区域赋值为数字0~9,并绘制对应的图片。

/*此处并不需要使用int类型,使用byte类型能节省空间*/
byte[][] map; 
2.  视图

先思考需要几类视图元素:

  • 背景方格 BACKGROUD = 0 <—> backgroud.png
  • 围墙方格 WALL = 1 <—> wall.png
  • 目标位方格 TARGED = 2 <—> target.png
  • 箱子方格 BOX
    • 在目标位方格 TARGEDBOX = 3 <—> targetbox.png
    • 不在目标位方格 BOX = 4 <—> box.png
  • 人(默认) PERSON
    • 向左 PLEFT = 5 <—> pleft.png
    • 向右 PRIGHT = 6 <—> pright.png
    • 向上 PUPPER = 7 <—> pupper.png
    • 向下 PDOWN = 8 <—> pdown.png

共计9张图片(如果人在与不在目标位不予区分的话);
建立一个Image数组,包含图片资源

Image[] image = {}
3. 逻辑
  • 首先,游戏结束判断条件
/*当 map 中没有TARGET*/
/*当 map 原本的目标位 包括TARGET和BOXTARGET,现在都是BOXTARGET*/
  • 考虑单步推箱子的逻辑,在人的某一方向left上,判断是否有箱子
/*对任一方向上 设置P1-->P2-->P3*/
/*判断P2之后-->视情况判断P3*/
  • 不同关卡宜采用状态模式
    不同关卡之间的不同仅在于 map 不同,其根据map绘图和监听map的代码具有可复用性

在整体上,经过反复调整创建类体系为:
不同关卡造成需要加载的Panel不同,而frame和事件监听是不变的。


最后实现的功能是完成关卡之后会自动跳至下一关卡,按B键可以返回上一步,按R键可以重新开始当前关卡。添加一个关卡只需要写一个 SokobanLevel 类即可,符合开闭原则。

但这个功能还非常弱,仅仅是完成了基本功能的水平。

在大致完成各个类之后,想要精益求精需要花费大量的时间去排查bug,完善功能以及添加注释。

如何写一个Java版推箱子_第1张图片

你可能感兴趣的:(代码训练)