分享一個我剛剛寫的貪吃蛇小遊戲,非常簡短的代碼實作方法。這可能是全網最簡單實作方法
,效果圖如下:
有多簡短呢 ? 上代碼!!
一共四個類!
Food類
package com.snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
public class Food {//食物也是一個長寬各為20的小格子
public Point point=null;
public final int width=20;
public final int height=20;
public Food(Point p) {
this.point=p;
}
public void drawFood(Graphics g) {
g.setColor(Color.RED);
g.fillRect(this.point.x, this.point.y, this.width, this.height);
}
}
Snake類
package com.snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
public class Snake {
public Point point=null; //一直蛇其實就是一個小格子
public final int width=20;
public final int height=20;
public Snake(Point p) {
this.point=p;
}
public void drawSnake(Graphics g) {
g.setColor(Color.black);
g.fillRect(this.point.x,this.point.y, this.width,this.height);
}
}
面闆
【面闆就四個方法,下面會附完整代碼,這裡縮進代碼看的更直覺!】
主類是一個視窗
package com.snake;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Game_Frame extends JFrame {
public final static int width=400;
public final static int height=400;
Game_Panel myPanel=null;
public static void main(String[] args) {
new Game_Frame();
}
public Game_Frame() {
this.setTitle("貪吃蛇---作者:See---qq:3492625357");
this.setSize(width, height);
this.setVisible(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Game_Panel myPanel=new Game_Panel();
this.add(myPanel);
new Thread(myPanel).start();
}
}
什麼 !? 沒了?
對,沒了。
解釋一下代碼實作,Snake 和 Food 其實就是一個長寬各為20像素的小正方形。視窗大小為400*400,相當于400個小正方形。
面闆裡用上下左右控制小蛇的移動(黑色格子),移動效果(加頭,去尾)當小蛇和Food(紅色格子)相撞時,則增加一個長度。(前面加,後面不去尾)。當蛇頭與身子相撞(最前面的黑色小格子與其他黑色小格子相撞)則宣布遊戲結束。
再聽我這麼一解釋,是不是覺得So TMD easy!
寫程式就是要想到什麼就寫什麼,寫錯了大不了删除再來嘛,隻要你敢寫,就沒有實作不了的方法。
下面附面闆完整代碼
package com.snake;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Game_Panel extends JPanel implements Runnable,KeyListener{
public int DRIECTION=38;//剛開始的時候 讓小蛇向上移動
public boolean alive=true;//判斷小蛇是否死亡的
Random ran=new Random();//用來産生Food 的随機坐标
LinkedList<Snake> snake=new LinkedList<Snake>();
Food food=new Food(new Point(ran.nextInt(Game_Frame.width/20)*20,ran.nextInt(Game_Frame.height/20)*20));
public Game_Panel() {
snake.add(new Snake(new Point(180,180)));//初始化一個蛇頭
this.addKeyListener(this);
this.setFocusable(true);
}
public void paint(Graphics g) {
for(int i=0;i<this.snake.size();i++) {
this.snake.get(i).drawSnake(g);
}
this.food.drawFood(g);
validate();
}
public void Snake_Move() { //控制蛇的移動
if(alive) { //當小蛇活着的時候 移動 死了就不動了
switch(this.DRIECTION) {
case 37:
snake.add(new Snake(new Point(snake.getLast().point.x-20,snake.getLast().point.y)));
if(snake.getLast().point.x<0) //當小蛇超過視窗範圍則從另一邊出來,下面同理
snake.getLast().point.x=Game_Frame.width-snake.getLast().width;
break;
case 39:
snake.add(new Snake(new Point(snake.getLast().point.x+20,snake.getLast().point.y)));
if(snake.getLast().point.x==Game_Frame.width)
snake.getLast().point.x=0;
break;
case 38:
snake.add(new Snake(new Point(snake.getLast().point.x,snake.getLast().point.y-20)));
if(snake.getLast().point.y<0)
snake.getLast().point.y=Game_Frame.height-snake.getLast().height;
break;
case 40:
snake.add(new Snake(new Point(snake.getLast().point.x,snake.getLast().point.y+20)));
if(snake.getLast().point.y==Game_Frame.height)
snake.getLast().point.y=0;
break;
default: ;
}
if(changeSize()) snake.removeFirst(); //如果遇到食物,則不删除第一個結點
}
}
public boolean changeSize() {//當蛇的格子和食物相撞時 ,為false
if(snake.getLast().point.equals(food.point)){
food.point.x=ran.nextInt(Game_Frame.width/20)*20;
food.point.y=ran.nextInt(Game_Frame.height/20)*20;
return false;
}
else return true;
}
public void dead() { //小蛇死亡的條件 當頭與身相撞的時候宣布死亡
for(int i=0;i<this.snake.size()-1;i++) {
if(this.snake.getLast().point.equals(this.snake.get(i).point)) {
alive=false;//終止線程
//如果小蛇死了,則彈出對話框
JOptionPane.showMessageDialog(this, "oh,I'm sorry,you dead!!", "GAME--OVER", JOptionPane.WARNING_MESSAGE);
//Thread.currentThread().stop();//當小蛇死了線程終止 //stop(),不用這個方法
}
}
}
public void run() {//調用這些方法
while(alive) {//如果小蛇活着則循環,否則終止循環即結束線程
// dead();
//changeSize();
Snake_Move();
//changeSize();
dead();
repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void keyPressed(KeyEvent e) {//鍵盤控制上下左右移動
//System.out.println(e.getKeyCode()); //經過測試 37 38 39 40 65 87 68 83分别為鍵盤的左上右下 awds
switch (e.getKeyCode()) {
case 37:
this.DRIECTION=37; //左
break;
case 38:
this.DRIECTION=38;//上
break;
case 39:
this.DRIECTION=39;//右
break;
case 40:
this.DRIECTION=40; //下
break;
/* case 65://本來準備用wsad和上下左右一起控制小蛇的移動的,但是徒增麻煩沒有必要
this.DRIECTION=37; //左
break;
case 87:
this.DRIECTION=38;//上
break;
case 68:
this.DRIECTION=39;//右
break;
case 83:
this.DRIECTION=40; //下
break;
*/
default: ;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
【因為代碼簡短是以視覺上感覺一般,你可以再此基礎上加一些元素,比如 蛇的圖檔,音樂,顔色效果等等。總之核心部分就是這麼簡單! If you feel nice,call me!】q:3492625357