您现在的位置是:首页 > 个人日记个人日记
贪吃蛇小游戏
2019-02-15 20:07:29【个人日记】1128人已围观
简介通过简单的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();}@Overridepublic 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;@Overridepublic 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() {@Overridepublic 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-08-延迟加载
相关文章
随机图文
评论区
2025-11-09 04:27:23
站长
没有登录功能是为了方便大家留言,但留言接口现在被恶意攻击,将关闭留言接口,如有疑问,请联系我的QQ 1538933906/同微信

2020-01-17 11:57:47
我以为下面有效果展示的。。