写了一个 贪吃蛇小程序 结果出错 请大家帮忙看下

sike2008 2010-12-03 07:55:00
写了一个 贪吃蛇小程序 结果出错
public class snake extends View {
Bitmap bmsnake; // 贪吃蛇的图片
Bitmap bmbean; // 小豆子图片
int snakelong = 3; // 贪吃蛇的长度
float snakeX = 63; // X的初始位置
float snakeY = 0; // Y的初始位置
// 可供玩家选择的方向
int up = 0;
int down = 0;
int right = 1;
int left = 0;
// 根据判断 是否生成新的小豆子
boolean bean = true;
// 生成小豆子 所在的坐标系
float beanX = 0;
float beanY = 0;
ArrayList<Float> positionX = new ArrayList<Float>();
ArrayList<Float> positionY = new ArrayList<Float>();

public snake(Context context) {
super(context);
// 得到图片
bmsnake = ((BitmapDrawable) getContext().getResources().getDrawable(
R.drawable.redstar)).getBitmap();
bmbean = ((BitmapDrawable) (BitmapDrawable) getContext().getResources()
.getDrawable(R.drawable.yellowstar)).getBitmap();
for (int i = 0; i < snakelong; i++) {
positionX.add(i, (snakeX - i * bmsnake.getWidth()));
positionY.add(i, (snakeY));
}
// 开辟一个时间定时器 每隔500毫秒执行一次
Timer tm = new Timer();
tm.schedule(new mytimer(), 200, 500);
}

class mytimer extends TimerTask {

@Override
public void run() {
Message msg = new Message();
msg.what = 110;
ck.handleMessage(msg); // 给自己发送信息
}
}

// 回调函数 给自己发送信息
Handler.Callback ck = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 110) {
if (up == 1) {
snakeY -= 21;
}
if (down == 1) {
snakeY += 21;
}
if (right == 1) {
snakeX += 21;
}
if (left == 1) {
snakeX -= 21;
}
}

// 当贪吃蛇吃到豆子时
if (snakeX == beanX && snakeY == beanY) {
bean = true;
snakelong++;
}
// 保存小蛇当前的路线
for (int i = snakelong - 1; i > 0; i--) {
positionX.set(i, positionX.get(i - 1));
positionY.set(i, positionY.get(i - 1));
}
if (snakeX > 310) {
snakeX = 0;
}
if (snakeY > 420) {
snakeY = 0;
}
if (snakeX < 0) {
snakeX = 310;
}
if (snakeY < 0) {
snakeY = 420;
}
return false;

}
};

// 设置 小蛇走的方向
public void setPath(String path) {
if (path == "up") {
up = 1;
down = 0;
right = 0;
left = 0;
} else if (path == "down") {
up = 0;
down = 1;
right = 0;
left = 0;
} else if (path == "right") {
up = 0;
down = 0;
right = 1;
left = 0;
} else if (path == "left") {
up = 0;
down = 0;
right = 0;
left = 1;
}
}

// 画图
@Override
protected void onDraw(Canvas canvas) {
positionX.set(0, snakeX);
positionY.set(0, snakeY);
Paint p = new Paint();
for (int i = 0; i < snakelong; i++) {
canvas.drawBitmap(bmsnake, positionX.get(i), positionY.get(i), p);
}
if (bean == true) {
beanX = (float) (new Random().nextInt(14) * 21);
beanY = (float) (new Random().nextInt(20) * 21);
bean = false;
}
canvas.drawBitmap(bmbean, beanX, beanY, p);
super.onDraw(canvas);
postInvalidate(); // 刷新
}
}
当我的小蛇吃到豆子的时候 系统就崩溃,大家帮忙看一下 是哪里的问题
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sike2008 2010-12-03
  • 打赏
  • 举报
回复
哈哈 我解决了
谢谢以上几位朋友
sike2008 2010-12-03
  • 打赏
  • 举报
回复
那怎么解决呢
ameyume 2010-12-03
  • 打赏
  • 举报
回复
set函数的第一个参数溢出。
positionX.set(i, positionX.get(i - 1));
positionY.set(i, positionY.get(i - 1));
这两句有问题,当吃到豆子时,i = 3;
positionX.set(3, positionX.get(2));
此时你的positionX中只有三个数,最大索引为2,用3就溢出了,正如错误信息一样
anshengji 2010-12-03
  • 打赏
  • 举报
回复
大概一楼说的是正确的
sike2008 2010-12-03
  • 打赏
  • 举报
回复
12-03 00:17:08.091: ERROR/AndroidRuntime(289): java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
12-03 00:17:08.091: ERROR/AndroidRuntime(289): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
12-03 00:17:08.091: ERROR/AndroidRuntime(289): at java.util.ArrayList.set(ArrayList.java:481)
12-03 00:17:08.091: ERROR/AndroidRuntime(289): at com.sike.snake.snake$1.handleMessage(snake.java:87)
12-03 00:17:08.091: ERROR/AndroidRuntime(289): at com.sike.snake.snake$mytimer.run(snake.java:57)
12-03 00:17:08.091: ERROR/AndroidRuntime(289): at java.util.Timer$TimerImpl.run(Timer.java:289)
这个是错误信息

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧