我不懂JAVA,但是我可以告訴你我用C++寫過的貪吃蛇的思想;我定義一個2維數(shù)組里面存了一些點,即屏幕的坐標點,比如你要繪制一個正方形,你可以保存它的兩個頂點坐標到數(shù)組里面,然后把你的窗口的坐標都保存起來,再定義一個2維數(shù)組,先全0,為1表示有方塊,移動的時候就對這個數(shù)組里的數(shù)據(jù)進行操作,然后繪制到桌面上判斷第二個數(shù)組的數(shù)值,是1的話到第一個數(shù)組相同的索引里面取出坐標然后繪制,這樣可以少了很多復雜的問題,至于如何判斷你得自己動動腦子了!
專注于為中小企業(yè)提供做網站、網站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)煙臺免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現(xiàn)規(guī)模擴充和轉變。
多思考才能收獲。
樓主沒有看到蛇移動的本質,蛇雖然是分成很多塊,但他們還是一個整體,每一塊的移動都和上一塊有關,所以不需要對每一塊都進行判斷。\x0d\x0a原理:\x0d\x0a把蛇身體的每一塊看成一個對象(對象存儲該塊的坐標和相關信息),作為節(jié)點存儲在線性鏈表中,再設置一個變量標志蛇的方向(通過按鍵可以改變)。一般人都是讓每一個節(jié)點等于他指向的下一個節(jié)點,并讓頭節(jié)點改變位置來實現(xiàn)轉彎和移動,這個算法復雜度太高(O(n)),實際上只要做兩步操作,插入一個頭節(jié)點,刪除一個尾節(jié)點就可以了,新插入的頭節(jié)點位置根據(jù)蛇當前的方向決定 用一個數(shù)組將蛇頭的行徑記錄下來,然后第二段的下一個方格設置為蛇頭走過的方格,這樣子蛇走過的路徑都是前一段走過的,最后將跟著蛇頭走了,比如\x0d\x0a蛇身的路徑\x0d\x0a for(int i=snakeLength-1;i0;i--){\x0d\x0arows[i]=rows[i-1];//依次將蛇前面一段走過行的路段賦值給蛇的下一段\x0d\x0acols[i]=cols[i-1];//依次將蛇前面一段走過列的路段賦值給蛇的下一段\x0d\x0a}\x0d\x0afor(int i=1;i
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
public class InterFace extends JFrame {
/**
* WIDTH:寬
* HEIGHT:高
* SLEEPTIME:可以看作蛇運動的速度
* L = 1,R = 2, U = 3, D = 4 左右上下代碼
*/
public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 200, L = 1,R = 2, U = 3, D = 4;
BufferedImage offersetImage= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_3BYTE_BGR);;
Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35);
Snake snake;
Node node;
public InterFace() {
//創(chuàng)建"蛇"對象
snake = new Snake(this);
//創(chuàng)建"食物"對象
createNode();
this.setBounds(100, 100, WIDTH, HEIGHT);
//添加鍵盤監(jiān)聽器
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent arg0) {
System.out.println(arg0.getKeyCode());
switch (arg0.getKeyCode()) {
//映射上下左右4個鍵位
case KeyEvent.VK_LEFT:
snake.dir = L;
break;
case KeyEvent.VK_RIGHT:
snake.dir = R;
break;
case KeyEvent.VK_UP:
snake.dir = U;
break;
case KeyEvent.VK_DOWN:
snake.dir = D;
}
}
});
this.setTitle("貪吃蛇 0.1 By : Easy");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
//啟動線程,開始執(zhí)行
new Thread(new ThreadUpadte()).start();
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.white);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.black);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height);
//如果蛇碰撞(吃)到食物,則創(chuàng)建新食物
if (snake.hit(node)) {
createNode();
}
snake.draw(g2d);
node.draw(g2d);
g.drawImage(offersetImage, 0, 0, null);
}
class ThreadUpadte implements Runnable {
public void run() {
//無限重繪畫面
while (true) {
try {
Thread.sleep(SLEEPTIME);
repaint(); //
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 創(chuàng)建食物
*/
public void createNode() {
//隨機食物的出現(xiàn)位置
int x = (int) (Math.random() * 650) + 50,y = (int) (Math.random() * 500) + 50;
Color color = Color.blue;
node = new Node(x, y, color);
}
public static void main(String args[]) {
new InterFace();
}
}
/**
* 節(jié)點類(包括食物和蛇的身軀組成節(jié)點)
*/
class Node {
int x, y, width = 15, height = 15;
Color color;
public Node(int x, int y, Color color) {
this(x, y);
this.color = color;
}
public Node(int x, int y) {
this.x = x;
this.y = y;
this.color = color.black;
}
public void draw(Graphics2D g2d) {
g2d.setColor(color);
g2d.drawRect(x, y, width, height);
}
public Rectangle getRect() {
return new Rectangle(x, y, width, height);
}
}
/**
* 蛇
*/
class Snake {
public ListNode nodes = new ArrayListNode();
InterFace interFace;
int dir=InterFace.R;
public Snake(InterFace interFace) {
this.interFace = interFace;
nodes.add(new Node(20 + 150, 40 + 150));
addNode();
}
/**
* 是否碰撞到食物
* @return true 是 false 否
*/
public boolean hit(Node node) {
//遍歷整個蛇體是否與食物碰撞
for (int i = 0; i nodes.size(); i++) {
if (nodes.get(i).getRect().intersects(node.getRect())) {
addNode();
return true;
}
}
return false;
}
public void draw(Graphics2D g2d) {
for (int i = 0; i nodes.size(); i++) {
nodes.get(i).draw(g2d);
}
move();
}
public void move() {
nodes.remove((nodes.size() - 1));
addNode();
}
public synchronized void addNode() {
Node nodeTempNode = nodes.get(0);
//如果方向
switch (dir) {
case InterFace.L:
//判斷是否會撞墻
if (nodeTempNode.x = 20) {
nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y);
}
nodes.add(0, new Node(nodeTempNode.x - nodeTempNode.width,
nodeTempNode.y));
break;
case InterFace.R:
//判斷是否會撞墻
if (nodeTempNode.x = 20 + 15 * 50 - nodeTempNode.width) {
nodeTempNode = new Node(20 - nodeTempNode.width, nodeTempNode.y);
}
nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width,
nodeTempNode.y));
break;
case InterFace.U:
//判斷是否會撞墻
if (nodeTempNode.y = 40) {
nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35);
}
nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y - nodeTempNode.height));
break;
case InterFace.D:
//判斷是否會撞墻
if (nodeTempNode.y = 40 + 15 * 35 - nodeTempNode.height) {
nodeTempNode = new Node(nodeTempNode.x,40 - nodeTempNode.height);
}
nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height));
break;
}
}
}
public
class
Snake
implements
Data//蛇類實現(xiàn)了data接口
{
public
Snake()
{
array.add(new
Point(10,
10));//
array.add(new
Point(10,
11));//
array.add(new
Point(10,
12));//
array.add(new
Point(10,
13));//
array.add(new
Point(10,
14));//這五句話是構造一個蛇,這條蛇由五個坐標點連成
currentFlag
=UPFLAG
;//當前的運動方向設為向上
lifeFlag
=
true;//當前蛇的生命設為活著
}
public
void
move()//蛇的運動函數(shù)
{
tair
=
(Point)array.get(array.size()
-
1);//得到蛇的尾巴
int
len
=
array.size()
-
2;
for(int
i
=
len;
i
=
0;
i--)//這個for循環(huán)把蛇的每一個點都坐標偏移即運動了
{
Point
leftPoint
=
(Point)array.get(i);
Point
rightPoint
=
(Point)array.get(i
+
1);
rightPoint.x
=
leftPoint.x;
rightPoint.y
=
leftPoint.y;//每一個右邊的點等于其左邊的點,像蛇那樣的一縮一張的運動
}
}
public
void
moveHeadLeft()//把蛇的頭部轉向左邊
{
if(currentFlag
==
RIGHTFLAG
||
currentFlag
==
LEFTFLAG)//如果運動方向設為向左或向右則不執(zhí)行
{
return;
}
move();
Point
point
=
(Point)(array.get(0));
//得到蛇頭部
point.x
=
point.x
-
1;//蛇頭部橫坐標減一,縱坐標不變
point.y
=
point.y;
if(point.x
LEFT)//如果蛇頭部不能再左,就不執(zhí)行
{
lifeFlag
=
false;
}
currentFlag
=
LEFTFLAG;//將蛇運動方向改為左
}
思路:
首先你要有一條貪吃蛇,哎,就是玩兒。
1.先用Java敲一個貪吃蛇小游戲的程序。
2.把Java程序打包成jar文件包,把jar包打包成exe應用程序
知道思路以后,接下來按照我的詳細步驟走,能少踩坑,別問我怎么知道的?。?!
一、Java“敲一個”貪吃蛇小游戲
廢話不多說,本篇主要講從java項目到exe應用程序,Java項目的代碼在我上傳的資源當中——代碼-greedy snack.zip
二、將項目打成jar包
如何打包成jar包?
1.手動打可直接執(zhí)行的jar包(本次不使用)2. 使用intellij idea工具打可直接執(zhí)行的jar包
1) 打開項目
2)點擊 File — 選擇 Project Structure,找到“Artifacts” 點擊 “+” 選擇“JAR” —“Empty”。
3) Name欄可以填入自定義的名字,Output ditectory選擇jar包生成目標目錄,Available Elements里雙擊需要添加到jar包的文件,即可添加到左邊的jar包目錄,如圖:
4)點擊Create Manifest,選擇放置MANIFEST.MF的文件路徑,直接默認項目根目錄就行,點擊OK。
5) 點擊Main Class后面選擇按鈕, 彈出框中選擇需要運行程序入口main函數(shù),點擊OK,點擊OK。
6) 點擊菜單中“Build” - "Build Artifacts", 雙擊彈出框中待生成jar包下面的build即可,如下圖
7)至此使用Intellij idea生成可直接執(zhí)行jar包就完成了。
8)查看生成的jar包,并運行jar包。命令行運行jar包
java -jar xxx.jar
復制代碼
三、打包成為exe應用程序
這里首先你要有:
上面生成的jar包 greedy snack.jar
工具:exe4j,一個將jar轉換成exe的工具 鏈接:… 提取碼:ijdv
1)安裝exe4j,打開安裝好的exe4j,進行注冊
注冊碼:L-g782dn2d-1f1yqxx1rv1sqd
2) 點擊 Next, 選擇JAVA轉EXE
3) Next,填入自定義的名字和生成目標文件目錄
4) 繼續(xù)Next,選擇啟動模式、設置程序名稱和程序圖標
5) 下方有個選項,需要設置打包后的程序兼容32和64位系統(tǒng)。
勾選,然后Next。
6)然后Next,直到出現(xiàn)如下界面,開始選擇jar包以及配置
在VM參數(shù)配置的地方加上:-Dfile.encoding=utf-8
添加jar包
設置啟動類
Next 配置JRE
Next 選擇 Client VM
7)Next 直到如下圖界面
桌面多了一個貪吃蛇小游戲3.0.exe文件,至此我們就成功的做出了一個Java貪吃蛇小游戲的exe應用程序