天天看點

Java 貪吃蛇 最簡易地實作方法 超簡短代碼實作 (附源碼 詳解)

  分享一個我剛剛寫的貪吃蛇小遊戲,非常簡短的代碼實作方法。這可能是全網最簡單實作方法

Java 貪吃蛇 最簡易地實作方法 超簡短代碼實作 (附源碼 詳解)

,效果圖如下:

Java 貪吃蛇 最簡易地實作方法 超簡短代碼實作 (附源碼 詳解)
Java 貪吃蛇 最簡易地實作方法 超簡短代碼實作 (附源碼 詳解)

 有多簡短呢 ? 上代碼!!

  一共四個類!

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);
	
	}

}
           

面闆

Java 貪吃蛇 最簡易地實作方法 超簡短代碼實作 (附源碼 詳解)

【面闆就四個方法,下面會附完整代碼,這裡縮進代碼看的更直覺!】

主類是一個視窗

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