import java.awt.*;
成都創(chuàng)新互聯(lián)公司長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為靜寧企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、成都做網(wǎng)站,靜寧網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class SnakeGame extends JFrame implements KeyListener{
private int stat=1,direction=0,bodylen=6,headx=7,heady=8,
tailx=1,taily=8,tail,foodx,foody,food;//初始化定義變量
public final int EAST=1,WEST=2,SOUTH=3,NORTH=4;//方向常量
int [][] fillblock=new int [20][20];//定義蛇身所占位置
public SnakeGame() {//構(gòu)造函數(shù)
super("貪吃蛇");
setSize(510,510);
setVisible(true);//設(shè)定窗口屬性
addKeyListener(this);//添加監(jiān)聽
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i=1;i=7;i++) fillblock[i][8]=EAST;//初始化蛇身屬性
direction=EAST;//方向初始化的設(shè)置
FoodLocate(); //定位食物
while (stat==1){
fillblock[headx][heady]=direction;
switch(direction){
case 1:headx++;break;
case 2:headx--;break;
case 3:heady++;break;
case 4:heady--;break;
}//蛇頭的前進
if(heady19||headx19||tailx19||taily19||heady0||headx0||tailx0||taily0||fillblock[headx][heady]!=0){
stat=0;
break;
} //判斷游戲是否結(jié)束
try{
Thread.sleep(150); }
catch(InterruptedException e){}//延遲
fillblock[headx][heady]=direction;
if(headx==foodxheady==foody){//吃到食物
FoodLocate();
food=2;
try{
Thread.sleep(100); }
catch(InterruptedException e){}//延遲
}
if(food!=0)food--;
else{tail=fillblock[tailx][taily];
fillblock[tailx][taily]=0;//蛇尾的消除
switch(tail){
case 1:tailx++;break;
case 2:tailx--;break;
case 3:taily++;break;
case 4:taily--;break;
}//蛇尾的前進
}
repaint();
}
if(stat==0)
JOptionPane.showMessageDialog(null,"GAME OVER","Game Over",JOptionPane.INFORMATION_MESSAGE);
}
public void keyPressed(KeyEvent e) {//按鍵響應(yīng)
int keyCode=e.getKeyCode();
if(stat==1) switch(keyCode){
case KeyEvent.VK_UP:if(direction!=SOUTH) direction=NORTH;break;
case KeyEvent.VK_DOWN:if(direction!=NORTH)direction=SOUTH;break;
case KeyEvent.VK_LEFT:if(direction!=EAST)direction=WEST;break;
case KeyEvent.VK_RIGHT:if (direction!=WEST)direction=EAST;break;
}
}
public void keyReleased(KeyEvent e){}//空函數(shù)
public void keyTyped(KeyEvent e){} //空函數(shù)
public void FoodLocate(){//定位食物坐標
do{
Random r=new Random();
foodx=r.nextInt(20);
foody=r.nextInt(20);
}while (fillblock[foodx][foody]!=0);
}
public void paint(Graphics g){//畫圖
super.paint(g);
g.setColor(Color.BLUE);
for(int i=0;i20;i++)
for(int j=0;j20;j++)
if (fillblock[i][j]!=0)
g.fillRect(25*i+5,25*j+5,24,24);
g.setColor(Color.RED);
g.fillRect(foodx*25+5,foody*25+5,24,24);
}
public static void main(String[] args) {//主程序
SnakeGame application=new SnakeGame();
}
}
Java貪吃蛇技術(shù)選型一般需要考慮以下幾點:
開發(fā)平臺:需要選擇適用于Java語言的開發(fā)平臺,如Eclipse、IntelliJ IDEA等。
編程語言:需要選擇Java語言來開發(fā)貪吃蛇游戲。
框架和庫:可以使用Java中的Swing框架和AWT庫來開發(fā)圖形界面,并使用Java多線程編程技術(shù)來實現(xiàn)游戲的實時動態(tài)效果。
算法和數(shù)據(jù)結(jié)構(gòu):可以使用隊列或鏈表等數(shù)據(jù)結(jié)構(gòu)來存儲貪吃蛇的身體,并使用類似貪心算法的思想來決定貪吃蛇的下一步移動方向。
編碼風(fēng)格和規(guī)范:需要遵循Java的編碼風(fēng)格和規(guī)范,確保代碼的可讀性和可維護性。
希望以上內(nèi)容能夠幫助您了解Java貪吃蛇技術(shù)選型。如果您有其他問題,歡迎隨時告訴我,我會盡力為您解答。
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));//這五句話是構(gòu)造一個蛇,這條蛇由五個坐標點連成
currentFlag
=UPFLAG
;//當前的運動方向設(shè)為向上
lifeFlag
=
true;//當前蛇的生命設(shè)為活著
}
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()//把蛇的頭部轉(zhuǎn)向左邊
{
if(currentFlag
==
RIGHTFLAG
||
currentFlag
==
LEFTFLAG)//如果運動方向設(shè)為向左或向右則不執(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;//將蛇運動方向改為左
}
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;
}
}
}