java贪吃蛇技术选型怎么写的?

Python018

java贪吃蛇技术选型怎么写的?,第1张

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=1i

J2ME贪吃蛇源代码——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){}

}

}