这是游戏贪食蛇的游戏代码,我不知道为什么运行后只显示一个JFRAME的框,画布还有蛇什么的都没有显示,代码语法上没错,不知道逻辑上哪错了,请指点,在线等,解决就给分import java.awt.*;
import java.awt.event.*;import javax.swing.*;import java.util.*;
public class EatSnake implements KeyListener
{
JFrame f;
Canvas c;
SnakeModel snakeModel= null;
public static final int cw=450;
public static final int ch=400;
public static final int nw=10;
public static final int nh=10;
public EatSnake()
{
f= new JFrame("she");
Container cp = f.getContentPane();
c= new Canvas();
c.setSize(cw,ch);
c.addKeyListener(this);
cp.add(c, BorderLayout.CENTER);
f.addKeyListener(this);
f.pack();
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
begin();
}
public void keyPressed(KeyEvent e)
{
int KeyCode=e.getKeyCode();
if(snakeModel.running)
switch(KeyCode)
{
case KeyEvent.VK_UP:
snakeModel.changeDirection(snakeModel.UP);
break;
case KeyEvent.VK_DOWN:
snakeModel.changeDirection(snakeModel.DOWN);
break;
case KeyEvent.VK_LEFT:
snakeModel.changeDirection(snakeModel.LEFT);
break;
case KeyEvent.VK_RIGHT:
snakeModel.changeDirection(snakeModel.RIGHT);
break;
default:
}
if(KeyCode==KeyEvent.VK_R)
snakeModel.running=false;
begin();
} public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
void repaint()
{
Graphics g=c.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(10,0,cw,ch);
g.setColor(Color.BLACK);
LinkedList l=snakeModel.nodeArray;
Iterator it=l.iterator();
while(it.hasNext())
{
Node n=(Node)it.next();
drawnode(g,n);
}
g.setColor(Color.RED);
Node n = snakeModel.food;
drawnode(g,n);
}
private void drawnode(Graphics g,Node n)
{
g.fillRect(n.x*nw,n.y*nh,nw-1,nh-1);
}
void begin()
{
if (snakeModel == null || !snakeModel.running)
{
snakeModel = new SnakeModel(this,cw/nw,ch/nh);
(new Thread(snakeModel)).start();
}
}
class SnakeModel implements Runnable
{
EatSnake es;
boolean[][] matrix;
LinkedList nodeArray = new LinkedList();
Node food;
int maxX;
int maxY;
int direction = 2;
int timeInterval = 200;
boolean running = false;
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public SnakeModel(EatSnake es,int maxX,int maxY)
{
this.es = es;
this.maxX = maxX;
this.maxY = maxY;
matrix= new boolean[maxX][];
for(int i=0;i<maxX;++i)
{
matrix[i]=new boolean [maxY];
Arrays.fill(matrix[i],false);
}
int intarraylenth=maxX/2;
for(int i=0;i<intarraylenth;i++)
{
int x=maxX/2+i;
int y=maxY/2;
nodeArray.addLast(new Node(x,y));
matrix[x][y]=true;
}
food = createfood();
matrix[food.x][food.y] = true;
}
public void changeDirection(int newDirection)
{
if (direction % 2 != newDirection % 2)
{
direction = newDirection;
}
}
public boolean moveOn()
{
Node n = (Node)nodeArray.getFirst();
int x = n.x;
int y = n.y; switch(direction)
{
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
if((0 <= x && x < maxX) && (0 <= y && y < maxY))
{
if(matrix[x][y]=true)
{
if(x==food.x&&y==food.y)
{
nodeArray.addFirst(food);
food=createfood();
matrix[food.x][food.y]=true;
return true;
}
else return false;
}
else
{
nodeArray.addFirst(new Node(x,y));
matrix[x][y]=true;
n=(Node)nodeArray.removeLast();
matrix[n.x][n.y]=true;
return true;
}
}
else return false;
}
public void run()
{
running=true;
while (running)
{
try{
Thread.sleep(timeInterval);
}
catch(Exception e)
{
break;
}
}
if (moveOn())
{
es.repaint();
}
else
{
JOptionPane.showMessageDialog(
null,
"you failed",
"Game Over",
JOptionPane.INFORMATION_MESSAGE);
}
running=false;
}
public Node createfood()
{
int x=0;
int y=0;
do
{Random r= new Random();
x=r.nextInt(maxX);
y=r.nextInt(maxY);
return new Node(x,y);}
while(matrix[x][y]);
}
}
class Node
{
int x;
int y;
Node(int x,int y)
{
this.x=x;
this.y=y;
}
}
public static void main(String args[])
{
EatSnake es=new EatSnake();
}}
import java.awt.event.*;import javax.swing.*;import java.util.*;
public class EatSnake implements KeyListener
{
JFrame f;
Canvas c;
SnakeModel snakeModel= null;
public static final int cw=450;
public static final int ch=400;
public static final int nw=10;
public static final int nh=10;
public EatSnake()
{
f= new JFrame("she");
Container cp = f.getContentPane();
c= new Canvas();
c.setSize(cw,ch);
c.addKeyListener(this);
cp.add(c, BorderLayout.CENTER);
f.addKeyListener(this);
f.pack();
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
begin();
}
public void keyPressed(KeyEvent e)
{
int KeyCode=e.getKeyCode();
if(snakeModel.running)
switch(KeyCode)
{
case KeyEvent.VK_UP:
snakeModel.changeDirection(snakeModel.UP);
break;
case KeyEvent.VK_DOWN:
snakeModel.changeDirection(snakeModel.DOWN);
break;
case KeyEvent.VK_LEFT:
snakeModel.changeDirection(snakeModel.LEFT);
break;
case KeyEvent.VK_RIGHT:
snakeModel.changeDirection(snakeModel.RIGHT);
break;
default:
}
if(KeyCode==KeyEvent.VK_R)
snakeModel.running=false;
begin();
} public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
void repaint()
{
Graphics g=c.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(10,0,cw,ch);
g.setColor(Color.BLACK);
LinkedList l=snakeModel.nodeArray;
Iterator it=l.iterator();
while(it.hasNext())
{
Node n=(Node)it.next();
drawnode(g,n);
}
g.setColor(Color.RED);
Node n = snakeModel.food;
drawnode(g,n);
}
private void drawnode(Graphics g,Node n)
{
g.fillRect(n.x*nw,n.y*nh,nw-1,nh-1);
}
void begin()
{
if (snakeModel == null || !snakeModel.running)
{
snakeModel = new SnakeModel(this,cw/nw,ch/nh);
(new Thread(snakeModel)).start();
}
}
class SnakeModel implements Runnable
{
EatSnake es;
boolean[][] matrix;
LinkedList nodeArray = new LinkedList();
Node food;
int maxX;
int maxY;
int direction = 2;
int timeInterval = 200;
boolean running = false;
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public SnakeModel(EatSnake es,int maxX,int maxY)
{
this.es = es;
this.maxX = maxX;
this.maxY = maxY;
matrix= new boolean[maxX][];
for(int i=0;i<maxX;++i)
{
matrix[i]=new boolean [maxY];
Arrays.fill(matrix[i],false);
}
int intarraylenth=maxX/2;
for(int i=0;i<intarraylenth;i++)
{
int x=maxX/2+i;
int y=maxY/2;
nodeArray.addLast(new Node(x,y));
matrix[x][y]=true;
}
food = createfood();
matrix[food.x][food.y] = true;
}
public void changeDirection(int newDirection)
{
if (direction % 2 != newDirection % 2)
{
direction = newDirection;
}
}
public boolean moveOn()
{
Node n = (Node)nodeArray.getFirst();
int x = n.x;
int y = n.y; switch(direction)
{
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
if((0 <= x && x < maxX) && (0 <= y && y < maxY))
{
if(matrix[x][y]=true)
{
if(x==food.x&&y==food.y)
{
nodeArray.addFirst(food);
food=createfood();
matrix[food.x][food.y]=true;
return true;
}
else return false;
}
else
{
nodeArray.addFirst(new Node(x,y));
matrix[x][y]=true;
n=(Node)nodeArray.removeLast();
matrix[n.x][n.y]=true;
return true;
}
}
else return false;
}
public void run()
{
running=true;
while (running)
{
try{
Thread.sleep(timeInterval);
}
catch(Exception e)
{
break;
}
}
if (moveOn())
{
es.repaint();
}
else
{
JOptionPane.showMessageDialog(
null,
"you failed",
"Game Over",
JOptionPane.INFORMATION_MESSAGE);
}
running=false;
}
public Node createfood()
{
int x=0;
int y=0;
do
{Random r= new Random();
x=r.nextInt(maxX);
y=r.nextInt(maxY);
return new Node(x,y);}
while(matrix[x][y]);
}
}
class Node
{
int x;
int y;
Node(int x,int y)
{
this.x=x;
this.y=y;
}
}
public static void main(String args[])
{
EatSnake es=new EatSnake();
}}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*
* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
* 作者:千里冰封
* 日期:2006年6月25日15:47
*/
public class Snake extends JPanel{
private Direction dir;//要走的方向
private int blockWidth=10;//块大小
private int blockSpace=2;//块之间的间隔
private long sleepTime;//重画的进间间隔
private MySnake my;
private int total;//代表蛇的长度
private Rectangle food;//代表蛇的食物
private volatile boolean go;
private int round;//表示第几关
public Snake(JFrame jf){
initOther();
//为顶级窗口类JFrame添加事件处理函数
jf.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent ke){
int code=ke.getKeyCode();
if(code==KeyEvent.VK_RIGHT){
if(dir!=Direction.WEST)
dir=Direction.EAST;
}
else if(code==KeyEvent.VK_LEFT){
if(dir!=Direction.EAST)
dir=Direction.WEST;
}
else if(code==KeyEvent.VK_UP){
if(dir!=Direction.SOUTH)
dir=Direction.NORTH;
}
else if(code==KeyEvent.VK_DOWN){
if(dir!=Direction.NORTH)
dir=Direction.SOUTH;
}
else if(code==KeyEvent.VK_ENTER){
if(!go)
initOther();
}
}
});
this.setBounds(300,300,400,400);
this.setVisible(true);
}
//随机生成一个食物的位置
private void makeFood(){
int x=40+(int)(random()*30)*12;
int y=10+(int)(random()*30)*12;
food=new Rectangle(x,y,10,10);
}
//做一些初始化的工作
private void initOther(){
dir=Direction.EAST;
sleepTime=500;
my=new MySnake();
makeFood();
total=3;
round=1;
new Thread(new Runnable(){
public void run(){
go=true;
while(go){
try{
Thread.sleep(sleepTime);
repaint();
}
catch(Exception exe){
exe.printStackTrace();
}
}
}
}).start();
}
//处理多少关的函数
private void handleRound(){
if(total==6){
round=2;
sleepTime=300;
}
else if(total==10){
round=3;
sleepTime=200;
}
else if(total==15){
round=4;
sleepTime=100;
}
else if(total==18){
round=5;
sleepTime=50;
}
else if(total==20){
round=6;
sleepTime=20;
}
else if(total>21){
round=7;
sleepTime=15;
}
}
//把自己的组件全部画出来
public void paintComponent(Graphics g){
g.setColor(Color.PINK);
g.fillRect(0,0,this.getWidth(),this.getHeight());
g.setColor(Color.BLACK);
g.drawRect(40,10,358,360);
if(go){
my.move();
my.draw(g);
g.setFont(new Font("黑体",Font.BOLD,20));
g.drawString("您的得分:"+(total*10)+" 第"+round+"关",40,400);
}
else{
g.setFont(new Font("黑体",Font.BOLD,20));
g.drawString("游戏结束,按回车(ENTER)键重玩!",40,440);
}
g.setColor(Color.RED);
g.fillRect(food.x,food.y,food.width,food.height);
}
private class MySnake{
private ArrayList<Rectangle> list;
public MySnake(){
list=new ArrayList<Rectangle>();
list.add(new Rectangle(160+24,130,10,10));
list.add(new Rectangle(160+12,130,10,10));
list.add(new Rectangle(160,130,10,10));
}
//蛇移动的方法
public void move(){
if(isDead()){
go=false;
return;
}
if(dir==Direction.EAST){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x+(blockWidth+blockSpace),rec.y,rec.width,rec.height);
list.add(0,rec1);
}
else if(dir==Direction.WEST){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x-(blockWidth+blockSpace),rec.y,rec.width,rec.height);
list.add(0,rec1);
}
else if(dir==Direction.NORTH){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x,rec.y-(blockWidth+blockSpace),rec.width,rec.height);
list.add(0,rec1);
}
else if(dir==Direction.SOUTH){
Rectangle rec=list.get(0);
Rectangle rec1=new Rectangle(rec.x,rec.y+(blockWidth+blockSpace),rec.width,rec.height);
list.add(0,rec1);
}
if(isEat()){
handleRound();
makeFood();
}
else{
list.remove(list.size()-1);
}
}
//判断是否吃到了食物
private boolean isEat(){
if(list.get(0).contains(food)){
total++;
return true;
}
else
return false;
}
//判断是否死了,如果碰壁或者自己吃到自己都算死了
private boolean isDead(){
Rectangle temp=list.get(0);
if(dir==Direction.EAST){
if(temp.x==388)
return true;
else{
Rectangle comp=new Rectangle(temp.x+12,temp.y,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else if(dir==Direction.WEST){
if(temp.x==40)
return true;
else {
Rectangle comp=new Rectangle(temp.x-12,temp.y,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else if(dir==Direction.NORTH){
if(temp.y==10)
return true;
else{
Rectangle comp=new Rectangle(temp.x,temp.y-12,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else if(dir==Direction.SOUTH){
if(temp.y==358)
return true;
else{
Rectangle comp=new Rectangle(temp.x,temp.y+12,10,10);
for(Rectangle rec:list){
if(rec.contains(comp))
return true;
}
}
return false;
}
else{
return false;
}
}
//把自己画出来
public void draw(Graphics g){
for(Rectangle rec:list){
g.fillRect(rec.x,rec.y,rec.width,rec.height);
}
}
}
public static void main(String arsg[]){
JFrame jf=new JFrame("贪吃蛇");
Snake s=new Snake(jf);
jf.getContentPane().add(s,BorderLayout.CENTER);
jf.setBounds(300,300,500,500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//定义一个枚举,在此也可以用接口或者常量值代替
enum Direction{
EAST,
SOUTH,
WEST,
NORTH;
}
{
...
}没有把 moveOn() 和 es.repaint()包进来.