//该类是食物相关类,实现同一时间有且仅有一个食物存在,主要利用多线程的通信机制
packageSnake;importjava.util.Random;public classGetFood {//食物消失与生成的类//每一个食物也是一个节点
Random rx = new Random();//随机生成食物的x坐标
Random ry = new Random();//随机生成食物的y坐标
Random rc = newRandom();//将背景按节点大小划分为一定的格子,食物只能产生在格子中以保证蛇一定可以吃到
int rowy = Background.BACK_WIDTH/Node.NODE_DIA;int rowx = Background.BACK_HEIGHT/Node.NODE_DIA;//食物类
classFood{//坐标
public int foodx =-1;public int foody =-1;public int color = 1;//是否需要产生食物
public boolean isGetFood = true;//计算分数
int count=0;
}//用多线程实现食物的消亡与产生,利用等待唤醒机制保证食物的同步
class CreateFood extendsThread {//提供锁对象
privateFood food;publicCreateFood(Food food){this.food=food;
}
@Overridepublic voidrun() {while(true){synchronized(food){if(!food.isGetFood){try{
food.wait();//如果有食物进入等待
} catch(InterruptedException e) {
e.printStackTrace();
}
}else{//如果没有食物随机生成一个食物(坐标)
if(Is.is_Strength){
food.color=(int)(Math.random()*10);
}
food.foodx=Node.NODE_DIA*(rx.nextInt(rowy-2)+1);
food.foody=Node.NODE_DIA*(ry.nextInt(rowx-3));//设置一定范围,增强游戏体验
food.isGetFood=false;//产生食物以后修改食物的状态
food.notify();//唤醒吃食物的线程
}
}
}
}
}class EatFood extendsThread{private Food food;//提供锁对象
private SnakeClass snake;//蛇(与食物发生碰撞)
publicEatFood(Food food,SnakeClass snake){//构造器
this.food=food;this.snake=snake;
}
@Overridepublic voidrun() {while(true){synchronized(food){if(food.isGetFood){try{
food.wait();//如果没有食物,进入等待
} catch(InterruptedException e) {
e.printStackTrace();
}
}else{//如果有食物进
if (snake.head.nodex==food.foodx&&snake.head.nodey==food.foody){//如果蛇头食物发生碰撞
if(food.color==5||food.color==10||food.color==7){
snake.add_Tail(newNode(snake.get_Tail().nodex,snake.get_Tail().nodey));
snake.add_Tail(newNode(snake.get_Tail().nodex,snake.get_Tail().nodey));
food.foodx=-1;
food.foody=-1;
food.count+=2;
}else if(food.color==4||food.color==8){
snake.deleteTail();
food.foodx=-1;
food.foody=-1;
food.count--;try{
Thread.sleep(3500);
}catch(InterruptedException e) {
e.printStackTrace();
}if(food.count>=SaveMaxCount.read()){
SaveMaxCount.save(food.count);
}
food.isGetFood=true;//修改食物状态
food.notify();//唤醒产生食物的线程
} else{
snake.add_Tail(newNode(snake.get_Tail().nodex,snake.get_Tail().nodey));
food.foodx=-1;
food.foody=-1;
food.count++;
}//System.out.println(food.color);(在测试时查看随机数)//如果当前分数大于历史最大分数,则将当前分数存入文件
if(!food.isGetFood){
food.isGetFood=true;//修改食物状态
food.notify();//唤醒产生食物的线程
}
}
}
}
}
}
}
}