Java贪吃蛇技术选型一般需要考虑以下几点:
开发平台:需要选择适用于Java语言的开发平台,如Eclipse、IntelliJ IDEA等。
编程语言:需要选择Java语言来开发贪吃蛇游戏。
框架和库:可以使用Java中的Swing框架和AWT库来开发图形界面,并使用Java多线程编程技术来实现游戏的实时动态效果。
算法和数据结构:可以使用队列或链表等数据结构来存储贪吃蛇的身体,并使用类似贪心算法的思想来决定贪吃蛇的下一步移动方向。
编码风格和规范:需要遵循Java的编码风格和规范,确保代码的可读性和可维护性。
希望以上内容能够帮助您了解Java贪吃蛇技术选型。如果您有其他问题,欢迎随时告诉我,我会尽力为您解答。
楼主没有看到蛇移动的本质,蛇虽然是分成很多块,但他们还是一个整体,每一块的移动都和上一块有关,所以不需要对每一块都进行判断。\x0d\x0a原理:\x0d\x0a把蛇身体的每一块看成一个对象(对象存储该块的坐标和相关信息),作为节点存储在线性链表中,再设置一个变量标志蛇的方向(通过按键可以改变)。一般人都是让每一个节点等于他指向的下一个节点,并让头节点改变位置来实现转弯和移动,这个算法复杂度太高(O(n)),实际上只要做两步操作,插入一个头节点,删除一个尾节点就可以了,新插入的头节点位置根据蛇当前的方向决定 用一个数组将蛇头的行径记录下来,然后第二段的下一个方格设置为蛇头走过的方格,这样子蛇走过的路径都是前一段走过的,最后将跟着蛇头走了,比如\x0d\x0a蛇身的路径\x0d\x0a for(int i=snakeLength-1i>0i--){\x0d\x0arows[i]=rows[i-1]//依次将蛇前面一段走过行的路段赋值给蛇的下一段\x0d\x0acols[i]=cols[i-1]//依次将蛇前面一段走过列的路段赋值给蛇的下一段\x0d\x0a}\x0d\x0afor(int i=1iJ2ME贪吃蛇源代码——200行左右,包含详细注释 package snakeimport javax.microedition.midlet.*import javax.microedition.lcdui.*public class SnakeMIDlet extends MIDlet {
SnakeCanvas displayable = new SnakeCanvas()
public SnakeMIDlet() {
Display.getDisplay(this).setCurrent(displayable)
}public void startApp() {}public void pauseApp() {}public void destroyApp(boolean unconditional) {}}//文件名:SnakeCanvas.javapackage snakeimport java.util.*
import javax.microedition.lcdui.*/**
* 贪吃蛇游戏
*/
public class SnakeCanvas extends Canvas implements Runnable{
/**存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标*/
int[][] snake = new int[200][2]
/**已经使用的节点数量*/
int snakeNum
/**贪吃蛇运动方向,0代表向上,1代表向下,2代表向左,3代表向右*/
int direction
/*移动方向*/
/**向上*/
private final int DIRECTION_UP = 0
/**向下*/
private final int DIRECTION_DOWN = 1
/**向左*/
private final int DIRECTION_LEFT = 2
/**向右*/
private final int DIRECTION_RIGHT = 3/**游戏区域宽度*/
int width
/**游戏区域高度*/
int height/**蛇身单元宽度*/
private final byte SNAKEWIDTH = 4/**是否处于暂停状态,true代表暂停*/
boolean isPaused = false
/**是否处于运行状态,true代表运行*/
boolean isRun = true/**时间间隔*/
private final int SLEEP_TIME = 300
/**食物的X坐标*/
int foodX
/**食物的Y坐标*/
int foodY
/**食物的闪烁控制*/
boolean b = true
/**Random对象*/
Random random = new Random()
public SnakeCanvas() {
//初始化
init()
width = this.getWidth()
height = this.getHeight()
//启动线程
new Thread(this).start()
}/**
* 初始化开始数据
*/
private void init(){
//初始化节点数量
snakeNum = 7
//初始化节点数据
for(int i = 0i <snakeNumi++){
snake[i][0] = 100 - SNAKEWIDTH * i
snake[i][1] = 40
}
//初始化移动方向
direction = DIRECTION_RIGHT
//初始化食物坐标
foodX = 100
foodY = 100
}protected void paint(Graphics g) {
//清屏
g.setColor(0xffffff)
g.fillRect(0,0,width,height)
g.setColor(0)//绘制蛇身
for(int i = 0i <snakeNumi++){
g.fillRect(snake[i][0],snake[i][1],SNAKEWIDTH,SNAKEWIDTH)
}
//绘制食物
if(b){
g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH)
}
}private void move(int direction){
//蛇身移动
for(int i = snakeNum - 1i >0i--){
snake[i][0] = snake[i - 1][0]
snake[i][1] = snake[i - 1][1]
}//第一个单元格移动
switch(direction){
case DIRECTION_UP:
snake[0][1] = snake[0][1] - SNAKEWIDTH
break
case DIRECTION_DOWN:
snake[0][1] = snake[0][1] + SNAKEWIDTH
break
case DIRECTION_LEFT:
snake[0][0] = snake[0][0] - SNAKEWIDTH
break
case DIRECTION_RIGHT:
snake[0][0] = snake[0][0] + SNAKEWIDTH
break
}
}
/**
* 吃掉食物,自身增长
*/
private void eatFood(){
//判别蛇头是否和食物重叠
if(snake[0][0] == foodX &&snake[0][1] == foodY){
snakeNum++
generateFood()
}
}
/**
* 产生食物
* 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合
*/
private void generateFood(){
while(true){
foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1))
/ SNAKEWIDTH * SNAKEWIDTH
foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1))
/ SNAKEWIDTH * SNAKEWIDTH
boolean b = true
for(int i = 0i <snakeNumi++){
if(foodX == snake[i][0] &&snake[i][1] == foodY){
b = false
break
}
}
if(b){
break
}
}
}
/**
* 判断游戏是否结束
* 结束条件:
* 1、蛇头超出边界
* 2、蛇头碰到自身
*/
private boolean isGameOver(){
//边界判别
if(snake[0][0] <0 || snake[0][0] >(width - SNAKEWIDTH) ||
snake[0][1] <0 || snake[0][1] >(height - SNAKEWIDTH)){
return true
}
//碰到自身
for(int i = 4i <snakeNumi++){
if(snake[0][0] == snake[i][0]
&&snake[0][1] == snake[i][1]){
return true
}
}
return false
}/**
* 事件处理
*/
public void keyPressed(int keyCode){
int action = this.getGameAction(keyCode)
//改变方向
switch(action){
case UP:
if(direction != DIRECTION_DOWN){
direction = DIRECTION_UP
}
break
case DOWN:
if(direction != DIRECTION_UP){
direction = DIRECTION_DOWN
}
break
case LEFT:
if(direction != DIRECTION_RIGHT){
direction = DIRECTION_LEFT
}
break
case RIGHT:
if(direction != DIRECTION_LEFT){
direction = DIRECTION_RIGHT
}
break
case FIRE:
//暂停和继续
isPaused = !isPaused
break
}
}/**
* 线程方法
* 使用精确延时
*/
public void run(){
try{
while (isRun) {
//开始时间
long start = System.currentTimeMillis()
if(!isPaused){
//吃食物
eatFood()
//移动
move(direction)
//结束游戏
if(isGameOver()){
break
}
//控制闪烁
b = !b
}
//重新绘制
repaint()
long end = System.currentTimeMillis()
//延时
if(end - start <SLEEP_TIME){
Thread.sleep(SLEEP_TIME - (end - start))
}
}
}catch(Exception e){}
}
}