java swing最简单贪吃蛇原理及源码 您所在的位置:网站首页 java贪吃蛇课程设计心得体会 java swing最简单贪吃蛇原理及源码

java swing最简单贪吃蛇原理及源码

2024-07-15 02:18| 来源: 网络整理| 查看: 265

找了好多案例,发现都是贴图的,要么就是代码无法运行的,好不容易找到一个,结果代码粘贴的辣眼睛。

我的笔记中其中两篇详细介绍原理

java怎么绘制方块,这个网上不好找:https://liu-endong.blog.csdn.net/article/details/103359714java方块移动,蛇移动的原理 :https://liu-endong.blog.csdn.net/article/details/103369512

参考:https://blog.csdn.net/lengyuhong/article/details/4926776

主要是参考本链接代码来写的,他这个代码可以直接跑通,但是界面和其他冗余代码有一点,就改了下,附上自己的理解发上来

接下来就是整个贪吃蛇,包结构        

贪吃蛇这个原理:

蛇身打印,利用矩形填充打印方块,几个方块存储在数组中,按顺序打印出来。数组存储的数据时按键方向判断之后对相应方向、比如上或者下加上高度或者宽度。蛇移动,就是不停刷新界面,重新绘制方块。方块的绘制上面连接里面有,刷新方块上面连接也有。键盘控制方向,键盘是new一个键盘监视器,把他给SnakeClient,然后new SnakeClient时候就可以调用。每个按键都有自己的代码,用getKeyCode返回按键值,然后用一个case给方向Direction赋值。其中方向,用了一个枚举类型来存储四个方向,不用枚举应该也可以,使用字符串常量,或者一个变量给四个值来判断方向,我还没有尝试,大家有兴趣可以自己试试。吃食物,用一个矩形区域检测,这个是java自带的,直接调用Rectangle中的这个检测函数。把food的矩形和蛇头的矩形区域比较。比较之后再次重新调用food的set函数设置food下次出现位置。this涉及的比较多,函数重写有一点,就是paint,还有repaint调用。学会这个对对象和类有挺大帮助。

代码缺点:

还没实现蛇身碰撞检测,这会加大代码量,本代码力求最简单还没实现边界检测,蛇会跑到界面外还没实现计分板功能,虽然这个需求比较简单,但是我们的目标是尽量少的代码,让初学者能看懂

第一个是显示界面,运用线程启动,用刷新来重新绘制图形

package cn.led.snake; import java.awt.*; import java.awt.event.*; public class SnakeClient extends Frame{ Snake mySnake = new Snake(this); Food food = new Food(this); public void lanch(){ this.setBounds(200,100, 700,700); //设置窗体大小和位置 this.setTitle("我是贪吃蛇"); this.setVisible(true); //使用该属性才能显示窗体 this.setBackground(Color.black); //实现程序运行关闭的功能 this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(-1); } }); this.addKeyListener(new KeyMointer());//调用键盘,不启用这个无法开启键盘控制 new Thread(new PaintThread()).start();//开启线程 } //画图函数,这个是重写paint,貌似是Frame类的内置函数 public void paint(Graphics g){ mySnake.paint(g); food.paint(g); } class PaintThread implements Runnable{ public void run() { //while(true)保持蛇能一直运行 while(true){ repaint(); try { //物体运行太快,肉眼无法追踪,这是减慢速度,使得肉眼能跟上刷新速度 Thread.sleep(250); } catch (InterruptedException e) { e.printStackTrace(); } } } } //键盘控制 class KeyMointer extends KeyAdapter{ public void keyPressed(KeyEvent e){ mySnake.keyPress(e); } } public static void main(String[] args){ SnakeClient snakeClient = new SnakeClient(); snakeClient.lanch(); } }

第二个是蛇的绘制

package cn.led.snake; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; public class Snake { final static int WIDTH = 20;//蛇身的宽 final static int HEIGHT = 20;//蛇身的高 final static int maxLong = 900;//蛇最多节数 enum Direction{Left,Up,Right,Down};//方向枚举 int number = 5;//蛇身初始化节数 int[] x = new int[maxLong];//蛇身x轴位置 int[] y = new int[maxLong]; //蛇身y轴位置 Direction snakeDirection ; SnakeClient sc; public Snake(SnakeClient sn) { this.number = 5; //初始化蛇身,不初始化可能会随机出现在界面外 for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有