java贪吃蛇怎样计分_【JAVA】贪吃蛇2(选择界面大小、速度、记分)

import java.awt.event.*;

import javax.swing.*;

public class View implements ActionListener{

JFrame frame=new JFrame();

JLabel sizeLabel=new JLabel("大小 ");

JTextField sizeText=new JTextField(8);

JLabel speedLabel=new JLabel("速度 ");

JTextField speedText=new JTextField(8);

JButton start=new JButton("开始游戏");

JPanel mainPanel=new JPanel();

public View(){

frame.add(mainPanel);

mainPanel.add(sizeLabel);

mainPanel.add(sizeText);

mainPanel.add(speedLabel);

mainPanel.add(speedText);

sizeText.setText("40");

speedText.setText("10");

mainPanel.add(start);

start.addActionListener(this);

frame.pack();

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

@Override

public void actionPerformed(ActionEvent arg0) {

try{

int size=Integer.parseInt(sizeText.getText().trim());

int speed=Integer.parseInt(speedText.getText().trim());

frame.dispose();

new GameView(size, speed);

}catch(NumberFormatException e){

JOptionPane.showMessageDialog(null, "请输入数字!");

sizeText.setText("40");

speedText.setText("10");

}

}

public static void main(String[] args) {

new View();

}

}

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.*;

import javax.swing.*;

public class GameView implements KeyListener {

JFrame frame=new JFrame();

private GameMap map;

JPanel mainPanel = new JPanel();

MyPanel drawPanel = new MyPanel();

boolean isOver=false;

int speed=1;

public GameView(int size,int speed) {

this.speed=(speed<=0?1:speed);

if(size<30||size>90){

size=40;

}

map = new GameMap(size);

drawPanel.setBounds(0, 0, 7*size, 7*size);

frame.add(drawPanel);

frame.addKeyListener(this);

frame.setTitle("贪吃蛇小游戏");

int x=7*size+10;

int y=7*size+36;

frame.setSize( x, y );

//frame.pack();

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

Thread thread = new Thread(new MyRunnable());

thread.start();

if(isOver){

thread.stop();

}

}

@Override

public void keyPressed(KeyEvent e) {

//System.out.println("press " +e.getKeyCode());

map.changeDire(e.getKeyCode());

}

@Override

public void keyReleased(KeyEvent arg0) {

// TODO Auto-generated method stub

}

@Override

public void keyTyped(KeyEvent e) {

//System.out.println(e.getKeyCode());

//map.move(e.getKeyCode());

}

class MyRunnable implements Runnable {

@Override

public void run() {

while (true) {

isOver=map.move();

if(!isOver){

JOptionPane.showMessageDialog(null, "Game Over !");

frame.dispose();

new View();

return;

}

frame.repaint();

try {

Thread.sleep(1000/speed);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

class MyPanel extends JPanel {

/**

*

*/

private static final long serialVersionUID = 1L;

@Override

public void paint(Graphics g) {

int[][] mapArray = map.getValMap();

for (int i = 0; i < map.getN(); i++) {

for (int j = 0; j < map.getN(); j++) {

switch (mapArray[i][j]) {

case 0:

g.setColor(Color.WHITE);

break;

case 1:

g.setColor(Color.BLACK);

break;

case 2:

g.setColor(Color.RED);

break;

default:

break;

}

g.fillRect(7 * i, 7 * j, 7, 7);

}

}

frame.setTitle("贪吃蛇 得分:"+map.getScore());

}

}

public static void main(String[] args) {

new GameView(30,10);

}

}

import java.awt.event.KeyEvent;

public class GameMap {

private static int[][] valMap;

private int n;

private int max_length;

private Snake snake;

public GameMap(int n){

this.n=n;

valMap=new int[n][n];

max_length=n*n/2;

snake=new Snake(valMap,max_length);

this.creatFood();

}

public void creatFood(){

int x=this.getRandom();

int y=this.getRandom();

while(valMap[x][y]!=0){

x=this.getRandom();

y=this.getRandom();

}

valMap[x][y]=2;

}

public void changeDire(int i){

switch (i) {

case KeyEvent.VK_UP:

snake.setDire(Direction.UP);

break;

case KeyEvent.VK_DOWN:

snake.setDire(Direction.DOWN);

break;

case KeyEvent.VK_LEFT:

snake.setDire(Direction.LEFT);

break;

case KeyEvent.VK_RIGHT:

snake.setDire(Direction.RIGHT);

break;

default:

break;

}

}

public boolean move(){

this.valMap=snake.move();

if(null==valMap){

return false;

}

if(snake.isEat()){

this.creatFood();

snake.setEat(false);

}

return true;

}

private int getRandom(){

return (int)(Math.random()*n);

}

public static int[][] getValMap() {

return valMap;

}

public static void setValMap(int[][] valMap) {

GameMap.valMap = valMap;

}

public int getN() {

return n;

}

public void setN(int n) {

this.n = n;

}

public int getMax_length() {

return max_length;

}

public void setMax_length(int max_length) {

this.max_length = max_length;

}

public Snake getSnake() {

return snake;

}

public void setSnake(Snake snake) {

this.snake = snake;

}

public int getScore() {

// TODO Auto-generated method stub

return snake.getNum();

}

}

import java.util.LinkedList;

public class Snake {

private Direction dire;

private LinkedList body;

private int[][] valMap;

private int max_length;

private boolean isEat=false;

private int num=0;

// private Point food;

public Snake(int[][] valMap, int max_length) {

dire = Direction.RIGHT;

body = new LinkedList<>();

this.valMap = valMap;

// body.add(new Point(0, 0));

this.addPoint(new Point(0, 0));

this.addPoint(new Point(1, 0));

this.addPoint(new Point(2, 0));

this.addPoint(new Point(3, 0));

this.addPoint(new Point(4, 0));

this.max_length = max_length;

}

public int[][] move() {

int x = body.getFirst().getX();

int y = body.getFirst().getY();

Point add;

switch (dire) {

case UP:

add = new Point(x, y - 1);

break;

case DOWN:

add = new Point(x, y + 1);

break;

case RIGHT:

add = new Point(x + 1, y);

break;

case LEFT:

add = new Point(x - 1, y);

break;

default:

add = null;

break;

}

int tmp = isVal(add);

if (tmp != -1) {

// body.addFirst(add);

this.addPoint(add);

if (tmp == 0) {

this.removePoint();

}

return valMap;

}

return null;

}

private void addPoint(Point p) {

body.addFirst(p);

valMap[p.getX()][p.getY()] = 1;

}

private void removePoint() {

Point p = body.getLast();

body.removeLast();

valMap[p.getX()][p.getY()] = 0;

}

private int isVal(Point add) {

if (null == add) {

return -1;

}

int x = add.getX();

int y = add.getY();

int n = valMap.length;

boolean val=x >= 0 && x < n && y >= 0 && y < n;

if(!val||valMap[x][y] == 1){

return -1;// 不合法移动

}

if (valMap[x][y] == 2 ) {

isEat=true;// 吃到食物

num++;

if(body.size() < max_length){

return 1;//增长

}

}

return 0;//不增长

}

public Direction getDire() {

return dire;

}

public void setDire(Direction dire) {

Direction opp = null;

switch (this.dire) {

case UP:

opp = Direction.DOWN;

break;

case DOWN:

opp = Direction.UP;

break;

case RIGHT:

opp = Direction.LEFT;

break;

case LEFT:

opp = Direction.RIGHT;

break;

default:

break;

}

if (dire != opp) {

this.dire = dire;

}

}

public boolean isEat() {

return isEat;

}

public void setEat(boolean isEat) {

this.isEat = isEat;

}

public LinkedList getBody() {

return body;

}

public void setBody(LinkedList body) {

this.body = body;

}

public int getNum() {

// TODO Auto-generated method stub

return num;

}

}

没变的部分:

public class Point {

private int x,y;

public Point(int x,int y){

this.x=x;

this.y=y;

}

public Point(){

x=0;

y=0;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public boolean equals(Point p){

return (p.getX()==x)&&(p.getY()==y);

}

}

public enum Direction {

UP,DOWN,LEFT,RIGHT;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值