java貪吃蛇簡單版
游戲思路
步驟1:實作靜態的蛇
蛇的類(初始化部分):
地圖類:

重寫的繪制方法:

步驟2:通過鍵盤讓蛇移動起來
蛇的移動方法:

鍵盤監聽事件:

步驟3:通過定時器讓蛇移動起來
創建并使用定時器:

步驟4:添加生成點的方法
節點的類

食物繼承節點,并重寫構造方法,

步驟5:吃東西的方法
在移動的基礎上將洗掉的尾節點復原

步驟6:死亡
兩種死亡條件

代碼匯總
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class Main {
public static void main(String[] args) {
new Map().addGame(new Game());
}
}
class Node {
int x;
int y;
Node nextNode;
public Node(){}
public Node(int x,int y){
this.x = x;
this.y = y;
}
}
class Food extends Node {
public Food(){
x = new Random().nextInt(39);
y = new Random().nextInt(38);
}
}
class Snake {
Node head;
Node tail;
Node hid = null;
//當前方向
int dir=-1;
//下一次移動的方向
int nextDir=-1;
public Snake(){
//初始化蛇身
this.head = new Node(5,6);
this.head.nextNode = new Node(5,7);
this.head.nextNode.nextNode = new Node(5,8);
this.tail = this.head.nextNode.nextNode;
this.tail.nextNode = this.hid;
}
public void eatFood(){
tail = hid;
hid = null;
}
public void move() {
//1:左 -1:右 2:上 3:下
if (nextDir != -dir) {
dir = nextDir;
}
else if (nextDir==dir) {
return;
}
//增加頭結點
Node node = null;
switch (dir) {
case 1: node = new Node(head.x-1, head.y);break;
case -1: node = new Node(head.x+1, head.y);break;
case 2: node = new Node(head.x, head.y-1);break;
case -2: node = new Node(head.x, head.y+1);break;
}
node.nextNode = head;
head = node;
//洗掉尾節點
node = head;
while(node!=null) {
if (node.nextNode == tail) {
tail = node;
hid = tail.nextNode;
break;
}
node = node.nextNode;
}
}
}
class Map extends JFrame {
JFrame jFrame;
public Map(){
jFrame = new JFrame("貪吃蛇");
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
jFrame.setBounds(200,200,600,615);
jFrame.setResizable(false);
}
public void addGame(Game game) {
jFrame.add(game);
game.requestFocus();
}
}
class Game extends JPanel {
Snake snake = new Snake();
Food food = new Food();
int unit = 15;
Timer timer;
{
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
snake.move();
checkCollide();
repaint();
}
};
timer = new Timer(100,actionListener);
timer.start();
KeyListener keyListener = new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
snake.nextDir = 2;
break;
case KeyEvent.VK_DOWN:
snake.nextDir = -2;
break;
case KeyEvent.VK_LEFT:
snake.nextDir = 1;
break;
case KeyEvent.VK_RIGHT:
snake.nextDir = -1;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
};
this.addKeyListener(keyListener);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Node node = snake.head;
while (node!=snake.tail.nextNode) {
g.setColor(Color.green);
g.fillRoundRect(food.x*unit,food.y*unit,unit,unit,unit,unit);
g.setColor(Color.red);
g.fillRect(node.x*unit,node.y*unit,unit,unit);
node = node.nextNode;
}
}
public void checkCollide(){
if (snake.head.x==food.x&&snake.head.y==food.y) {
snake.eatFood();
food = new Food();
}
Node node = snake.head.nextNode;
while(node!=snake.tail.nextNode) {
if (snake.head.x==node.x&&snake.head.y==node.y) {
JOptionPane.showMessageDialog(this,"你碰到了自己的身體","死亡",JOptionPane.WARNING_MESSAGE);
System.exit(0);
timer.stop();
}
else if (snake.head.x==-1||snake.head.x==39||snake.head.y==-1||snake.head.y==39) {
JOptionPane.showMessageDialog(this,"你碰到了墻","死亡",JOptionPane.WARNING_MESSAGE);
System.exit(0);
timer.stop();
}
node = node.nextNode;
}
}
}
本次識訓和感受
果然學習還是要多敲代碼,很多知識是你覺的你會了,但是電腦不要你覺的,還有就是撰寫代碼的時候要細心,不然有時候de了一個小時的bug最后發現是一個單詞拼錯了會崩潰的喲!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/139752.html
標籤:其他
下一篇:Java實作九九乘法表
