贪吃蛇源码解析(面向对象)

本文解析了贪吃蛇游戏的源码,包括苹果类、蛇类和房间类的详细实现。苹果类负责生成和更新苹果位置,蛇类包含蛇的位置、移动方向及吃苹果的方法。房间类则包含蛇、苹果集合,以及游戏区域的更新和绘制。通过面向对象设计,实现了游戏的基本逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

苹果类:首先苹果有它自向的属性,就是在什么位置(x,y坐标),,还有就是被蛇吃掉后会自动生成一个新的苹果,

属性:x(横坐标),y(竖坐标)

方法:自动生成新的苹果(create),位置在房间内随机


package com.snake.view;


import java.util.Random;


import com.snake.activity.R;




public class Apple {
//苹果的位置
private int x,y;

private int appleColor=R.drawable.greenstar;

public static final int appleSize=24;

//苹果最大能放在哪个位置上生成
private int maxX,maxY;

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}


public int getY() {
return y;
}


public void setY(int y) {
this.y = y;
}

public int getAppleColor() {
return appleColor;
}



public void setAppleColor(int appleColor) {
this.appleColor = appleColor;
}


public void setMaxX(int mx,int my){
maxX=mx;
maxY=my;
}


//重新生成苹果
public void create(){
System.out.println("生成苹果-----------");
Random random=new Random();
int x=0;y=0;
while(x==0 || y==0){
x=random.nextInt(maxX-1);
y=random.nextInt(maxY-1);
}
this.setX(x);
this.setY(y);
}
}


蛇:蛇有位置属性,以及移动和吃苹果的方法,可以获取蛇身的长度来判断是否进入下一关



package com.snake.view;


import java.util.ArrayList;


import com.snake.activity.R;


public class Snake {

//初始化蛇身
public Snake(){
sections=new ArrayList<SnakeSection>();
sections.add(new SnakeSection(1,1,0));
sections.add(new SnakeSection(2,1,0));
sections.add(new SnakeSection(3,1,0));
sections.add(new SnakeSection(4,1,R.drawable.yellowstar));
}

public ArrayList<SnakeSection> sections;

//四个方向

public static final int up=1;
public static final int down=2;
public static final int left=3;
public static final int right=4;


//蛇运动的方向,默认先向右移动
private int moveDirection=right;


//获取蛇身长度
public int getSnakeLength() {
return sections.size();
}


public int getMoveDirection(){
return moveDirection;
}


public void setMoveDirection(int moveDirection) {
this.moveDirection = moveDirection;
}

/**
*蛇移动的方法
*/

利用面向对象的方法,实现贪吃蛇。 1. 利用面向对象的思想实现——一个食物对象、一个对象、一个游戏总控对象。 2. 在使用××.prototype= {}重写原型对象的时候,一定要加上一句constructor:该对象。不然会造成实例化出来的实例的constructor为object。 3. 在underscore中,使用_.random(a,b)即可获得a-b中的一个随机数。 4. 在求食物的随机位置的时候,用到了panel.clientHeight/this.height - 1) * this.height。 原理是使用盒子的高度/小球的高度,可以算得最多放多少个小球。因为要控制小球不能超过边界,所以总数量要减去1,数量×高度即为随机位置的最大值。 5. 在对象中,用body数组存放身体每一个部分对象。的绘制过程就是遍历body,在面板上绘制。 6. 的移动分为两部分。 ① 节移动到前一个节的位置。直到头后一个节移动到头的位置。 ② 根据direction判断头如何移动。 注意:在游戏绘制的过程中,界面的每一次绘制都要**删除**之前的绘制,不然会叠加到一起。 7. 在的闭包中建一个局部数组,存储对象,可以更加方便的删除操作。 8. 只有在原型对象中的方法和属性,外界是可以调用的。 9. 的移动(动画)必然需要定时器协助。定时器的时间,即象征着刷新速度,也就是难度。 10. this所在的函数在哪一个对象中,this就指向谁。单独写一个函数的时候,如果调用之前对象的this,需要备份指针(将对象的this赋值给另一个变量)。 11. JavaScript原生的键盘按下事件(keydown) 中,事件有一个keyCode属性,其值代表按下的键。其中:37—left、38—top、39—right、40—bottom。 12. 边界控制。通过判断头与最大X和Y的关系,判断是否碰到边界。 13. confirm()方法用于显示一个带有指定消息和确认及取消按钮的对话框。 14. window.location.reload(); 重新加载当前文档 15. window.close() 方法用于关闭浏览器窗口。 16. 与食物的碰撞检测:如果头和食物坐标重叠,将尾添加到body中。并重新绘制一个食物点,将之前的食物删掉。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值