您现在的位置是:首页 > 个人日记个人日记
贪吃蛇小游戏
2019-02-15 20:07:29【个人日记】1012人已围观
简介通过简单的GUI实现小游戏,同时回顾知识,回味经典
这个小游戏无聊的时候消遣写的,同时回顾下GUI布局
用到知识有
- 集合
- 线程
- Swing组件
- 流程控制
- 面向对象
下面附上代码
新建一个类Snack.java
package work.huangxin;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Snack extends JFrame {
private static final long serialVersionUID = 1L;
// 食物
private Point point = new Point();
// 蛇
private LinkedList<Point> lists = new LinkedList<Point>();
// 键
private int key = 37;
// 线程
private Thread newThread = new Thread(new MoveThread());
// 对蛇和食物初始化
private void init() {
point.setLocation(100, 100);
lists.add(new Point(300, 300));
lists.add(new Point(310, 300));
lists.add(new Point(320, 300));
lists.add(new Point(330, 300));
lists.add(new Point(340, 300));
lists.add(new Point(350, 300));
lists.add(new Point(360, 300));
newThread.start();
}
@Override
public void paint(Graphics g) {
Image img = createImage(500, 500);
Graphics g2 = img.getGraphics();
g2.setColor(Color.WHITE);// 白色面板
g2.fillRect(0, 0, 500, 500);
g2.translate(50, 50);
g2.setColor(Color.RED);// 画红框
g2.drawRect(0, 0, 400, 400);
g2.setColor(Color.GREEN);// 画蛇
for (Point point : lists) {
g2.fillRect(point.x, point.y, 10, 10);// 遍历蛇
}
g2.setColor(Color.RED);
g2.fillRect(point.x, point.y, 10, 10);// 填充食物
g.drawImage(img, 0, 0, 500, 500, this);// 画出来
}
class MoveThread implements Runnable {
private boolean isTrue = true;
@Override
public void run() {
while (isTrue) {
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
Point p = lists.getFirst().getLocation();
switch (key) {
case 37:
p.x = p.x - 10;
break;
case 38:
p.y = p.y - 10;
break;
case 39:
p.x = p.x + 10;
break;
case 40:
p.y = p.y + 10;
break;
default:
p.x = p.x - 10;
}
// 判断蛇的坐标
if (p.x < 0 || p.x > 390 || p.y < 0 || p.y > 390 || lists.contains(p)) {
int res = JOptionPane.showConfirmDialog(null, "是否继续游戏", "游戏结束", JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION) {// 选择继续游戏
lists.clear();// 清空集合
key = 37;
point.setLocation(100, 100);
lists.add(new Point(300, 300));
lists.add(new Point(310, 300));
lists.add(new Point(320, 300));
lists.add(new Point(330, 300));
lists.add(new Point(340, 300));
lists.add(new Point(350, 300));
lists.add(new Point(360, 300));
continue;
} else {
System.exit(0);
}
}
lists.addFirst(p);// 向第一个增加蛇头
if (p.equals(point)) {
int x;
int y;
while (true) {
// 让食物以10单位增加
x = new Random().nextInt(400);
y = new Random().nextInt(400);
if (x % 10 == 0 && y % 10 == 0) {
break;
}
}
point.setLocation(x, y);
} else {
lists.removeLast();// 移除最后一个
}
Snack.this.repaint();
}
}
}
public Snack() {
// 当前对象
this.setTitle("贪吃蛇");// 设置标题
this.setResizable(false);// 设置窗体大小不可变
this.setVisible(true);// 设置窗体可见
this.setSize(500, 500);// 设置窗体大小
this.setLocationRelativeTo(null);// 窗体居中
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() > 36 && e.getKeyCode() < 41) {
if (Math.abs(key - e.getKeyCode()) != 2) {
key = e.getKeyCode();
}
}
}
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭事件
init();
}
public static void main(String[] args) {
new Snack();
}
}
代码仅供参考,当然不足的地方很多,如果有什么想法可以在下面留言,游戏基本功能已经实现,可以在基础上增加小功能
Tags: Java基础
上一篇: 网页抓取工具
下一篇: mybatis-05-动态SQL
相关文章
随机图文
评论区
2024-12-21 19:21:30
站长
没有登录功能是为了方便大家留言,但留言接口现在被恶意攻击,将关闭留言接口,如有疑问,请联系我的QQ 1538933906/同微信
2020-01-17 11:57:47
我以为下面有效果展示的。。