2 xyxxzsky xyxxzsky 于 2015.06.03 12:10 提问

求救啊,java贪吃蛇问题(要达到的效果是出现一个蓝色格子在动)

java贪吃蛇问题(要达到的效果是出现一个蓝色格子在动)
第一个类

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

public class Snake {
Node head = null;
Node tail = null;
int size = 0;
Dir dir = Dir.D;
Node n = new Node(30, 30, Dir.D);
public Snake(){
head = n;
tail = n;
size = 1;
}

class Node{
    int row, col;
    Dir dir;
    Node next = null;
    Node prev = null;
    public static final int nodeW = SnakeMain.BLOCK;
    public static final int nodeH = SnakeMain.BLOCK;
    Node(int row, int col, Dir dir ){
        this.row = row;
        this.col = col;
        this.dir = dir;
    }    

    void draw(Graphics g){
        Color c = g.getColor();
        g.setColor(Color.BLUE);
        g.fillRect(SnakeMain.BLOCK * col, SnakeMain.BLOCK * row, nodeW, nodeH);
        g.setColor(c);    
    }
}

public void draw(Graphics g){
    if(size <= 0) return;

    for(Node m = head; m != null; m = m.next){
        m.draw(g);
    }
    move();
}

private void move() {
    addToHead();
    deleteFromTail();


}

private void deleteFromTail() {
    if(size == 0) return;
    tail = tail.prev;
    tail.next = null;
}
public void addToTail(){
    Node node = null;
    switch(tail.dir){
    case L:
        node = new Node(tail.row, tail.col + 1, tail.dir);
        break;
    case R:
        node = new Node(tail.row, tail.col - 1, tail.dir);
        break;
    case U:
        node = new Node(tail.row + 1, tail.col, tail.dir);
        break;
    case D:
        node = new Node(tail.row - 1, tail.col, tail.dir);
        break;
    }
    tail.next = node;
    node.prev =  tail;
    tail = node;
    size++;
}

public void addToHead(){
    Node node = null;
    switch(head.dir){
    case L:
        node = new Node(head.row, head.col - 1, head.dir);
        break;
    case R:
        node = new Node(head.row, head.col + 1, head.dir);
        break;
    case U:
        node = new Node(head.row - 1, head.col, head.dir);
        break;
    case D:
        node = new Node(head.row + 1, head.col, head.dir);
        break;
    }
    node.next = head;
    head.prev = node;
    head = node;
    size++;
}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key){
    case KeyEvent.VK_UP:
        head.dir  = dir.U;
        break;
    case KeyEvent.VK_DOWN:
        head.dir = dir.D;
        break;
    case KeyEvent.VK_LEFT:
        head.dir = dir.L;
        break;
    case KeyEvent.VK_RIGHT:
        head.dir = dir.R;
        break;
    }   
 }

}

第二个类
import java.awt.*;
import java.awt.event.*;

public class SnakeMain extends Frame {
public static final int BLOCK = 10;
public static final int ROW = 60;
public static final int COLS = 60;
Snake sn = new Snake();
Image offScreenImage = null;
public static void main(String[] args) {
SnakeMain sm = new SnakeMain();
sm.launch();
}

public void launch(){
    setSize(BLOCK * ROW, BLOCK * COLS);
    setBackground(Color.LIGHT_GRAY);
    setResizable(false);
    addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            System.exit(0);
        }
    });
    addKeyListener(new KeyMonitor());
    setVisible(true);
    new Thread(new PaintThread()).start();
}

public void paint(Graphics g){
    Color c = g.getColor();
    g.setColor(Color.YELLOW);
    for(int i = 1; i < ROW; ++i){
        g.drawLine(0, i * BLOCK, BLOCK * ROW, i * BLOCK);
    }
    for(int j = 1; j < COLS; ++j){
        g.drawLine(j * BLOCK, 0, j * BLOCK, BLOCK * COLS);
    }
    g.setColor(c);
    sn.draw(g);
}

public void update (Graphics g){
    if(offScreenImage == null) 
        offScreenImage = this.createImage(BLOCK * ROW, BLOCK * COLS);
    Graphics gr = offScreenImage.getGraphics();
    paint(gr);
    g.drawImage(offScreenImage, 0, 0, null);
}

public class PaintThread implements Runnable{

    public void run() {
        while(true){
            repaint(); 
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

public class KeyMonitor extends KeyAdapter{

    @Override
    public void keyPressed(KeyEvent e) {
        sn.keyPressed(e);
    }

}

}

第三个类

public enum Dir {
D, U, L, R
}

3个回答

jiangs111
jiangs111   2015.06.04 15:04

你需要补充的第三个类?具体点的?具体点的?

qq_26788389
qq_26788389 回复xyxxzsky: 我也遇到了这个问题,请问你解决了吗?
接近 3 年之前 回复
xyxxzsky
xyxxzsky 这是我写贪吃蛇的第一个步骤,不用补充,就是想让以上代码运行起来实现 !只有一个格子! 能被我控制。(但是我运行起来格子只增不减),求大神拯救。
大约 3 年之前 回复
jiangs111
jiangs111   2015.06.04 15:04

你需要补充的第三个类?具体点的?具体点的?

datou431
datou431   Rxr 2015.06.18 15:30

需要补充的第三个类。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
贪吃蛇身子移动的问题
打个笔记吧,为了更好的理解贪吃蛇身子移动的问题,感觉自己总结一下代码比较好,看着别人的demo写的代码光看不总结感觉有点蒙 1、下面是HeadControl.cs中的代码//根据按得按钮判断要移动的方向 public void Turn(){ if (Input.GetKey (KeyCode.W)) { nextDirection=HeadDire
java图形化界面编程之贪吃蛇
package Snake; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.ut
坐标规则型动态规划总结
前言最近按照资料里的ppt的内容进行dp的专题学习,今天总结的是坐标规则型的dp总结,题目并不是很难,但是都很有代表性。例题Robots 题目描述 在一个n∗mn*m的棋盘内,一些格子里有垃圾要拾捡。现在有一个能捡垃圾的机器人从左上格子里出发,每次只能向右或者向下走。每次他到达一个点,就会自动把这个点内的垃圾拾掉。 问:最多能拾多少垃圾。在最多的情况下,有多少种拾垃圾方案? 数
基于51单片机的贪吃蛇游戏
个人设计的贪吃蛇小游戏,利用51单片机运行,所以程序在程序优化上做的比较好。能流畅的运行并能调速。显示用12864液晶屏。附有原理图。
【一】用JavaSE编写简单的贪吃蛇游戏
本项目主要实现了一个简单的贪吃蛇游戏,目前只实现了“吃豆长大、得分”、“碰壁死亡”、“头撞尾死亡”这些功能,是一个最基本版本的贪吃蛇。该"贪吃蛇"游戏编写很简单,因此对于刚学java的新手能够起到很好的学习作用,并且我本次编写的图形设计主要利用Java.awt里最简单基本的类、方法和事件,对于新手掌握gui能够起到很好的促进作用,同时希望我的这篇博客能够帮助新手更好的理解利用面向对象的方式来编程解决问题。
软件只需突出主要功能
最近手头的项目接近收尾了,于是抽了些时间看了以前做过的一些东西,还是有一些感触的。 在项目中曾经做过一个扫描的功能,就是从本地所有磁盘包括外接的磁盘找出指定格式的一些文件。当时在做的过程中其它方面到没有什么难度,反倒是做一个扫描进度的进度条遇到了麻烦。计算当前的进度,无非就是:当前的总个数/电脑的所有文件个数,或者当前的总大小/电脑的所有文件大小,前者,对于扫描几个文件或文件夹那么没有问题,但是
<贪吃蛇java>开发中遇到的问题
01 在给JPanel添加KeyListener时,发现没有效果。  经过调查发现,swing里的KeyListener必须要添加在顶级容器里,即JFrame。且JFrame要setFocusable(true),之后就能接受KeyEvent了 02 在遍历链表时,注意循环的逻辑 for(Node n = head; n.next != null; n = n.next) {
Java学习总结之贪吃蛇项目程序编写(一)
之前写了程序分析,接下来进入程序编写,这次写程序跟之前的项目不一样,之前是新增一个功能,就根据这个功能新增一部分内容,而这次有了程序分析,我打算即使还没有加入新功能,也预留好新功能需要的各种属性和方法,即使某个方法还没有实现,也会在应该调用它的地方以注释的形式加入调用语句。 V0.1:这个版本主要是绘制界面。根据程序设计中的属性和方法,实现如下: SnakeFrame.java import
跳格子问题——阿里笔试
有1,2,3,......无穷个格子,你从1号格子出发,每次1/2概率向前跳一格,1/2概率向前跳两格,走到格子编号为4的倍数时结束,结束时期望走的步数为____。 2 12/5 14/5 16/5 18/5 4 这个问题,很显然考察的是递归问题: 定义step(i,j)为第i号格子带第j号格子的期望值; step(1,4)为从第一格跳到第四格的期望,要到第四格,
本人自己用java编写的一个贪吃蛇程序
本人刚刚接触java,这是本人自己用java编写的第一个小程序--贪吃蛇,附上源代码!有需要的同学可以看看