贪吃蛇问题

wnf2009 2010-08-14 07:37:41
贪吃蛇运行后,食物不能随机生成,吃到食物身体不会伸长。而且蛇头碰到自己身体不会输~~~~~~大家帮我看看错在哪里了

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Move{
int move_X;
int move_Y;
Move(int move_X,int move_Y){
this.move_X=move_X;
this.move_Y=move_Y;
}
}
class MoveOperate extends Observable implements Runnable{
public static final int LEFT=1;
public static final int UP=2;
public static final int RIGHT=3;
public static final int DOWN=4;
private boolean isHave[][];
private int move_Direction=LEFT;
private Move food;
private LinkedList snake=new LinkedList();
private boolean running=false;
private int timeSpace=300;
private double speedChange=0.75;
private boolean paused=false;
private int score=0;
private int moveCount=0;
private int X;
private int Y;
public MoveOperate(int X,int Y){
this.X=X;
this.Y=Y;
resetGame();
}
public void run(){
running=true;
while(running){
try{
Thread.sleep(timeSpace);
}catch(InterruptedException e){
System.out.println(e.getMessage());
break;
}
if(!paused){
if(move()){
setChanged();
notifyObservers();
}else{
JOptionPane.showMessageDialog(null,"you are too bad","GAME OVER",JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}
if(!running){
JOptionPane.showMessageDialog(null,"the game is paused","GAME OVER",JOptionPane.INFORMATION_MESSAGE);
}
}
public void resetGame(){
move_Direction=MoveOperate.LEFT;
timeSpace=300;
paused=false;
score=0;
moveCount=0;
isHave=new boolean[X][Y];
for(int i=0;i<X;i++){
isHave[i]=new boolean[Y];
Arrays.fill(isHave[i],false);
}
int initLength=X>20?10:X/2;
snake.clear();
int x=X/2;
int y=Y/2;
for(int i=0;i<initLength;i++){
snake.addLast(new Move(x,y));
isHave[x][y]=true;
x++;
}
food=createFood();
isHave[food.move_X][food.move_Y]=true;
}
public boolean move(){
Move snakeHead=(Move)snake.getFirst();
int headX=snakeHead.move_X;
int headY=snakeHead.move_Y;
switch(move_Direction){
case UP:
headY--;
break;
case DOWN:
headY++;
break;
case LEFT:
headX--;
break;
case RIGHT:
headX++;
break;
}
if((0<=headX&&headX<X)&&(0<=headY&&headY<Y)){
if(isHave[headX][headY]){
if(headX==food.move_X&&headY==food.move_Y){
LinkedList<Move>snake=new LinkedList<Move>();
snake.addFirst(food);
int scoreGet=(10000-200*moveCount)/timeSpace;
score+=scoreGet>0?scoreGet:10;
moveCount=0;
food=createFood();
isHave[food.move_X][food.move_Y]=true;
return true;
}else{
return false;
}
}else{
snake.addFirst(new Move(headX,headY));
isHave[food.move_X][food.move_Y]=true;
snakeHead=(Move)snake.removeLast();
isHave[food.move_X][food.move_Y]=false;
moveCount++;
return true;
}
}
return false;
}
public void changeDirection(int dir){
if(move_Direction%2!=dir%2){
move_Direction=dir;
}
}
private Move createFood(){
int x=0;
int y=0;
do{
Random r=new Random();
x=r.nextInt(X);
y=r.nextInt(Y);
}while(isHave[x][y]);
return new Move(x,y);
}
public void speedUp(){
timeSpace*=speedChange;
}
public void speedDown(){
timeSpace/=speedChange;
}
public void changePauseState(){
paused=!paused;
}
public boolean isRunning(){
return running;
}
public void setRunning(boolean running){
this.running=running;
}
public LinkedList getMoveList(){
return snake;
}
public Move getFood(){
return food;
}
public int getScore(){
return score;
}
}
class SnakeFrame extends JFrame implements Observer{
public static final int gridWidth=10;
public static final int gridHeight=10;
private int gameWidth;
private int gameHeight;
private int gameX=0;
private int startY=0;
JLabel score;
Canvas canvas;
public SnakeFrame(){
this(30,40,0,0);
}
public SnakeFrame(int X,int Y){
this(X,Y,0,0);
}
public SnakeFrame(int X,int Y,int startX,int startY){
this.gameWidth=X*gridWidth;
this.gameHeight=X*gridHeight;
this.gameX=startX;
this.startY=startY;
init();
}
private void init(){
this.setTitle("SNAKE");
this.setLocation(gameX,startY);
Container cp=this.getContentPane();
score=new JLabel("SCORE:");
cp.add(score,BorderLayout.SOUTH);
canvas=new Canvas();
canvas.setSize(gameWidth+1,gameHeight+1);
cp.add(canvas,BorderLayout.CENTER);
this.pack();
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void update(Observable observer,Object obj){
MoveOperate operate=(MoveOperate)observer;
Graphics graphics=canvas.getGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, gameWidth, gameHeight);
graphics.setColor(Color.BLACK);
LinkedList list=operate.getMoveList();
Iterator it=list.iterator();
while(it.hasNext()){
Move move=(Move)it.next();
drawMove(graphics,move);
}
graphics.setColor(Color.RED);
Move move=operate.getFood();
drawMove(graphics,move);
this.updateScore(operate.getScore());
}
private void drawMove(Graphics g,Move n){
g.fillRect(n.move_X*gridWidth, n.move_Y*gridHeight,gridWidth-1,gridHeight-1);
}
public void updateScore(int score){
String s="SCORE:"+score;
this.score.setText(s);
}
}
class ControlSnake implements KeyListener{
private MoveOperate snake;
private SnakeFrame frame;
private int X;
private int Y;
public ControlSnake(){
this.X=30;
this.Y=40;
}
public ControlSnake(int X,int Y){
this();
if((10<X)&&(X<200)&&(10<Y)&&(Y<200)){
this.X=X;
this.Y=Y;
}else{
System.out.println("error");
}
initSnake();
}
private void initSnake(){
this.snake=new MoveOperate(X,Y);
this.frame=new SnakeFrame(X,Y,500,200);
this.snake.addObserver(this.frame);
this.frame.addKeyListener(this);
(new Thread(this.snake)).start();
}public void keyPressed(KeyEvent e){
int KeyCode=e.getKeyCode();
if(snake.isRunning()){
switch(KeyCode){
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
snake.speedDown();
break;
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
snake.speedUp();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
snake.changePauseState();
break;
case KeyEvent.VK_DOWN:
snake.changeDirection(MoveOperate.DOWN);
break;
case KeyEvent.VK_UP:
snake.changeDirection(MoveOperate.UP);
break;
case KeyEvent.VK_LEFT:
snake.changeDirection(MoveOperate.LEFT);
break;
case KeyEvent.VK_RIGHT:
snake.changeDirection(MoveOperate.RIGHT);
break;
default:
}
}
if(KeyCode==KeyEvent.VK_F||KeyCode==KeyEvent.VK_J||KeyCode==KeyEvent.VK_ENTER){
snake.resetGame();
}
if(KeyCode==KeyEvent.VK_S){
snake.setRunning(false);
}
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}
}
public class GameSnake{
public static void main(String[] args){
new ControlSnake(40,30);
}
}
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sainer 2010-08-16
  • 打赏
  • 举报
回复
网上有视频教程,lz看看就知道了
网络咖啡 2010-08-15
  • 打赏
  • 举报
回复
我的BLOG上有个贪吃蛇的代码

照你说的,几乎一个功能都没有实现!
JLinfeng 2010-08-15
  • 打赏
  • 举报
回复


洋洋洒洒上百行,居然没有一行注释,lz这样,是学不好的!!
bekeer 2010-08-14
  • 打赏
  • 举报
回复
慢慢研究一下

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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