java編寫貪吃蛇小游戲
更新時間:2015年03月30日 08:58:24 投稿:hebedich
貪吃蛇是經(jīng)典手機(jī)游戲,既簡單又耐玩。通過控制蛇頭方向吃蛋,使得蛇變長,從而獲得積分。今天我們就來用java來實現(xiàn)下貪吃蛇小游戲,有需要的小伙伴可以參考下
廢話不多說,直接奉上代碼:
Frame.java
package snake;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Frame extends JFrame implements KeyListener {
/**
*
*/
Boolean isAlive;
Boolean isPause;
Panel panel;
Character direction;
private static final long serialVersionUID = 1L;
public Frame(){
// TODO Auto-generated constructor stub
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,300);
addKeyListener(this);
panel = new Panel();
add(panel);
setVisible(true);
isAlive = true;
isPause = false;
direction = new Character('d');
MenuBar menuBar = new MenuBar();
Menu menu = new Menu("menu");
MenuItem reset = new MenuItem("newgame");
MenuItem pause= new MenuItem("pause");
pause.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(!isPause) isPause= true;
else isPause= false;
}
});
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
reset();
}
});
menu.add(reset);
menu.add(pause);
menuBar.add(menu);
setMenuBar(menuBar);
}
public void reset(){
panel.reset();
isAlive = true;
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP) direction = 'w';
if(e.getKeyCode()==KeyEvent.VK_DOWN) direction = 's';
if(e.getKeyCode()==KeyEvent.VK_LEFT) direction = 'a';
if(e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd';
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public void paint(Graphics g){
panel.repaint();
}
}
Launch.java
package snake;
import java.util.Timer;
import java.util.TimerTask;
public class Launch extends TimerTask {
Frame frame = new Frame();
public Launch() {
// TODO Auto-generated constructor stub
}
boolean crashWall(){
SnakeBody sb = frame.panel.snake.getFirst();
if((sb.x<0)||(sb.y<0)||(sb.x>=Panel.LINE)||(sb.y>=Panel.LINE))
return true;
else
return false;
}
void initial(){
frame.panel.snake.add(newBody());
frame.panel.food = newBody();
}
@Override
public void run() {
// TODO Auto-generated method stub
if(frame.panel.snake.isEmpty())
initial();
if(frame.isAlive)
if(!frame.isPause){
if(goStraight())
frame.isAlive = false;
frame.repaint();
}
if(crashWall()) frame.isAlive = false;
}
SnakeBody newBody(){
SnakeBody sb = new SnakeBody();
boolean overlap = true;
while(overlap){
overlap =false;
sb.x = (int) (Math.random()*(Panel.LINE-2)+1);
sb.y = (int) (Math.random()*(Panel.LINE-2)+1);
if(!frame.panel.snake.isEmpty())
for(SnakeBody s : frame.panel.snake)
if(sb.equals(s))
overlap =true;
}
return sb;
}
void eat(SnakeBody sb){
frame.panel.snake.addFirst(sb);
}
boolean goStraight(){
boolean result = false;
SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst());
frame.panel.snake.removeLast();
if(frame.direction=='w')
sb.turnUp();
if(frame.direction=='s')
sb.turnDown();
if(frame.direction=='a')
sb.turnLeft();
if(frame.direction=='d')
sb.turnRight();
for(SnakeBody s : frame.panel.snake){
if(sb.equals(s)) result = true;
}
frame.panel.snake.addFirst(sb);
if(sb.equals(frame.panel.food)){
if(frame.direction=='w')
frame.panel.food.turnUp();
if(frame.direction=='s')
frame.panel.food.turnDown();
if(frame.direction=='a')
frame.panel.food.turnLeft();
if(frame.direction=='d')
frame.panel.food.turnRight();
eat(frame.panel.food);
frame.panel.food = newBody();
}
return result;
}
public static void main(String[] args){
// TODO Auto-generated method stub
Launch timertask = new Launch();
Timer timer = new Timer();
timer.schedule(timertask,0,500);
}
}
Panel.java
package snake;
import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;
import javax.swing.JPanel;
public class Panel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
public LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>();
static final int LINE = 10;
SnakeBody food = new SnakeBody(-99,-99);
public Panel() {
// TODO Auto-generated constructor stub
}
public void reset(){
snake.clear();
}
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
for(SnakeBody sb : snake){
g.setColor(Color.black);
g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
g.setColor(Color.orange);
g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
}
g.setColor(Color.red);
g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
}
}
SnakeBody.java
package snake;
class SnakeBody {
int x;
int y;
public SnakeBody() {
// TODO Auto-generated constructor stub
x = 0;
y = 0;
}
public SnakeBody(int a,int b){
x = a;
y = b;
}
public SnakeBody(SnakeBody sb){
this(sb.x,sb.y);
}
public void turnUp(){
y--;
}
public void turnDown(){
y++;
}
public void turnLeft(){
x--;
}
public void turnRight(){
x++;
}
boolean equals(SnakeBody s){
if((x==s.x)&&(y==s.y)) return true;
else return false;
}
}
以上所述就是本文給大家分享的貪吃蛇的全部代碼了,希望能夠?qū)Υ蠹沂炀氄莆誮ava有所幫助。
相關(guān)文章
Java Comparable和Comparator對比詳解
這篇文章主要介紹了Java Comparable和Comparator對比詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
淺析java程序中hibernate的應(yīng)用總結(jié)
hibernate可以理解為是一個中間件它負(fù)責(zé)把java程序的sql語句接收過來發(fā)送到數(shù)據(jù)庫,而數(shù)據(jù)庫返回來的信息hibernate接收之后直接生成一個對象傳給java2013-07-07
Spring Cloud Config配置文件使用對稱加密的方法
Spring Cloud Config提供了兩種加密解密方式,一種是對稱加密,一種是非對稱加密。這篇文章將先展示如何使用對稱加密。感興趣的朋友跟隨腳步之家小編一起學(xué)習(xí)吧2018-05-05
舉例講解Java的Spring框架中AOP程序設(shè)計方式的使用
這篇文章主要介紹了Java的Spring框架中AOP程序設(shè)計方式的使用講解,文中舉的AOP下拋出異常的例子非常實用,需要的朋友可以參考下2016-04-04
springboot+dubbo啟動項目時報錯 zookeeper not connect
這篇文章主要介紹了springboot+dubbo項目啟動項目時報錯 zookeeper not connected的問題,本文給大家定位問題及解決方案,結(jié)合實例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06

