java编写贪吃蛇小游戏
作者:hebedich 时间:2023-06-19 01:49:54
废话不多说,直接奉上代码:
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;
}
}
以上所述就是本文给大家分享的贪吃蛇的全部代码了,希望能够对大家熟练掌握java有所帮助。
标签:java,小游戏,贪吃蛇
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android中应用前后台切换监听的实现详解
2021-12-28 17:59:36
Java集合之Map接口的实现类精解
2023-10-07 15:10:37
![](https://img.aspxhome.com/file/2023/3/63653_0s.png)
C#实现的JS操作类实例
2023-11-13 05:19:48
Java真题实练掌握哈希表的使用
2023-11-09 06:33:15
![](https://img.aspxhome.com/file/2023/9/59079_0s.png)
Spring jackson原理及基本使用方法详解
2021-10-03 08:28:18
如何让Spring Rest 接口中路径参数可选
2022-02-17 19:29:14
![](https://img.aspxhome.com/file/2023/4/104044_0s.png)
springMVC的生命周期详解
2022-10-29 22:27:40
![](https://img.aspxhome.com/file/2023/8/82328_0s.png)
Android编程ProgressBar自定义样式之动画模式实现方法
2022-02-10 12:54:29
![](https://img.aspxhome.com/file/2023/1/117061_0s.png)
Java中try catch处理异常示例
2023-11-07 00:43:17
Java协程编程之Loom项目实战记录
2023-10-23 17:44:06
![](https://img.aspxhome.com/file/2023/3/89613_0s.png)
Spring Boot 中密码加密的两种方法
2021-09-12 15:08:38
![](https://img.aspxhome.com/file/2023/5/78895_0s.png)
Visual C#中如何使用IComparable和IComparer接口
2021-12-17 20:01:02
IntelliJ IDEA使用教程从入门到上瘾(2019图文版)
2023-03-30 17:00:49
![](https://img.aspxhome.com/file/2023/8/92678_0s.png)
SpringBoot整合Quartz实现定时任务详解
2021-11-22 06:40:57
![](https://img.aspxhome.com/file/2023/4/67144_0s.png)
C#使用windows服务发送邮件
2022-05-31 11:54:55
![](https://img.aspxhome.com/file/2023/9/116429_0s.png)
安卓(Android)中如何实现滑动导航
2023-10-17 10:51:18
Android实现自动匹配关键字并且标红功能
2023-05-29 06:19:28
C# DataGridView添加新行的2个方法
2023-06-23 05:42:19
Android中使用GridView进行应用程序UI布局的教程
2022-03-19 15:18:06
![](https://img.aspxhome.com/file/2023/0/138030_0s.gif)
Fluent Mybatis零xml配置实现复杂嵌套查询
2022-02-03 19:34:32
![](https://img.aspxhome.com/file/2023/9/71859_0s.png)