📄 snake.java~137~
字号:
package com.cxlife.snake;
import java.util.ArrayList;
import java.awt.Graphics;
import java.awt.Component;
/**
*功能描述:这是一条蛇,它负责个移动单元的运动.
* 我用一个ArraySet来维护各模快,注意:ArraySet中的第一个元素是蛇头,蛇头控制
* 蛇的运动方向.
*/
//这个类用组合模式将各个移动单元组合起来.
//现在发现这个类用组合模式非常牵强,呵呵,算了,不改了,权当是学习组合模式的使用.
public class Snake extends SnakeUnit
implements java.io.Serializable,
java.lang.Cloneable{
//用来保存各移动单元对象.
protected ArrayList unit_list = new ArrayList();
public Snake(){
}
//返回蛇头的位置(丛坐标)
public int getTop(){
int intLen = this.getLen();
SnakeUnit su = null;
if (intLen<1)
return -1;
su = (SnakeUnit)unit_list.get(0);
return su.getTop();
}
//设置蛇头的位置
public void setTop(final int pTop){
int intLen = this.getLen();
SnakeUnit su = null;
if (intLen<1)
return;
su = (SnakeUnit)unit_list.get(0);
su.setTop(pTop);
}
//返回蛇头的位置(横坐标)
public int getLeft(){
int intLen = this.getLen();
SnakeUnit su = null;
if (intLen<1)
return -1;
su = (SnakeUnit)unit_list.get(0);
return su.getLeft();
}
//设置蛇头的位置
public void setLeft(final int pLeft){
int intLen = this.getLen();
SnakeUnit su = null;
if (intLen<1)
return;
su = (SnakeUnit)unit_list.get(0);
su.setLeft(pLeft);
}
//只返回蛇头的当前运动方向.
public int getCurr_direction(){
int intLen = this.getLen();
SnakeUnit su = null;
if (intLen<1)
return -1;
su = (SnakeUnit)unit_list.get(0);
return su.getCurr_direction();
}
//只设置蛇头的运动方向.
public void setCurr_direction(int curr_direction) {
int intLen = this.getLen();
SnakeUnit su = null;
if (intLen<1)
return;
su = (SnakeUnit)unit_list.get(0);
su.setCurr_direction(curr_direction);
}
//这里,不会用到这个方法,但有必须实现它.因为她是SnakeUnit中的
//抽象方法.
protected void doDraw(final Graphics g){
}
public void draw(final Component pComponent){
if (pComponent == null)
return ;
int intLen = this.getLen();
SnakeUnit su = null;
Graphics g = null;
for(int i=0; i<intLen; i++){
su = (SnakeUnit)unit_list.get(i);
g = pComponent.getGraphics();
su.doDraw(g);
g.dispose();
}
}
//向指定方向移动
//这是个核心方法,控制蛇体的运动.
//pDirection 确定蛇头的运动方向,蛇头的运动方向会影响其它移动单元的运动,
//第n个单元的下一步运动方向取决于第n-1个单元的当前运动方向
public void move(final ISnake pValue,final Component pComponent){
if (pValue == null || pComponent == null)
return;
try{
MoveStrategy ms = (MoveStrategy)Class.forName("com.cxlife.snake.DefaultMoveStrategy").newInstance();
ms.move(this,pValue,pComponent);
}catch(Exception e){
e.printStackTrace();
}
}
public void addUnit(final SnakeUnit pSu){
if (pSu == null)
return;
unit_list.add(pSu);
adjustUnit(pSu);
}
//调整移动单元的位置.
private void adjustUnit(SnakeUnit pSu){
if (pSu == null)
return;
//根据前一个移动单元的移动方向和位置类决定新增加移动单元的位置,
//和移动方向.
//获取最后一个移动单元.
SnakeUnit su = null;
int intLen = this.getLen();
if (intLen<1)
return;
if (intLen == 1)
su = (SnakeUnit)unit_list.get(0);
else
su = (SnakeUnit)unit_list.get(intLen - 2);
//1:调整移动方向
pSu.curr_direction = su.curr_direction;
pSu.next_direction = su.curr_direction;
//2:调整位置
if (this.curr_direction == Direction.NORTH){
//在纸上画一下就可以看出他们的坐标关系
pSu.left = su.left - (su.width/2 - pSu.width/2);
pSu.top = su.top + su.height;
}else if(this.curr_direction == Direction.SOUTH){
pSu.left = su.left + (su.width/2 - pSu.width/2);
pSu.top = su.top - pSu.height;
}else if (this.curr_direction == Direction.WEAST){
pSu.left = su.left + su.width;
pSu.top = su.top - (su.height/2 - pSu.height/2);
}else{
pSu.left = su.left - pSu.width;
pSu.top = su.top - (su.height/2 - pSu.height/2);
}
}
public void addUnit(final int pIndex,final SnakeUnit pSu){
if (pSu == null)
return;
unit_list.add(pIndex,pSu);
}
public void delUnit(final SnakeUnit pSu){
if (pSu == null)
return;
unit_list.remove(pSu);
}
public void delUnit(final int pIndex){
unit_list.remove(pIndex);
}
public int getLen(){
return unit_list.size();
}
public Object clone(){
Snake result = new Snake();
result.unit_list = (ArrayList)this.unit_list.clone();
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -