初学者字符贪吃蛇空格问题

beginner1231 2018-06-03 10:44:16
代码如下:

package snake;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;


public class SnakeGameV1 {

public final static int WIDTH=50;
public final static int HEIGHT=30;
public final static Random RANDOM=new Random();


char[][] map=new char[HEIGHT][WIDTH];
LinkedList<Point> snake=new LinkedList<Point>();
Point food;
static int never;
static int direction;
JFrame frame;
static boolean gameOver;

{
gameOver=false;
initMap();
initFood();
initSnake();
initDirection();
showFood();
showSnake();
showMap();

JFrame frame=new JFrame("游戏控制");

Toolkit toolKit=java.awt.Toolkit.getDefaultToolkit();
Dimension dimension=toolKit.getScreenSize();
int x=(int) dimension.getWidth();
int y=(int) dimension.getHeight();

frame.setVisible(true);
frame.setBounds((x-300)/2, (y-300)/2, 300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JButton button=new JButton("方向控制");
frame.add(button);
frame.add(new JButton("上"),BorderLayout.NORTH);
frame.add(new JButton("下"),BorderLayout.SOUTH);
frame.add(new JButton("左"),BorderLayout.WEST);
frame.add(new JButton("右"),BorderLayout.EAST);

button.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {

int temp=e.getKeyCode();
direction=(never==temp)? direction:temp;

if(direction==0) {
return;
}
}
});



}

public void initMap() {

for(int a=0;a<map.length;a++) {
if(a==0|a==map.length-1) {
for(int b=0;b<map[a].length;b++) {
map[a][b]='*';
}
}else {
for(int b=0;b<map[a].length;b++) {
if(b==0|b==map[a].length-1) {
map[a][b]='*';
}else {
map[a][b]=' ';
}
}
}
}
}

public void showMap() {

for(int a=0;a<map.length;a++) {
for(int b=0;b<map[a].length;b++) {
System.out.print(map[a][b]);
}
System.out.println();
}
}

public void initFood() {

food=new Point(RANDOM.nextInt(WIDTH-3)+1,RANDOM.nextInt(HEIGHT-3)+1);
}

public void showFood() {

map[food.y][food.x]='@';
}


public void initSnake() {
snake.add(new Point(WIDTH/2+1,HEIGHT/2 ));
snake.add(new Point(WIDTH/2,HEIGHT/2 ));
snake.add(new Point(WIDTH/2-1,HEIGHT/2 ));
}

public void showSnake() {

for(int count=0;count<snake.size();count++) {
if(count==0) {
map[snake.get(count).y][snake.get(count).x]='$';
}else {
map[snake.get(count).y][snake.get(count).x]='#';
}
}
if(gameOver) {
map[snake.getFirst().y][snake.getFirst().x]='$';
}
}

public void initDirection() {

never=KeyEvent.VK_LEFT;
direction=KeyEvent.VK_RIGHT;
}

public void move() {

initMap();

switch (direction) {
case KeyEvent.VK_LEFT:

snake.addFirst(new Point(snake.getFirst().x-1,snake.getFirst().y));

never=KeyEvent.VK_RIGHT;
break;

case KeyEvent.VK_RIGHT:

snake.addFirst(new Point(snake.getFirst().x+1,snake.getFirst().y));
never=KeyEvent.VK_LEFT;
break;

case KeyEvent.VK_UP:

snake.addFirst(new Point(snake.getFirst().x,snake.getFirst().y-1));
never=KeyEvent.VK_DOWN;
break;

case KeyEvent.VK_DOWN:
snake.addFirst(new Point(snake.getFirst().x,snake.getFirst().y+1));
never=KeyEvent.VK_UP;
break;

default:
break;
}

if(direction!=KeyEvent.VK_LEFT||direction!=KeyEvent.VK_RIGHT||direction!=KeyEvent.VK_DOWN||direction!=KeyEvent.VK_UP)

eatFood();
isGameOver();
showSnake();
showFood();
showMap();
}

public void eatFood() {

if(food.equals(snake.getFirst())) {
initFood();
}else {
snake.removeLast();
}
}

public void isGameOver() {

Point head=snake.getFirst();
for(int count=1;count<snake.size();count++) {
if(snake.get(count).equals(head)||map[head.y][head.x]=='*') {
gameOver=true;
}
}
}

public static void main(String[] args) {

SnakeGameV1 SnakeGameV2=new SnakeGameV1();

while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
SnakeGameV2.move();

if(gameOver) {
System.exit(0);
}
}
}
}

不知道为什么按了空格以后,添加蛇头就不成功,好像是获得了一个奇怪的Point,然后删除玩蛇尾以后就会报错。
错误代码如下:

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.LinkedList.getFirst(LinkedList.java:248)
at snake.SnakeGameV1.isGameOver(SnakeGameV1.java:188)
at snake.SnakeGameV1.move(SnakeGameV1.java:171)
at snake.SnakeGameV1.main(SnakeGameV1.java:206)

求空降大佬给萌新解答下。
...全文
845 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgqjava 2018-06-06
  • 打赏
  • 举报
回复
引用 5 楼 beginner1231 的回复:
引用 4 楼 dgqjava 的回复:
[quote=引用 3 楼 beginner1231 的回复:] 感觉上问题应该是出在未添加舌头删除了蛇尾上面
我运行的时候发现上下左右都不管用 直接撞墙死了 空格也没用
谢谢你,问题我已经自己解决了,还是谢谢你的解答![/quote]好吧, 恭喜
beginner1231 2018-06-05
  • 打赏
  • 举报
回复
引用 4 楼 dgqjava 的回复:
引用 3 楼 beginner1231 的回复:
感觉上问题应该是出在未添加舌头删除了蛇尾上面
我运行的时候发现上下左右都不管用 直接撞墙死了 空格也没用
谢谢你,问题我已经自己解决了,还是谢谢你的解答!
dgqjava 2018-06-04
  • 打赏
  • 举报
回复
是你自己写的代码吗
dgqjava 2018-06-04
  • 打赏
  • 举报
回复
引用 3 楼 beginner1231 的回复:
感觉上问题应该是出在未添加舌头删除了蛇尾上面
我运行的时候发现上下左右都不管用 直接撞墙死了 空格也没用
beginner1231 2018-06-04
  • 打赏
  • 举报
回复
感觉上问题应该是出在未添加舌头删除了蛇尾上面
beginner1231 2018-06-04
  • 打赏
  • 举报
回复
对呀,看了思路以后写的,不过这个空格的情况很奇怪啊@dgqjava

62,625

社区成员

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

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