java贪吃蛇求高手现编一个JAVA贪食蛇!
java贪吃蛇 时间:2021-07-10 阅读:(
)
怎么用Java做贪吃蛇的游戏软件呢?
您好,原理:
把蛇身体的每一块看成一个对象(对象存储该块的坐标和相关信息),作为节点存储在线性链表中,再设置一个变量标志蛇的方向(通过按键可以改变)。
一般人都是让每一个节点等于他指向的下一个节点,并让头节点改变位置来实现转弯和移动,这个算法复杂度太高(O(n)),实际上只要做两步操作,插入一个头节点,删除一个尾节点就可以了,新插入的头节点位置根据蛇当前的方向决定 用一个数组将蛇头的行径记录下来,然后第二段的下一个方格设置为蛇头走过的方格,这样子蛇走过的路径都是前一段走过的,最后将跟着蛇头走了,比如
蛇身的路径
for(int i=snakeLength-1;i>0;i--){
rows[i]=rows[i-1];//依次将蛇前面一段走过行的路段赋值给蛇的下一段
cols[i]=cols[i-1];//依次将蛇前面一段走过列的路段赋值给蛇的下一段
}
for(int i=1;i<snakeLength;i++){
gamePanel[rows[i]][cols[i]].setBackground(Color.red);//将整个面板上蛇身走过的行和列设置为不同的颜色,当然可以用图片来设置
}
蛇头走过的行和列(rows[0],cols[i])要根据不同的方向加减1来将面板设置成不同的颜色
如gamePanel[rows[i]-1][cols[i]+1].setBackground(Color.red)求Java贪吃蛇代码
原发布者:毛志勇gavin
#include#include"resource1.h"#include#include#include//蛇的结构体typedefstructSNAKE{intx;inty;structSNAKE*pNext;}Snake;//豆的结构体typedefstructBEAN{intx;inty;structBEAN*pNext;}Bean;//函数原型voidCreateSnake(Snake**pSnake);voiddeleteAll(Snake**pSnake);voidShowSnake(Snake*pSnake);voidCreateBean(Bean**pBean,Snake*pSnake);voidShowBean(Bean*pBean);voidDeleteBean(Bean**pBean);voidSnakeRun(Snake**pSnake);voidSnakeGrowUp(Snake*pSnake);intCanEatBean(Snake*pSnake,Bean*pBean);intCanDie(Snake*pSnake);/////////////////////////////////////////////////////////////////////////////////////charg_ClassName[20]="ClassName";LRESULTCALLBACKWndProc(HWNDhwnd,UINTnMsg,WPARAMwParam,LPARAMlParam);HBITMAPhBitMap;intCALLBACKWinMain(HINSTANCEhInstance,HINSTANCEhPreInstance,LPSTRpCmdLine,intnCmdShow){HBRUSHhBrush=CreateSolidBrush(RGB(100,100,410));HICONhIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_wnd_icon));HICONhIconsm=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_wnd_iconsm));hBitMap=LoadBitmap(hInstance,MAKEINTR我想求一个Java编写的贪吃蛇游戏,要有注释和流程图最好
用MVC方式实现的贪吃蛇游戏,共有4个类。
运行GreedSnake运行即可。
主要是观察者模式的使用,我已经添加了很多注释了。
1、
/*
* 程序名称:贪食蛇
* 原作者:BigF
* 修改者:algo
* 说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者,
* 但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之
* 下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式,
* 因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。
* 我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。
*/
package mvcTest;
/**
* @author WangYu
* @version 1.0
* Description:
* </pre>
* Create on :Date :2005-6-13 Time:15:57:16
* LastModified:
* History:
*/
public class GreedSnake {
public static void main(String[] args) {
SnakeModel model = new SnakeModel(20,30);
SnakeControl control = new SnakeControl(model);
SnakeView view = new SnakeView(model,control);
//添加一个观察者,让view成为model的观察者
model.addObserver(view);
(new Thread(model)).start();
}
}
-------------------------------------------------------------
2、
package mvcTest;
//SnakeControl.java
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* MVC中的Controler,负责接收用户的操作,并把用户操作通知Model
*/
public class SnakeControl implements KeyListener{
SnakeModel model;
public SnakeControl(SnakeModel model){
this.model = model;
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (model.running){ // 运行状态下,处理的按键
switch (keyCode) {
case KeyEvent.VK_UP:
model.changeDirection(SnakeModel.UP);
break;
case KeyEvent.VK_DOWN:
model.changeDirection(SnakeModel.DOWN);
break;
case KeyEvent.VK_LEFT:
model.changeDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_RIGHT:
model.changeDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
model.speedUp();
break;
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
model.speedDown();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
model.changePauseState();
break;
default:
}
}
// 任何情况下处理的按键,按键导致重新启动游戏
if (keyCode == KeyEvent.VK_R ||
keyCode == KeyEvent.VK_S ||
keyCode == KeyEvent.VK_ENTER) {
model.reset();
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
-------------------------------------------------------------
3、
/*
*
*/
package mvcTest;
/**
* 游戏的Model类,负责所有游戏相关数据及运行
* @author WangYu
* @version 1.0
* Description:
* </pre>
* Create on :Date :2005-6-13 Time:15:58:33
* LastModified:
* History:
*/
//SnakeModel.java
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;
/**
* 游戏的Model类,负责所有游戏相关数据及运行
*/
class SnakeModel extends Observable implements Runnable {
boolean[][] matrix; // 指示位置上有没蛇体或食物
LinkedList nodeArray = new LinkedList(); // 蛇体
Node food;
int maxX;
int maxY;
int direction = 2; // 蛇运行的方向
boolean running = false; // 运行状态
int timeInterval = 200; // 时间间隔,毫秒
double speedChangeRate = 0.75; // 每次得速度变化率
boolean paused = false; // 暂停标志
int score = 0; // 得分
int countMove = 0; // 吃到食物前移动的次数
// UP and DOWN should be even
// RIGHT and LEFT should be odd
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public SnakeModel( int maxX, int maxY) {
this.maxX = maxX;
this.maxY = maxY;
reset();
}
public void reset(){
direction = SnakeModel.UP; // 蛇运行的方向
timeInterval = 200; // 时间间隔,毫秒
paused = false; // 暂停标志
score = 0; // 得分
countMove = 0; // 吃到食物前移动的次数
// initial matirx, 全部清0
matrix = new boolean[maxX][];
for (int i = 0; i < maxX; ++i) {
matrix[i] = new boolean[maxY];
Arrays.fill(matrix[i], false);
}
// initial the snake
// 初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半
int initArrayLength = maxX > 20 ? 10 : maxX / 2;
nodeArray.clear();
for (int i = 0; i < initArrayLength; ++i) {
int x = maxX / 2 + i;//maxX被初始化为20
int y = maxY / 2; //maxY被初始化为30
//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]
//默认的运行方向向上,所以游戏一开始nodeArray就变为:
// [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
nodeArray.addLast(new Node(x, y));
matrix[x][y] = true;
}
// 创建食物
food = createFood();
matrix[food.x][food.y] = true;
}
public void changeDirection(int newDirection) {
// 改变的方向不能与原来方向同向或反向
if (direction % 2 != newDirection % 2) {
direction = newDirection;
}
}
/**
* 运行一次
* @return
*/
public boolean moveOn() {
Node n = (Node) nodeArray.getFirst();
int x = n.x;
int y = n.y;
// 根据方向增减坐标值
switch (direction) {
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
// 如果新坐标落在有效范围内,则进行处理
if ((0 <= x && x < maxX) && (0 <= y && y < maxY)) {
if (matrix[x][y]) { // 如果新坐标的点上有东西(蛇体或者食物)
if (x == food.x && y == food.y) { // 吃到食物,成功
nodeArray.addFirst(food); // 从蛇头赠长
// 分数规则,与移动改变方向的次数和速度两个元素有关
int scoreGet = (10000 - 200 * countMove) / timeInterval;
score += scoreGet > 0 ? scoreGet : 10;
countMove = 0;
food = createFood(); // 创建新的食物
matrix[food.x][food.y] = true; // 设置食物所在位置
return true;
} else // 吃到蛇体自身,失败
return false;
} else { // 如果新坐标的点上没有东西(蛇体),移动蛇体
nodeArray.addFirst(new Node(x, y));
matrix[x][y] = true;
n = (Node) nodeArray.removeLast();
matrix[n.x][n.y] = false;
countMove++;
return true;
}
}
return false; // 触到边线,失败
}
public void run() {
running = true;
while (running) {
try {
Thread.sleep(timeInterval);
} catch (Exception e) {
break;
}
if (!paused) {
if (moveOn()) {
setChanged(); // Model通知View数据已经更新
notifyObservers();
} else {
JOptionPane.showMessageDialog(null,
"you failed",
"Game Over",
JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}
running = false;
}
private Node createFood() {
int x = 0;
int y = 0;
// 随机获取一个有效区域内的与蛇体和食物不重叠的位置
do {
Random r = new Random();
x = r.nextInt(maxX);
y = r.nextInt(maxY);
} while (matrix[x][y]);
return new Node(x, y);
}
public void speedUp() {
timeInterval *= speedChangeRate;
}
public void speedDown() {
timeInterval /= speedChangeRate;
}
public void changePauseState() {
paused = !paused;
}
public String toString() {
String result = "";
for (int i = 0; i < nodeArray.size(); ++i) {
Node n = (Node) nodeArray.get(i);
result += "[" + n.x + "," + n.y + "]";
}
return result;
}
}
class Node {
int x;
int y;
Node(int x, int y) {
this.x = x;
this.y = y;
}
}
------------------------------------------------------------
4、
package mvcTest;
//SnakeView.java
import javax.swing.*;
import java.awt.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Observer;
/**
* MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑
*/
public class SnakeView implements Observer {
SnakeControl control = null;
SnakeModel model = null;
JFrame mainFrame;
Canvas paintCanvas;
JLabel labelScore;
public static final int canvasWidth = 200;
public static final int canvasHeight = 300;
public static final int nodeWidth = 10;
public static final int nodeHeight = 10;
public SnakeView(SnakeModel model, SnakeControl control) {
this.model = model;
this.control = control;
mainFrame = new JFrame("GreedSnake");
Container cp = mainFrame.getContentPane();
// 创建顶部的分数显示
labelScore = new JLabel("Score:");
cp.add(labelScore, BorderLayout.NORTH);
// 创建中间的游戏显示区域
paintCanvas = new Canvas();
paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);
paintCanvas.addKeyListener(control);
cp.add(paintCanvas, BorderLayout.CENTER);
// 创建底下的帮助栏
JPanel panelButtom = new JPanel();
panelButtom.setLayout(new BorderLayout());
JLabel labelHelp;
labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.NORTH);
labelHelp = new JLabel("ENTER or R or S for start;", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.CENTER);
labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.SOUTH);
cp.add(panelButtom, BorderLayout.SOUTH);
mainFrame.addKeyListener(control);
mainFrame.pack();
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
}
void repaint() {
Graphics g = paintCanvas.getGraphics();
//draw background
g.setColor(Color.WHITE);
g.fillRect(0, 0, canvasWidth, canvasHeight);
// draw the snake
g.setColor(Color.BLACK);
LinkedList na = model.nodeArray;
Iterator it = na.iterator();
while (it.hasNext()) {
Node n = (Node) it.next();
drawNode(g, n);
}
// draw the food
g.setColor(Color.RED);
Node n = model.food;
drawNode(g, n);
updateScore();
}
private void drawNode(Graphics g, Node n) {
g.fillRect(n.x * nodeWidth,
n.y * nodeHeight,
nodeWidth - 1,
nodeHeight - 1);
}
public void updateScore() {
String s = "Score: " + model.score;
labelScore.setText(s);
}
public void update(Observable o, Object arg) {
repaint();
}
}本人用java写贪吃蛇。。。如何实现蛇的自动移动,老师说是线程,但是我的java不太好,希望能说详细点
new Thread(new Runnable() {
public synchronized void run() {
while(true){
// 写你的每次移动方向和距离算法
try{
// 死循环内 没隔100毫秒运行一次。
Thread.sleep(100);
}catch(Exception e){}
}
}
}).start();
在注释里写你的算法就行了java 双人贪吃蛇
package game;
/*这是一个双人贪吃蛇游戏
*玩家一 A S D W 控制方向
*玩家二 上下左右 控制方向
*当某玩家无路可走的时候既输
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class HsGame extends JFrame {
HsGame(String str) {
// 设置主面版
this.setTitle(str);
this.setSize(910, 630);
this.setLocation(50, 50);
MyPanel mp = new MyPanel();
this.add(mp);
this.addKeyListener(mp);
new Thread(mp).start();
}
// 主线程
public static void main(String[] args) {
HsGame m = new HsGame("贪吃蛇竞技版");
m.setVisible(true);
}
}
class MyPanel extends JPanel implements Runnable, KeyListener {
int[][] s1 = new int[180][120];
int[][] s2 = new int[180][120];
int x1 = 40;
int y1 = 60;
int x2 = 140;
int y2 = 60;
// 设置线程休眠时间
int sleep = 50;
// 设置初始方向
int fangxiang1 = 2;
int fangxiang2 = 0;
// 构造函数
MyPanel() {
// 初始化界面
for (int ix = 0; ix < 180; ix++) {
for (int iy = 0; iy < 120; iy++) {
s1[ix][iy] = 0;
s2[ix][iy] = 0;
}
}
// 设置边界
// 上下边界
for (int ix = 0; ix < 180; ix++) {
s1[ix][0] = 1;
s1[ix][119] = 1;
s2[ix][0] = 1;
s2[ix][119] = 1;
}
// 左右边界
for (int iy = 0; iy < 120; iy++) {
s1[0][iy] = 1;
s1[179][iy] = 1;
s2[0][iy] = 1;
s2[179][iy] = 1;
}
}
// 画板
public void paint(Graphics g) {
// 显示玩家一
g.setColor(Color.red);
for (int ix = 0; ix < 180; ix++) {
for (int iy = 0; iy < 120; iy++) {
if (s1[ix][iy] == 1) {
g.fillRect(ix * 5, iy * 5, 5, 5);
}
}
}
// 显示玩家二
g.setColor(Color.blue);
for (int ix = 0; ix < 180; ix++) {
for (int iy = 0; iy < 120; iy++) {
if (s2[ix][iy] == 1) {
g.fillRect(ix * 5, iy * 5, 5, 5);
}
}
}
// 画出边界
g.setColor(Color.black);
for (int i = 0; i < 180; i++) {
g.fillRect(i * 5, 0, 5, 5);
g.fillRect(i * 5, 119 * 5, 5, 5);
}
for (int i = 0; i < 120; i++) {
g.fillRect(0, i * 5, 5, 5);
g.fillRect(179 * 5, i * 5, 5, 5);
}
}
public void run() {
while (true) {
switch (fangxiang1) {
case 0:
x1--;
break;
case 1:
y1--;
break;
case 2:
x1++;
break;
case 3:
y1++;
}
switch (fangxiang2) {
case 0:
x2--;
break;
case 1:
y2--;
break;
case 2:
x2++;
break;
case 3:
y2++;
}
// 判断死活
if (s1[x1][y1] == 1 || s2[x1][y1] == 1) {
// 弹出player2胜利对话框
JOptionPane.showMessageDialog(null,
"player 2 win!",
"Game Over !", JOptionPane.ERROR_MESSAGE);
// 结束游戏
System.exit(0);
} else {
s1[x1][y1] = 1;
}
if (s2[x2][y2] == 1 || s1[x2][y2] == 1) {
// 弹出player1胜利对话框
JOptionPane.showMessageDialog(null,
"player 1 win!",
"Game Over !", JOptionPane.ERROR_MESSAGE);
// 结束游戏
System.exit(0);
} else {
s2[x2][y2] = 1;
}
try {
Thread.sleep(sleep);
} catch (Exception e) {
e.printStackTrace();
}
// 重画
this.repaint();
}
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
// 玩家一控制
if (e.getKeyCode() == 65) {
if (fangxiang1 != 2) {
fangxiang1 = 0;
System.out.println("player 1 left");
}
}
if (e.getKeyCode() == 87) {
if (fangxiang1 != 3) {
fangxiang1 = 1;
System.out.println("player 1 up");
}
}
if (e.getKeyCode() == 68) {
if (fangxiang1 != 0) {
fangxiang1 = 2;
System.out.println("player 1 right");
}
}
if (e.getKeyCode() == 83) {
if (fangxiang1 != 1) {
fangxiang1 = 3;
System.out.println("player 1 down");
}
}
// 玩家二控制
if (e.getKeyCode() == 37) {
if (fangxiang2 != 2) {
fangxiang2 = 0;
System.out.println("player 2 left");
}
}
if (e.getKeyCode() == 38) {
if (fangxiang2 != 3) {
fangxiang2 = 1;
System.out.println("player 2 up");
}
}
if (e.getKeyCode() == 39) {
if (fangxiang2 != 0) {
fangxiang2 = 2;
System.out.println("player 2 right");
}
}
if (e.getKeyCode() == 40) {
if (fangxiang2 != 1) {
fangxiang2 = 3;
System.out.println("player 2 down");
}
}
}
public void keyReleased(KeyEvent e) {
}
}求高手现编一个JAVA贪食蛇!
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class SnakeGame extends JFrame {
public SnakeGame(){
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
gamePanel=new MyPanel();
Dimension size=gamePanel.getPreferredSize();
this.setSize(size.width+6,size.height+56);
this.add(gamePanel,BorderLayout.CENTER);
newGame=new JButton("New Game");
newGame.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
gamePanel.newGame();
}
});
newGame.addKeyListener(listener);
this.add(newGame,BorderLayout.SOUTH);
}
public static void main(String[] args){
new SnakeGame().setVisible(true);
}
private JButton newGame;
private MyPanel gamePanel;
private KeyListener listener=new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
int code=e.getKeyCode();
if(code==KeyEvent.VK_UP){
gamePanel.move(Snake.up);
}
else if(code==KeyEvent.VK_RIGHT){
gamePanel.move(Snake.right);
}
else if(code==KeyEvent.VK_LEFT){
gamePanel.move(Snake.left);
}
else if(code==KeyEvent.VK_DOWN){
gamePanel.move(Snake.down);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
};
}
class MyPanel extends JPanel {
public MyPanel(){
food=this.getFoodPoint(snake.getBody());
}
public void paintComponent() {
Graphics g=this.getGraphics();
if(g==null)
return;
//clear
g.clearRect(0, 0, this.getWidth(), this.getHeight());
//draw the border
g.setColor(Color.BLACK);
for(int i=0;i<WIDTH+2;i++){
g.fillRect(i*SIZE.width, 0, SIZE.width, SIZE.height);
g.fillRect(i*SIZE.width,(HEIGHT+1)*SIZE.height,SIZE.width,SIZE.height);
}
for(int i=1;i<HEIGHT+1;i++){
g.fillRect(0,i*SIZE.height , SIZE.width, SIZE.height);
g.fillRect((WIDTH+1)*SIZE.width,i*SIZE.height,SIZE.width,SIZE.height);
}
//draw the food
g.setColor(Color.RED);
g.fillRect(food.x*SIZE.width, food.y*SIZE.height,SIZE.width, SIZE.width);
//draw the snake
LinkedList<Point> body=snake.getBody();
Point head=body.get(0);
g.setColor(Color.ORANGE);
g.fillRect(head.x*SIZE.width, head.y*SIZE.height, SIZE.width, SIZE.height);
g.setColor(Color.GREEN);
for(int i=1;i<body.size();i++){
Point p=body.get(i);
g.fillRect(p.x*SIZE.width, p.y*SIZE.height, SIZE.width, SIZE.height);
}
//draw text
if(gameOver){
g.setColor(Color.BLUE);
Dimension size=this.getPreferredSize();
String s="Game Over";
Font f=new Font(g.getFont().getName(),Font.BOLD,32);
g.setFont(f);
FontMetrics fm=g.getFontMetrics(f);
int length=fm.stringWidth(s);
int height=fm.getHeight();
int x=(size.width-length)/2;
int y=(size.height-height)/2;
g.drawString(s, x, y);
}
}
public Dimension getPreferredSize(){
return new Dimension((WIDTH+2)*SIZE.width,(HEIGHT+2)*SIZE.height);
}
public Point getFoodPoint(Collection<Point> except) {
Random random = new Random();
int x = random.nextInt(30)+1;
int y = random.nextInt(30)+1;
Point result=new Point(x,y);
boolean has=false;
while(true){
Iterator<Point> iter=except.iterator();
while(iter.hasNext()){
if(iter.next().equals(result)){
has=true;
break;
}
}
if(!has)
break;
x = random.nextInt(30);
y = random.nextInt(30);
result=new Point(x,y);
has=false;
}
return new Point(x, y);
}
public void newGame(){
if(timer!=null)
timer.cancel();
gameOver=false;
snake.setBody(new Point[] {
new Point(10, 10), new Point(10, 11), new Point(10, 12),
new Point(10, 13) });
snake.setTowards(Snake.up);
food=this.getFoodPoint(snake.getBody());
timer=new Timer();
timer.schedule(new TimerTask(){
public void run(){
move(snake.getTowards());
}
}, 500, 500);
paintComponent();
}
public void move(int towards){
if(gameOver)
return;
Boolean r=MyPanel.snake.move(towards,food);
if(r==null)
return;
LinkedList<Point> body=snake.getBody();
if(r)
food=this.getFoodPoint(body);
Point head=body.get(0);
boolean over=false;
for(int i=1;i<body.size();i++){
if(head.equals(body.get(i))){
System.out.println(head+""+i+body.get(i));
over=true;
break;
}
}
if(!over){
if(head.x<1||head.y<1||head.x>WIDTH||head.y>HEIGHT)
over=true;
}
if(over){
gameOver=true;
timer.cancel();
paintComponent();
return;
}
paintComponent();
}
private static final int WIDTH = 30;
private static final int HEIGHT = 30;
private static final Dimension SIZE=new Dimension(15,15);
private Point food;
private boolean gameOver=true;
private Timer timer;
public static final Snake snake = new Snake(new Point[] {
new Point(10, 10), new Point(10, 11), new Point(10, 12),
new Point(10, 13) }, Snake.up);
}
class Snake {
public Snake(Point[] body, int towards) {
this.setBody(body);
this.setTowards(towards);
}
public Boolean move(int orien,Point food) {
int x, y;
Point head = body.get(0);
switch (orien) {
case up:
if(towards==down)
return null;
x = head.x;
y = head.y-1;
this.setTowards(up);
break;
case down:
if(towards==up)
return null;
x = head.x;
y = head.y + 1;
this.setTowards(down);
break;
case left:
if(towards==right)
return null;
x = head.x - 1;
y = head.y;
this.setTowards(left);
break;
case right:
if(towards==left)
return null;
x = head.x + 1;
y = head.y;
this.setTowards(right);
break;
default:
return null;
}
Point newHead=new Point(x,y);
body.addFirst(newHead);
if(newHead.equals(food)){
return true;
}
body.removeLast();
return false;
}
public void eat(Point food) {
body.addFirst(food);
}
public int getTowards() {
return this.towards;
}
public void setTowards(int towards) {
this.towards=towards;
}
public LinkedList<Point> getBody(){
return body;
}
public void setBody(Point[] body){
this.body=new LinkedList<Point>();
for (Point b : body)
this.body.add(b);
}
public Point getHead(){
return this.body.get(0);
}
private LinkedList<Point> body;
private int towards = right;
public static final int up = 1;
public static final int down = 2;
public static final int left = 3;
public static final int right = 4;
}
HostKvm商家我们也不用多介绍,这个服务商来自国内某商家,旗下也有多个品牌的,每次看到推送信息都是几个服务商品牌一起推送的。当然商家还是比较稳定的,商家品牌比较多,这也是国内商家一贯的做法,这样广撒网。这次看到黑五优惠活动发布了,针对其主打的香港云服务器提供终身6折的优惠,其余机房服务器依然是8折,另还有充值50美元赠送5美元的优惠活动,有需要的可以看看。HostKvm是一个创建于2013年的...
对于DMIT商家已经关注有一些时候,看到不少的隔壁朋友们都有分享到,但是这篇还是我第一次分享这个服务商。根据看介绍,DMIT是一家成立于2017年的美国商家,据说是由几位留美学生创立的,数据中心位于香港、伯力G-Core和洛杉矶,主打香港CN2直连云服务器、美国CN2直连云服务器产品。最近看到DMIT商家有对洛杉矶CN2 GIA VPS端口进行了升级,不过价格没有变化,依然是季付28.88美元起。...
Hostodo 商家是比较小众的国外VPS主机商,这不看到商家有推送促销优惠在美国西岸的斯波坎机房还有少部分库存准备通过低价格促销,年付低至12美元Linux VPS主机,且如果是1GB内存方案的可以享受六六折优惠,均是采用KVM架构,且可以支付宝付款。第一、商家优惠码优惠码:spokanessd 1GB+内存方案才可以用到优惠码,其他都是固定的优惠低至年12美元。第二、商家促销这里,我们可以看到...
java贪吃蛇为你推荐
重庆干部网络学院重庆大学网络教育学院学历认可吗联想网盘联想网盘收费吗,怎么样网关和路由器的区别网关和路由器有什么区别slideshare什么是slide sandalvipjrvipjr跟哒哒英语比,两家公司的区别在哪里?各自的特点有哪些?网页微信客户端什么叫微信网页版?和电脑版是一回事吗?数秦科技奇秦科技是做什么的,大家了解过吗?系统论坛安卓系统论坛哪个好?清除电脑垃圾怎样清除电脑垃圾新手怎么制作表格怎样能学会制作表格
securitycenter awardspace dreamhost l5639 国外php空间 100x100头像 申请个人网站 老左正传 可外链网盘 美国网站服务器 双线机房 联通网站 湖南idc 国外网页代理 小夜博客 数据湾 ping值 低价 linux命令vi lighttpdwindows 更多