贪食蛇怎么走的这么奇葩....

醉you 2014-06-27 11:30:52
为什么这个蛇有的时候会一下走两格?一卡一卡的 找了好久都没有找出错误....才这么点程序不会是电脑卡造成的吧,求大神帮忙看看



[code=
public class GameTest {

public static void main(String[] args) {

Yard y = new Yard(new Snake());
y.gameBegin();
}

}

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Yard extends Frame{
private Snake snake;
//private Egg egg;
//private Wall wall;

public Yard(Snake snake){
super("贪食蛇");
this.snake = snake;
//this.egg = egg;
//this.wall = wall;
this.setBounds(0, 0, util.COLS * util.SIZE, util.ROWS * util.SIZE);
this.setBackground(Color.GRAY);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setVisible(true);
this.addKeyListener(new KeyMoniter());
}

private Image ibuffer;
private Graphics gbuffer;
public void update(Graphics g) {
if(ibuffer == null){
ibuffer = this.createImage(this.getSize().width,this.getSize().width);
gbuffer = ibuffer.getGraphics();
}
gbuffer.setColor(getBackground());
gbuffer.fillRect(0, 0, this.getSize().width, this.getSize().height);
paint(gbuffer);
g.drawImage(ibuffer, 0, 0, null);
}

Font font = new Font("宋体", Font.BOLD, 20);

public void paint(Graphics g) {
System.out.println("画出游戏界面和格子不包括窗口");

g.setColor(Color.BLACK);
//画出横线
for(int i = 0; i < util.ROWS; i++){
g.drawLine(0, util.SIZE * i, util.SIZE * util.COLS, util.SIZE * i);
}
//画出竖线
for(int i = 0; i < util.COLS; i++){
g.drawLine(util.SIZE * i, 0, util.SIZE * i, util.SIZE * util.ROWS);
}
g.setFont(font);
g.setColor(Color.red);
g.drawString("score: ", 1 * util.SIZE, 3 * util.SIZE);
g.drawString(util.getScore(), 6 * util.SIZE, 3 * util.SIZE);
//wall.drawMe();
snake.drawMe(g);
//egg.drawMe();
}

private class snakeThread implements Runnable{//蛇不断移动
public void run() {
while(true){
repaint();
snake.move();
try {
Thread.sleep(util.TEMPO);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void start(){
new Thread(new snakeThread()).start();
}

public void gameBegin() {
System.out.println("开始游戏");
start();
}

public class KeyMoniter extends KeyAdapter{
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_UP :
snake.changeDir(util.UP);
break;
case KeyEvent.VK_DOWN :
snake.changeDir(util.DOWN);
break;
case KeyEvent.VK_LEFT :
snake.changeDir(util.LEFT);
break;
case KeyEvent.VK_RIGHT :
snake.changeDir(util.RIGHT);
break;
}
}
}
}


import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;

public class Snake {

private int dir ;//蛇方向

private Yard yard;

public LinkedList<body> bodys = new LinkedList<body>();

public Snake(){
init();
}

private void init(){//初始化方法
for(int i = 0; i < util.INIT; i++){
bodys.addLast(new body(util.C_ROW,util.C_COL+i));
}
dir = util.LEFT;
}

public void move(){
System.out.println("蛇移动");
//去尾
bodys.removeLast();
//加头
body b = bodys.getFirst();
int row = b.ROW;
int col = b.COL;
switch(this.dir){
case util.UP:
if(row < 2){
row = util.ROWS-2;
}else{
row--;
}
break;
case util.DOWN:
if(row > util.ROWS-2){
row = 2;
}else{
row++;
}
break;
case util.LEFT:
if(col < 2){
col = util.COLS-2;
}else{
col--;
}
break;
case util.RIGHT:
if(col > util.COLS-2){
col = 2;
}else{
col++;
}
break;
}
bodys.addFirst(new body(row, col));

}

public void changeMove(){
System.out.println("改变蛇移动速度");
}

public void changeDir(int dir){
System.out.println("蛇改变方向");
this.dir = dir;
}

public void eatEgg(){
System.out.println("蛇吃蛋");
}

public boolean isEatBody(){
System.out.println("判断蛇是否吃到身体");
return false;
}

public void drawMe(Graphics g){
System.out.println("画出蛇");
g.setColor(Color.BLUE);
for(body b: bodys){
g.fill3DRect(b.COL * util.SIZE, b.ROW * util.SIZE, util.SIZE, util.SIZE, true);
}
}

public void die(){
System.out.println("蛇死了");
}

private static class body{//蛇身体类
private int ROW ;
private int COL ;

public body(int rOW, int cOL) {
ROW = rOW;
COL = cOL;
}

public int getROW() {
return ROW;
}

public void setROW(int rOW) {
ROW = rOW;
}

public int getCOL() {
return COL;
}

public void setCOL(int cOL) {
COL = cOL;
}
}


}

//参数类
public class util {
//游戏界面参数
public static final int ROWS = 30;//行
public static final int COLS = 30;//列
public static final int SIZE = 15;

//蛇参数
public static final int INIT = 10; //初始时蛇身长度
//蛇移动速度参数
public static final int TEMPO = 1000;
public static final int SLOW = 1000;
public static final int CENTER = 600;
public static final int FAST = 300;
public static final int MIN = 100;
//蛇初始位置
public static final int C_COL = COLS/2;
public static final int C_ROW = ROWS/2;

//方向参数
public static final int UP = -1;
public static final int DOWN = 1;
public static final int LEFT = -2;
public static final int RIGHT = 2;

//分数
public static Integer score = 0;

public void setScore(int score){
this.score = score;
}
public static String getScore() {
// TODO Auto-generated method stub
return score.toString();
}
}


[/code]
...全文
146 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:WiFiSupply斯普莱WFS7000X25是一款5GHz全频段、300Mbps无线速率的经济型工业级大功率机载无线终端,支持802.11a/n标准及TDMA时分多址私有协议,具备强抗干扰能力、通信延迟低于1ms、无缝漫游切换延迟≤30ms等特点。设备采用2T2R MIMO技术,支持4920MHz~6100MHz宽频段和5/10/20/40MHz频宽,发射功率达25dBm(320mW),配合基站可在空旷环境下实现1公里以上传输距离。产品具备IP54防护等级,支持-45℃~85℃宽温工作,通过EMC、防雷浪涌、高低温等多项权威认证,内置多重看门狗机制保障长期稳定运行。支持胖瘦一体模式、Fast Roaming快速漫游、链路聚合、主备链路、VLAN、QoS、VPN、巨量安全隧道等多种高级网络功能,并可通过Web、图形化软件、云端或第三方平台进行统一管理,提供API接口支持定制化集成。; 适合人群:从事工业自动化、智慧物流、智能制造等领域中无线通信系统设计、部署与运维的工程技术人员及网络管理人员。; 使用场景及目标:①用于AMR/AGV/RGV、无人叉车、四向穿梭车、堆垛机等移动设备的高速稳定无线接入;②实现室内外远距离无线桥接与覆盖,如车载、船载、火车视频回传、无人机遥控等场景;③构建高安全性、高可靠性的工业无线网络,满足PLC数据传输、分拣系统控制、物联网拓展等需求; 阅读建议:此文档为产品技术说明书,重点在于掌握其技术参数、功能特性和行业应用方案,建议结合实际项目需求关注供电方式、安装选项、漫游性能、安全加密及管理接口等内容,并参考官方提供的配置工具与API文档进行系统集成与调试。

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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