重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Java贪吃蛇技术选型一般需要考虑以下几点:
创新互联建站是一家集网站建设,塔什库尔干塔吉克企业网站建设,塔什库尔干塔吉克品牌网站建设,网站定制,塔什库尔干塔吉克网站建设报价,网络营销,网络优化,塔什库尔干塔吉克网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
开发平台:需要选择适用于Java语言的开发平台,如Eclipse、IntelliJ IDEA等。
编程语言:需要选择Java语言来开发贪吃蛇游戏。
框架和库:可以使用Java中的Swing框架和AWT库来开发图形界面,并使用Java多线程编程技术来实现游戏的实时动态效果。
算法和数据结构:可以使用队列或链表等数据结构来存储贪吃蛇的身体,并使用类似贪心算法的思想来决定贪吃蛇的下一步移动方向。
编码风格和规范:需要遵循Java的编码风格和规范,确保代码的可读性和可维护性。
希望以上内容能够帮助您了解Java贪吃蛇技术选型。如果您有其他问题,欢迎随时告诉我,我会尽力为您解答。
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() {
//创建"蛇"对象
snake = new Snake(this);
//创建"食物"对象
createNode();
this.setBounds(100, 100, WIDTH, HEIGHT);
//添加键盘监听器
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);
//启动线程,开始执行
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);
//如果蛇碰撞(吃)到食物,则创建新食物
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();
}
}
}
}
/**
* 创建食物
*/
public void createNode() {
//随机食物的出现位置
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();
}
}
/**
* 节点类(包括食物和蛇的身躯组成节点)
*/
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;
}
}
}
要代码和jar包我这有,思路我就大概讲一下:首先是要在画布上画上一个块,这就是蛇头,但是蛇是会变长的,所以需要用一个东西来存蛇,那就可以用数组、ArrayList、LinkedList、等等(我比较喜欢用LinkedList),这里虽然说的是蛇,其实是一个块的x、y坐标,蛇是画好了,但蛇是会动的,这就要用一个线程和一个move()方法了,让它不停的动,蛇是动了,但是没有方向,这时需要一个方法让它有方向,但要注意的是相反的方向不能改变方向(也就是按了上,按下就不能用了),蛇有方向又能动,但到边上了就不行了,这时就要让它出界结束游戏,接下来就是要出现食物了,食物这个好办,用一个随机数搞定它,注意食物不能在界外,食物有了,蛇就要去吃它了,这时就要用一个方法去吃食物了,吃到了让蛇长一个块,食物重新出现,蛇是长大了,但是它可以碰到自己的身体,那么你就要做了方法让它碰到后结束游戏,就这样最初步的思路搞定了。接下来的就是一些细节了,这就不说了。
import java.awt.*;
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() {//构造函数
super("贪吃蛇");
setSize(510,510);
setVisible(true);//设定窗口属性
addKeyListener(this);//添加监听
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i=1;i=7;i++) fillblock[i][8]=EAST;//初始化蛇身属性
direction=EAST;//方向初始化的设置
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;
} //判断游戏是否结束
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) {//按键响应
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){}//空函数
public void keyTyped(KeyEvent e){} //空函数
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();
}
}