- 浏览: 54554 次
- 性别:
- 来自: 北京
最新评论
-
fantasy:
76196333 写道有没有中文版的
有的
《Java Concurrency in Practice》(JAVA并发编程实践)电子书 -
i37897892:
你好,这个跟hibernate有关系吗?
在log4j中,按字段传参数到数据库 -
dingjing2010:
里面的内容是不是不全啊
一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版) -
java苹果+番茄:
很好,可能对我有帮助啊
一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版) -
CodingMouse:
谢谢分享!
《POJOs in Action》(pdf)英文版下载
代码:
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class SnakeGame {
public static void main(String[] args) {
SnakeFrame frame = new SnakeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
// ----------记录状态的线程
class StatusRunnable implements Runnable {
public StatusRunnable(Snake snake, JLabel statusLabel, JLabel scoreLabel) {
this.statusLabel = statusLabel;
this.scoreLabel = scoreLabel;
this.snake = snake;
}
public void run() {
String sta = "";
String spe = "";
while (true) {
switch (snake.status) {
case Snake.RUNNING:
sta = "Running";
break;
case Snake.PAUSED:
sta = "Paused";
break;
case Snake.GAMEOVER:
sta = "GameOver";
break;
}
statusLabel.setText(sta);
scoreLabel.setText("" + snake.score);
try {
Thread.sleep(100);
} catch (Exception e) {
}
}
}
private JLabel scoreLabel;
private JLabel statusLabel;
private Snake snake;
}
// ----------蛇运动以及记录分数的线程
class SnakeRunnable implements Runnable {
public SnakeRunnable(Snake snake, Component component) {
this.snake = snake;
this.component = component;
}
public void run() {
while (true) {
try {
snake.move();
component.repaint();
Thread.sleep(snake.speed);
} catch (Exception e) {
}
}
}
private Snake snake;
private Component component;
}
class Snake {
boolean isRun;// ---------是否运动中
ArrayList<Node> body;// -----蛇体
Node food;// --------食物
int derection;// --------方向
int score;
int status;
int speed;
public static final int SLOW = 500;
public static final int MID = 300;
public static final int FAST = 100;
public static final int RUNNING = 1;
public static final int PAUSED = 2;
public static final int GAMEOVER = 3;
public static final int LEFT = 1;
public static final int UP = 2;
public static final int RIGHT = 3;
public static final int DOWN = 4;
public Snake() {
speed = Snake.SLOW;
score = 0;
isRun = false;
status = Snake.PAUSED;
derection = Snake.RIGHT;
body = new ArrayList<Node>();
body.add(new Node(60, 20));
body.add(new Node(40, 20));
body.add(new Node(20, 20));
makeFood();
}
// ------------判断食物是否被蛇吃掉
// -------如果食物在蛇运行方向的正前方,并且与蛇头接触,则被吃掉
private boolean isEaten() {
Node head = body.get(0);
if (derection == Snake.RIGHT && (head.x + Node.W) == food.x
&& head.y == food.y)
return true;
if (derection == Snake.LEFT && (head.x - Node.W) == food.x
&& head.y == food.y)
return true;
if (derection == Snake.UP && head.x == food.x
&& (head.y - Node.H) == food.y)
return true;
if (derection == Snake.DOWN && head.x == food.x
&& (head.y + Node.H) == food.y)
return true;
else
return false;
}
// ----------是否碰撞
private boolean isCollsion() {
Node node = body.get(0);
// ------------碰壁
if (derection == Snake.RIGHT && node.x == 280)
return true;
if (derection == Snake.UP && node.y == 0)
return true;
if (derection == Snake.LEFT && node.x == 0)
return true;
if (derection == Snake.DOWN && node.y == 380)
return true;
// --------------蛇头碰到蛇身
Node temp = null;
int i = 0;
for (i = 3; i < body.size(); i++) {
temp = body.get(i);
if (temp.x == node.x && temp.y == node.y)
break;
}
if (i < body.size())
return true;
else
return false;
}
// -------在随机的地方产生食物
public void makeFood() {
Node node = new Node(0, 0);
boolean isInBody = true;
int x = 0, y = 0;
int X = 0, Y = 0;
int i = 0;
while (isInBody) {
x = (int) (Math.random() * 15);
y = (int) (Math.random() * 20);
X = x * Node.W;
Y = y * Node.H;
for (i = 0; i < body.size(); i++) {
if (X == body.get(i).x && Y == body.get(i).y)
break;
}
if (i < body.size())
isInBody = true;
else
isInBody = false;
}
food = new Node(X, Y);
}
// ---------改变运行方向
public void changeDerection(int newDer) {
if (derection % 2 != newDer % 2)// -------如果与原来方向相同或相反,则无法改变
derection = newDer;
}
public void move() {
if (isEaten()) {// -----如果食物被吃掉
body.add(0, food);// --------把食物当成蛇头成为新的蛇体
score += 10;
makeFood();// --------产生食物
} else if (isCollsion())// ---------如果碰壁或自身
{
isRun = false;
status = Snake.GAMEOVER;// -----结束
} else if (isRun) {// ----正常运行(不吃食物,不碰壁,不碰自身)
Node node = body.get(0);
int X = node.x;
int Y = node.y;
// ------------蛇头按运行方向前进一个单位
switch (derection) {
case 1:
X -= Node.W;
break;
case 2:
Y -= Node.H;
break;
case 3:
X += Node.W;
break;
case 4:
Y += Node.H;
break;
}
body.add(0, new Node(X, Y));
// ---------------去掉蛇尾
body.remove(body.size() - 1);
}
}
}
// ---------组成蛇身的单位,食物
class Node {
public static final int W = 20;
public static final int H = 20;
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
// ------画板
class SnakePanel extends JPanel {
Snake snake;
public SnakePanel(Snake snake) {
this.snake = snake;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Node node = null;
for (int i = 0; i < snake.body.size(); i++) {// ---红蓝间隔画蛇身
if (i % 2 == 0)
g.setColor(Color.blue);
else
g.setColor(Color.yellow);
node = snake.body.get(i);
g.fillRect(node.x, node.y, node.H, node.W);// *******************试用*********************
}
node = snake.food;
g.setColor(Color.red);
g.fillRect(node.x, node.y, node.H, node.W);
}
}
class SnakeFrame extends JFrame {
private JLabel statusLabel;
private JLabel speedLabel;
private JLabel scoreLabel;
private JPanel snakePanel;
private Snake snake;
private JMenuBar bar;
JMenu gameMenu;
JMenu helpMenu;
JMenu speedMenu;
JMenuItem newItem;
JMenuItem pauseItem;
JMenuItem beginItem;
JMenuItem helpItem;
JMenuItem aboutItem;
JMenuItem slowItem;
JMenuItem midItem;
JMenuItem fastItem;
public SnakeFrame() {
init();
ActionListener l = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == pauseItem)
snake.isRun = false;
if (e.getSource() == beginItem)
snake.isRun = true;
if (e.getSource() == newItem) {
newGame();
}
// ------------菜单控制运行速度
if (e.getSource() == slowItem) {
snake.speed = Snake.SLOW;
speedLabel.setText("Slow");
}
if (e.getSource() == midItem) {
snake.speed = Snake.MID;
speedLabel.setText("Mid");
}
if (e.getSource() == fastItem) {
snake.speed = Snake.FAST;
speedLabel.setText("Fast");
}
}
};
pauseItem.addActionListener(l);
beginItem.addActionListener(l);
newItem.addActionListener(l);
aboutItem.addActionListener(l);
slowItem.addActionListener(l);
midItem.addActionListener(l);
fastItem.addActionListener(l);
addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
// ------------方向键改变蛇运行方向
case KeyEvent.VK_DOWN://
snake.changeDerection(Snake.DOWN);
break;
case KeyEvent.VK_UP://
snake.changeDerection(Snake.UP);
break;
case KeyEvent.VK_LEFT://
snake.changeDerection(Snake.LEFT);
break;
case KeyEvent.VK_RIGHT://
snake.changeDerection(Snake.RIGHT);
break;
// 空格键,游戏暂停或继续
case KeyEvent.VK_SPACE://
if (snake.isRun == true) {
snake.isRun = false;
snake.status = Snake.PAUSED;
break;
}
if (snake.isRun == false) {
snake.isRun = true;
snake.status = Snake.RUNNING;
break;
}
}
}
public void keyReleased(KeyEvent k) {
}
public void keyTyped(KeyEvent k) {
}
});
}
private void init() {
speedLabel = new JLabel();
snake = new Snake();
setSize(380, 460);
setLayout(null);
this.setResizable(false);
bar = new JMenuBar();
gameMenu = new JMenu("Game");
newItem = new JMenuItem("New Game");
gameMenu.add(newItem);
pauseItem = new JMenuItem("Pause");
gameMenu.add(pauseItem);
beginItem = new JMenuItem("Continue");
gameMenu.add(beginItem);
helpMenu = new JMenu("Help");
aboutItem = new JMenuItem("About");
helpMenu.add(aboutItem);
speedMenu = new JMenu("Speed");
slowItem = new JMenuItem("Slow");
fastItem = new JMenuItem("Fast");
midItem = new JMenuItem("Middle");
speedMenu.add(slowItem);
speedMenu.add(midItem);
speedMenu.add(fastItem);
bar.add(gameMenu);
bar.add(helpMenu);
bar.add(speedMenu);
setJMenuBar(bar);
statusLabel = new JLabel();
scoreLabel = new JLabel();
snakePanel = new JPanel();
snakePanel.setBounds(0, 0, 300, 400);
snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
add(snakePanel);
statusLabel.setBounds(300, 25, 60, 20);
add(statusLabel);
scoreLabel.setBounds(300, 20, 60, 20);
add(scoreLabel);
JLabel temp = new JLabel("状态");
temp.setBounds(310, 5, 60, 20);
add(temp);
temp = new JLabel("分数");
temp.setBounds(310, 105, 60, 20);
add(temp);
temp = new JLabel("速度");
temp.setBounds(310, 55, 60, 20);
add(temp);
speedLabel.setBounds(310, 75, 60, 20);
add(speedLabel);
}
private void newGame() {
this.remove(snakePanel);
this.remove(statusLabel);
this.remove(scoreLabel);
speedLabel.setText("Slow");
statusLabel = new JLabel();
scoreLabel = new JLabel();
snakePanel = new JPanel();
snake = new Snake();
snakePanel = new SnakePanel(snake);
snakePanel.setBounds(0, 0, 300, 400);
snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
Runnable r1 = new SnakeRunnable(snake, snakePanel);
Runnable r2 = new StatusRunnable(snake, statusLabel, scoreLabel);
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
add(snakePanel);
statusLabel.setBounds(310, 25, 60, 20);
add(statusLabel);
scoreLabel.setBounds(310, 125, 60, 20);
add(scoreLabel);
}
}
还可以从附件中下载:
- SnakeGame.rar (3 KB)
- 下载次数: 212
发表评论
-
关于刘翔退赛的内幕
2008-08-29 15:40 1038关于刘翔退赛的内幕 关于刘翔退赛的事情我想大家也都知道了,但是 ... -
现在时间
2008-07-16 08:30 861... -
spring DAO 实例
2008-07-09 14:13 1364通过这个例子,简单介绍了使用Spring操作数据库流程。使用J ... -
SPRING数据访问对象(DAO)框架入门
2008-07-08 16:48 1451J2EE应用程序中的 ... -
Java开发者的十大戒律
2008-07-08 09:44 815有许多标准和实践准则可适用于Java开发者,但此处要说的,是每 ... -
盖茨33年6大成功和7大失败
2008-06-30 14:52 891美国《财富》杂志发表文章,盘点了盖茨和微软最大的成功和失败案例 ... -
经典的语言
2008-06-30 14:43 895急事,慢慢说 大事,清楚的说 小事,幽默的说 没把握的事,谨慎 ... -
详细设计说明书
2008-06-30 13:05 15461 引言 1 1.1 编写目的:阐明编写详 ... -
Java中的调试工具JDB 的简单使用
2008-06-30 13:04 2585当新手开始学习Java时,在一开始的新鲜感后马上就 ... -
精品收藏。吐血推荐
2008-06-30 10:40 709我看过了感觉不错,特意拿来共享。国内: www.chinaja ... -
java编程书籍
2008-06-30 10:34 888文件名: 里面的东西让你可以征服struts2.rar下载地 ...
相关推荐
开发工具是eclipse,语言是java,源文件有详细的注释供下载着查看学习,并且地图做了封装,可以随意更改
在这个"贪吃蛇-java源代码"项目中,我们可以深入理解如何使用Java语言来实现这样一个游戏。Java是一种广泛应用的面向对象的编程语言,具有平台无关性和强大的类库支持,使得它在开发各种类型的应用程序时都非常方便...
花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了。作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣。世间万物斗转星移,诺基亚曾经作为手机业的龙头...
贪吃蛇是一款经典的休闲游戏,源自1976年的“Blockade”游戏,后...通过分析和修改源代码,可以进一步理解和掌握Java语言的特性和编程技巧。同时,这个项目也鼓励大家学习如何在实际项目中应用所学知识,提升编程能力。
【标签】:“java贪吃蛇小游戏代码”是指用于编写这个游戏的Java代码;“java小游戏源码”指的是整个游戏项目的原始代码,可以帮助开发者理解游戏的逻辑和结构;“java贪”和“贪吃蛇小游戏”是关键词,表明这是关于...
java 贪吃蛇 源代码 java 贪吃蛇 源代码 java 贪吃蛇 源代码
java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 ...
【Java贪吃蛇源代码详解】 Java贪吃蛇游戏是一个经典的编程练习项目,它适合初学者,特别是对Java编程感兴趣的新手和菜鸟。这个项目旨在帮助开发者熟悉基本的编程概念,如控制台输入输出、循环、条件判断以及对象和...
`Worm`类会包含方法来移动蛇,如根据当前方向更新位置、增长蛇身(当吃到食物时)、检查碰撞(边界或自身)以及处理用户输入来改变蛇的方向。此外,该类还可能负责绘制蛇在游戏屏幕上的图像。 2. **WormStage.java*...
纯Java代码完整版贪吃蛇代码,附带食物的变色,计分器 !!可直接运行!
在这个网络版的贪吃蛇游戏中,我们看到使用Java编程语言实现的版本。Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性而著名。下面我们将详细探讨Java在实现网络版贪吃蛇游戏中的应用。 ...
这个项目的源代码提供了实现这个游戏的全部细节,可以帮助学生深入理解Java编程语言以及游戏开发的基本原理。下面我们将详细探讨其中涉及的主要知识点。 1. **Java编程基础**: - **类与对象**:贪吃蛇游戏的实现...
利用Java Swing编写的贪食蛇(GUI),压缩包内为Eclipse创建的工程目录,源代码在Snack/src目录下。利用Eclipse可以直接import该文件夹至Workspace运行查看代码。
JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源...
6、蛇吃了一个食物后,蛇的尾部节点添加一个节点,食物消失。 7、食物每次被蛇吃掉后,要随机再次生成一个新的食物节点。 8、有个计数器,统计蛇的长度和积分,吃一个食物,蛇的长度+1,积分+10 9、通过按空格...
贪吃蛇游戏是一款经典的像素级游戏,玩家需要控制一条不断增长的蛇,通过移动来吃食物,每吃一次食物,蛇的长度就会增加,同时游戏难度也会相应提高。在此Java实现的版本中,我们将探讨以下几个关键知识点: 1. **...
Java贪吃蛇游戏是一款经典的基于控制台的程序,它展示了基础的编程概念,如循环、条件判断、对象和类的设计。下面将详细讲解这个项目中涉及的Java编程知识点。 1. **面向对象编程**:Java是一种面向对象的语言,...