软件工程综合实践专题个人博客第一次作业
软件工程综合实践专题个人博客第一次作业,这个贪吃蛇游戏的键盘控制功能和蛇吃蛋的功能,是用java编写的。来源于简书网https://www.jianshu.com/p/e7d72be38bc4
首先附上源代码:
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT :
if(head.dir!=Direction.R){
head.dir = Direction.L;
}
break;
case KeyEvent.VK_UP :
if(head.dir!=Direction.D){
head.dir = Direction.U;
}
break;
case KeyEvent.VK_RIGHT :
if(head.dir!=Direction.L){
head.dir = Direction.R;
}
break;
case KeyEvent.VK_DOWN :
if(head.dir!=Direction.U){
head.dir = Direction.D;
}
break;
}
}
public void move() {
addNodeInHead();
deleteNodeInTail();
}
private void deleteNodeInTail() {
Node node = tail.pre;
tail = null;
node.next = null;
tail = node;
}
private void addNodeInHead() {
Node node = null;
switch(head.dir){
case L:
node = new Node(head.row,head.col-1,head.dir);
break;
case U:
node = new Node(head.row-1,head.col,head.dir);
break;
case R:
node = new Node(head.row,head.col+1,head.dir);
break;
case D:
node = new Node(head.row+1,head.col,head.dir);
break;
}
node.next = head;
head.pre = node;
head = node;
}
//最后,在draw中调用move方法即可
public void draw(Graphics g){
if(head==null){
return ;
}
move();
for(Node node = head;node!=null;node = node.next){
node.draw(g);
}
}
public class Egg {
//所在的位置
private int row;
private int col;
//大小
private static final int BLOCK_WIDTH = SnakeFrame.BLOCK_WIDTH;
private static final int BLOCK_HEIGHT = SnakeFrame.BLOCK_HEIGHT;
private static final Random r = new Random();
private Color color = Color.RED;
public Egg(int row, int col) {
this.row = row;
this.col = col;
}
public Egg() {
this((r.nextInt(SnakeFrame.ROW-2))+2,(r.nextInt(SnakeFrame.COL-2))+2);
}
/*
* 改变当前对象的位置,即完成蛋的重现
* */
public void reAppear(){
this.row = (r.nextInt(SnakeFrame.ROW-2))+2;
this.col = (r.nextInt(SnakeFrame.COL-2))+2;
}
public void draw(Graphics g){
Color c= g.getColor();
g.setColor(color);
g.fillOval(col*BLOCK_WIDTH, row*BLOCK_HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT);
g.setColor(c);
//改变下一次的颜色
if(color==Color.RED){
color = Color.BLUE;
}
else{
color = Color.RED;
}
}
//用于碰撞检测
public Rectangle getRect(){
return new Rectangle(col*BLOCK_WIDTH, row*BLOCK_HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT);
}
}
public Rectangle getRect(){
return new Rectangle(head.col*BLOCK_WIDTH, head.row*BLOCK_HEIGHT, BLOCK_WIDTH, BLOCK_HEIGHT);
}
public boolean eatEgg(Egg egg){
if(this.getRect().intersects(egg.getRect())){
addNodeInHead();
egg.reAppear();
return true;
}
else{
return false;
}
}
过程分析:
1、在第一段代码,通过操作键盘来控制贪吃蛇的方向的这一过程中,写入一个keyPressed的类,用来对键盘的方向做出反应,用一个switch语句,四个case,来反映键盘四个方向,然后move方法再根据头结点的方向来在头添加
一个单元格,在尾部减少一个单元格,实现了保持贪吃蛇的总长度不变而贪吃蛇方向的改变的效果。
2、在全局添加一个getRect类用于检测是否碰到墙壁。
3、在蛇吃蛋这个功能中,首先建立一个egg类用于蛋的生成,eatEgg类用于检测是否吃到蛋,当吃到蛋的时候,蛇身长度增加1并且重新调用egg中的reAppear功能重新生成一个蛋,该方法是通过改变蛋的位置来实现的,与此同时,调用setColor方
法同时改变蛋的颜色。
优缺点:该贪吃蛇的方向改变的控制与蛇吃蛋的设计很经典,也很简洁,基本是大多数贪吃蛇操作的实现的代码,但是与此同时,没有考虑蛇身长度最大值的设定以及没有一条总的控制语句用来操作游戏胜利的条件语句。
在深入了解了这个简单的贪吃蛇程序之后,我从中学到了很多知识点,也有点明白了“实践是检验真理的唯一标准”这句话。与此同时,思维一定要多发散,争取把每一个点都想到,这样才能减少后期维护的成本,要不经常出bug对用户的体验也不好。
浙公网安备 33010602011771号