根据视频编写的贪吃蛇游戏

主方法

public class Start {public static void main(String[] args) {new Yard().launch();}
}

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/**** @author xcx* @time 2017年7月28日下午3:44:48*/
public class Yard extends Frame {//设置游戏结束字体Font goFont = new Font("宋体",Font.ITALIC|Font.BOLD,50);//游戏开始的线程PaintThread paintThread = new PaintThread();//游戏得分public static int score = 0;//判断蛇是否死掉private static boolean flag = true;//行数与列数public static final int ROWS = 30;public static final int COLS = 30;// 每个格子的边长public static final int BLOCK_SIZE = 15;//定义一条蛇,一个蛋Snake s = new Snake();Egg e = new Egg();// 加入双缓冲Image offScreenImage = null;public void launch() {setLayout(null);setLocation(200, 200);setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);setVisible(true);addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent arg0) {setVisible(true);System.exit(0);}});// 添加键盘控制事件addKeyListener(new KeyMonitor());// 运行线程
        paintThread.start();}@Overridepublic void paint(Graphics g) {// 保存画笔额颜色Color color = g.getColor();// 设置画笔的颜色
        g.setColor(Color.gray);g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);g.setColor(Color.DARK_GRAY);// 画出横线for (int i = 0; i < ROWS; i++) {g.drawLine(0, BLOCK_SIZE * i, BLOCK_SIZE * COLS, BLOCK_SIZE * i);}// 画出竖线for (int i = 0; i < ROWS; i++) {g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS);}g.setColor(Color.yellow);g.drawString("score"+score, 10, 60);if(flag == false){g.setFont(goFont);g.drawString("game over", 100, 180);paintThread.gameOver();}// 还原画笔的颜色
        g.setColor(color);s.eat(e);e.draw(g);s.draw(g);}@Overridepublic void update(Graphics g) {if (offScreenImage == null) {offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS* BLOCK_SIZE);}Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}//停止public static void stop(){flag = false;}// 不断刷新界面private class PaintThread extends Thread {private boolean running = true;@Overridepublic void run() {while (running) {repaint();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}public void gameOver(){running = false;}}//键盘监听事件private class KeyMonitor extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {s.keyPressed(e);}}
}

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;/**** @author xcx* @time 2017年7月28日下午3:45:03*/
public class Snake {// 蛇的头结点和尾结点private Node head = null;private Node tail = null;private int size = 0;// 自己定义一个头private Node node = new Node(20, 30, Dir.L);public Snake() {head = node;tail = node;size = 1;}// 将一个结点添加到尾巴上public void addToTail() {Node node = null;switch (tail.dir) {case L:node = new Node(tail.row, tail.col + 1, tail.dir);break;case R:node = new Node(tail.row, tail.col - 1, tail.dir);break;case U:node = new Node(tail.row + 1, tail.col, tail.dir);break;case D:node = new Node(tail.row - 1, tail.col, tail.dir);break;}tail.next = node;node.prev = tail;tail = node;size++;}// 将一个结点添加到头上public void addToHead() {Node node = null;switch (head.dir) {case L:node = new Node(head.row, head.col - 1, head.dir);break;case R:node = new Node(head.row, head.col + 1, head.dir);break;case U:node = new Node(head.row - 1, head.col, head.dir);break;case D:node = new Node(head.row + 1, head.col, head.dir);break;}node.next = head;head.prev = node;head = node;size++;}// 从蛇的尾巴删除一个结点private void deleteFromTail() {if (size == 0)return;tail = tail.prev;tail.next = null;}// 将蛇画出public void draw(Graphics g) {if (size <= 0)return;move();for (Node node = head; node != null; node = node.next) {node.draw(g);}}// 蛇移动一下private void move() {addToHead();deleteFromTail();checkDead();}// 检查蛇是否死掉private void checkDead() {// 判断蛇是否撞在了墙上if (head.row < 0 || head.row > Yard.ROWS || head.col < 0|| head.col > Yard.COLS) {Yard.stop();}// 判断蛇是否撞在了自己的身上for (Node node = head.next; node != null; node = node.next) {if (this.getRect().intersects(node.getRect())) {Yard.stop();}}}// 键盘按下后蛇头方向改变public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:if (head.dir != Dir.R)head.dir = Dir.L;break;case KeyEvent.VK_RIGHT:if (head.dir != Dir.L)head.dir = Dir.R;break;case KeyEvent.VK_UP:if (head.dir != Dir.D)head.dir = Dir.U;break;case KeyEvent.VK_DOWN:if (head.dir != Dir.U)head.dir = Dir.D;break;}}// 蛇吃蛋public void eat(Egg e) {if (this.getRect().intersects(e.getRect())) {e.reAppear();addToTail();Yard.score += 5;}}// 判断蛇头所在的格子private Rectangle getRect() {return new Rectangle(Yard.BLOCK_SIZE * head.col, Yard.BLOCK_SIZE* head.row, head.w, head.h);}// 定义结点内部类private class Node {// 结点的高度与宽度int w = Yard.BLOCK_SIZE;int h = Yard.BLOCK_SIZE;// 所在的位置int row, col;// 结点的方向Dir dir = Dir.L;// 后一个结点Node next = null;// 前一个结点Node prev = null;Node(int row, int col, Dir dir) {this.row = row;this.col = col;this.dir = dir;}void draw(Graphics g) {Color color = g.getColor();g.setColor(Color.black);g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h);g.setColor(color);}// 判断节点所在的格子private Rectangle getRect() {return new Rectangle(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row,w, h);}}
}

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;/**** @author xcx* @time 2017年7月28日下午3:45:11*/
public class Egg {// 设置蛋的颜色Color color = Color.green;// 出现的坐标private int row, col;// 蛋的高与宽private int w = Yard.BLOCK_SIZE;private int h = Yard.BLOCK_SIZE;private static Random r = new Random();public Egg(int x, int y) {this.row = x;this.col = y;}public Egg() {this(r.nextInt(Yard.ROWS), r.nextInt(Yard.COLS));}public void reAppear() {        this.row = r.nextInt(Yard.ROWS) ;this.col = r.nextInt(Yard.COLS) ;}// 画出一个蛋public void draw(Graphics g) {Color c = g.getColor();g.setColor(color);g.fillOval(Yard.BLOCK_SIZE * row, Yard.BLOCK_SIZE * col, w, h);g.setColor(c);if (color == Color.green) {color = Color.red;} else {color = Color.green;}}// 得到蛋所在的格子public Rectangle getRect() {return new Rectangle(Yard.BLOCK_SIZE * row, Yard.BLOCK_SIZE * col, w, h);}
}

/****@author xcx *@time 2017年7月28日下午4:14:38*/
public enum Dir {L,R,U,D}

转载于:https://www.cnblogs.com/xcxfuryit/p/7256170.html

Java学习(8):贪吃蛇游戏相关推荐

  1. java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏

    基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...

  2. 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏

    这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...

  3. 关于用Java写的贪吃蛇游戏的一些感想

    学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...

  4. 用java写的游戏you_关于用Java写的贪吃蛇游戏的一些感想

    学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...

  5. java+手柄开发_手把手教你用java轻轻松松开发贪吃蛇游戏

    贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过程. 让我 ...

  6. JAVA游戏开发-超炫酷贪吃蛇游戏源码及教程

    一.前言 某日,看见隔壁家的小朋友在玩一款网络爆款贪吃蛇游戏,感觉很好玩.自己刚好正在学习JAVA编程,也想实现一个类似功能的游戏Demo练手,在网上查看了不少源码案例,全都是很古老的方块式贪吃蛇游戏 ...

  7. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...

    image.png image.png java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = new JFrame(& ...

  8. java超级简单贪吃蛇_java实现简易贪吃蛇游戏

    本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储 import java.awt.*; pu ...

  9. Java 贪吃蛇游戏引言

    欢迎关注公众号: 贪吃蛇小游戏是一款十分经典的小游戏,适合用于新手的练习,花了近两个月的时间,终于可以运行出比较完善的贪吃蛇了,相比于CSDN中的大神,花个几天的时间就可以做出Java版本的贪吃蛇小游 ...

最新文章

  1. Java工程师成神之路 转
  2. 想拿下互联网大厂OFFER,都需要准备什么?
  3. powerdesigner显示工具面板_10分钟看懂Photoshop 绘画(画笔面板1-3)
  4. 软测第二周作业WordCount
  5. 接口和抽象类有什么区别?
  6. SQL Server 数据类型
  7. 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
  8. centos7 mysql5.6.35_Centos7.2.1511 编译安装Mysql5.6.35
  9. Kavex GameDev-Resources
  10. 【解决方案修复谷歌翻译 Windows、macOS】谷歌翻译退出了中国市场不能用了
  11. 中国智慧能源行业行情监测及未来动向规划预测报告2022-2028年
  12. .net core 跨平台UI框架 Avalonia
  13. PTES_Technical_Guidelines(渗透测试执行标准)
  14. Python周刊518期
  15. ARM嵌入式实验 熟悉PROTEUS电子仿真软件的使用(LPC2138)
  16. LT2611UXC-LVDS转HDMI2.0转换芯片
  17. 之江实验室与Science《科学》联合发布智能计算领域十大科学问题
  18. 戴尔刀片服务器盘柜型号,戴尔PowerEdge 4220 42U 机架式盘柜
  19. <table></table>表格标签的基本概念和基本属性
  20. 苹果6plus自动时间不准 修复苹果自动设置时间不准教程(图文)

热门文章

  1. ftp 服务器创建访问连接抱错_如何用固定IP连接FTP服务器?
  2. python周志_python第一周总结
  3. C#判断检测网络是否连接
  4. README.md怎么写比较好
  5. ffmpeg 解码b帧_ffmpeg 解码h264数据丢帧
  6. 开了立体声混音仍然不能内录_相位表是如何为你的混音工作带来帮助的
  7. thread.sleep会释放锁吗_面试 LockSupport.park()会释放锁资源吗?
  8. TypeError: descriptor '__init__' requires a 'super' object but received a 'str'
  9. html如何转换成电子表,如何轻松将电子表格转换为HTML [快速提示] | MOS86
  10. wlop一张多少钱_求解实木家具沙发垫多少钱一张