java--贪吃蛇设计•涉及到的类•个各类所涉及到的方法GamePanel类•GamePanel类voiddisplay();//显示Snake类•voidmove();//移动(走一步)•voidchangeDirection();//改变方向•voideatFood();//吃食物(身体变长)•booleanisEatBody();//蛇是否吃到了自己的身体•voiddrawMe();//显示自己定时移动Food类•booleanisSnakeEatFood(Snake);//判断蛇是否吃到了食物•voiddrawMe();//显示Ground类•booleanisSnakeEatRock(Snake);//蛇是否吃到石头•voiddrawMe();//显示各个类之间的关系GroundFoodSnake定时移动controller处理按键事件处理逻辑事件ControllerGamepanel重新显示Controller通过事件监听建立联系Snake定时移动MainFrame移动后,触发事件snakeMovedSnakeListener处理按键事件状态改变需要重新显示触发按键事件重新显示事件源事件源SnakeListener•voidsnakeMoved(Snake);总的包与类•为了方便查看定义不同的包•game——包括GameOptionPanel,MainFrame类•Controller——包括controller类•Entities——包括foodgroundsnake类•Listeners——包括GameListener,SnakeListener接口•Util——包括global类•View——包括GamePanel类怎么表示蛇,食物,石头•可以把显示区域想象成一个大大表格,其中的一个格子可以代表一个食物或一块石头,几个连在一起的格子就代表一条蛇•怎么区分格子呢(怎么表示这个格子呢)?用坐标,每个格子有它自己的坐标,左上角的那个格子的坐标是(0,0)怎么表示蛇,食物,石头食物(0,0)(1,0)石头(0,1)石头蛇头(1,2)蛇身(2,2)蛇身(3,2)石头石头石头石头y坐标x坐标0123456789012345蛇怎么移动•蛇向前移动一步,可以看作是蛇头前面增加了一个节点,蛇的尾巴上少了一个节点(即去尾,加头)去掉蛇头移动前新头原来的第二节原来的蛇头移动后用什么数据结构存放蛇的身体节点分析:要区分蛇头和蛇尾巴,这就要求这个数据结构是有序的,还要(经常的)访问第一个和最后一个节点,所以LinkedList最合适,因为它有getFirst(),getLast()方法和removeLast()方法蛇的移动方向•蛇下一步移动到哪儿,是由方向来控制的。•用什么表示方向呢?在这里我们用int型的常量表示根据原蛇头和方向计算新蛇头的坐标(2,1)(1,2)蛇头(2,2)(3,2)(2,3)y坐标x坐标0123401234向上移动y坐标减1向左移动x坐标减1向下移动y坐标加1向右移动x坐标加1•格子的宽度和高度像素坐标(x,y)矩形(格子)的高度CELL_HEIGHT矩形(格子)的宽度CELL_WIDTH格子坐标和像素坐标格子坐标(2,1)这个点的像素坐标为x坐标:格子的宽度*lefty坐标:格子的高度*toptop=1left=2left是这个格子距左边界的距离top是这个格子距上边界的距离关于方向,有两个要注意地方1.相反方向2.无效方向•什么是相反方向和上一次移动的方向相反的方向即为相反方向如果输入的是相反方向则应该忽略(判断相反方向时应该注意方向的有效性)•在蛇的这一次移动之后和下一次移动之前这个时间间隔内输入了多个方向,只有最后一个是有效方向,其余的都为无效方向无效方向蛇头向上移动蛇移动一次的时间间隔之内无效方向相反方向无效方向蛇移动后可能出现的三种情况1.吃到食物2.吃到石头3.吃到自己的身体(什么都没吃到)•吃到了什么?比坐标,坐标重合,就代表吃到了判断吃到什么东西,只需判断蛇头,因为蛇的身体都是走蛇头走过的地方