在贪吃蛇游戏中,贪吃蛇的移动可以看作是一个先进先出的队列(从蛇尾的角度看),因此我们在C语言实现贪吃蛇小游戏一文中使用了循环链接表作为队来存储蛇身节点,在 python实现贪吃蛇小游戏一文中,使用列表来存储蛇身节点,在 java 语言里,也可以使用向量来实现和 链表、列表类似的功能。游戏效果如下(gif):

完整实现代码:

package lee;import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.Timer;public class Snakey extends JFrame{private JFrame jf = new JFrame("Snakey");private MyCanvas drawArea = new MyCanvas();private int Side=30;//方形网格边长private int Row;//行数private int Column;//列数private int[][] RoadBlock;private Timer timer;//定时器private int fps=300;//定时器周期private int pos_x=0;private int pos_y=0;private int direct=0;private Vector V=new Vector(2,1);private Vector F=new Vector(1);private int score=0;Random rd=new Random();//Image bird =Toolkit.getDefaultToolkit().getImage("C:\\Users\\Kansa\\Pictures\\Saved Pictures\\red_bird.jpg");public Snakey() {super("Snakey");this.Row=15;this.Column=20;this.RoadBlock=new int[Column][Row];init();}public Snakey(int Row,int Column) {super("Snakey");this.Row=Row;this.Column=Column;this.RoadBlock=new int[Column][Row];init();}private class WindowCloser extends WindowAdapter{public void windowClosing(WindowEvent we) {timer.stop();System.exit(0);}}public void init() {Move move;int Wide=Side*Column;int High=Side*Row;int[] point=new int[2];point[0]=rd.nextInt(Column);point[1]=rd.nextInt(Row);RoadBlock[point[0]][point[1]]=1;V.add(point);//随机一个蛇身move=new Move();int[] food=new int[2];food[0]=rd.nextInt(Column);food[1]=rd.nextInt(Row);if(V.size()<Row*Column-1) {while(RoadBlock[food[0]][food[1]]==1) {food[0]=rd.nextInt(Column);food[1]=rd.nextInt(Row);}F.add(food);RoadBlock[food[0]][food[1]]=-1;}else {System.out.println("Game Over");return;}//获得屏幕分辨率Toolkit toolkit=Toolkit.getDefaultToolkit();Dimension scrnsize=toolkit.getScreenSize();jf.add(drawArea,"Center");jf.setSize(Wide+Side/4,High+Side*7/5);jf.setLocation((scrnsize.width-Wide)/2, (scrnsize.height-High)/2);jf.setResizable(false);jf.setVisible(true);drawArea.setSize(Wide,High);drawArea.setBackground(new Color(222,224,250));drawArea.setBounds(0,0, Wide,High);jf.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent ke) {switch(ke.getKeyCode()) {case KeyEvent.VK_UP:if(direct!=2)//move.move_up();direct=1;break;case KeyEvent.VK_DOWN:if(direct!=1)//move.move_down();direct=2;break;case KeyEvent.VK_LEFT:if(direct!=4)//move.move_left();direct=3;break;case KeyEvent.VK_RIGHT:if(direct!=3)//move.move_right();direct=4;break;}}});jf.addWindowListener(new WindowCloser());ActionListener taskPerformer=evt->{switch(direct){case 1:pos_y--;move.move_up();break;case 2:pos_y++;move.move_down();break;case 3:pos_x--;move.move_left();break;case 4:pos_x++;move.move_right();break;}if(pos_x>=0 && pos_x<Column && pos_y>=0 && pos_y<Row) {int[] p=new int[] {pos_x,pos_y};if(RoadBlock[pos_x][pos_y]==0) {RoadBlock[pos_x][pos_y]=1;V.add(p);p=(int[]) V.remove(0);RoadBlock[p[0]][p[1]]=0;}else if(RoadBlock[pos_x][pos_y]==-1) {score++;RoadBlock[pos_x][pos_y]=1;V.add(p);food[0]=rd.nextInt(Column);food[1]=rd.nextInt(Row);if(V.size()<Row*Column-1) {while(RoadBlock[food[0]][food[1]]==1) {food[0]=rd.nextInt(Column);food[1]=rd.nextInt(Row);}F.set(0,food);RoadBlock[food[0]][food[1]]=-1;}else {JOptionPane.showMessageDialog(jf, "恭喜达到人生巅峰");System.exit(0);}}else {if(direct!=0) {timer.stop();int select=JOptionPane.showConfirmDialog(jf, "SCORE:"+score+"\n是否重新游戏?","Game Over!",0);switch (select) {case 0:jf.setVisible(false);new Snakey(15,20);break;default:System.exit(0);break;}return;}}drawArea.repaint();}else {timer.stop();int select=JOptionPane.showConfirmDialog(jf, "SCORE:"+score+"\n是否重新游戏?","Game Over!",0);switch (select) {case 0:jf.setVisible(false);new Snakey(15,20);break;default:System.exit(0);break;}return;}};timer = new Timer(fps, taskPerformer);timer.start();}public class MyCanvas extends Canvas {public void paint(Graphics graphics) {Graphics2D g=(Graphics2D)graphics;int[] pos=new int[2];g.setColor(Color.BLACK);for(int i=0;i<=Row;i++) {g.drawLine(0, i*Side, Column*Side, i*Side);}for(int i=0;i<=Column;i++) {g.drawLine(i*Side, 0 , i*Side, Row*Side);}for(int i=0;i<V.size();i++) {pos=(int[]) V.get(i);g.fillRect(pos[0]*Side, pos[1]*Side, Side, Side);}pos=(int[]) F.get(0);g.setColor(Color.RED);g.fillOval(pos[0]*Side, pos[1]*Side, Side, Side);}}public class Move {private int[] point=new int[2];public Move() {point=(int[]) V.get(V.size()-1);pos_x=point[0];pos_y=point[1];}public void move_up() {//pos_y--;direct=1;}public void move_down() {//pos_y++;direct=2;}public void move_left() {//pos_x--;direct=3;}public void move_right() {//pos_x++;direct=4;}}public static void main(String[] args) {Snakey snakey=new Snakey(15,20);}
}

java 实现贪吃蛇小游戏相关推荐

  1. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  2. Java开发贪吃蛇小游戏

    Java开发贪吃蛇小游戏 文章目录 Java开发贪吃蛇小游戏 一.开发思路 二.具体开发过程 1.绘制静态游戏窗口 2.导入素材图标 3.绘制游戏面板 4.绘制一条静态的小蛇 5.让小蛇动起来 ①监听 ...

  3. 用 Java 实现贪吃蛇小游戏

    程序说明 这是一个用 Java Awt 实现的贪吃蛇小游戏的完整代码 算法分析 (一)启动一个独立线程根据 direction 重绘面板实现蛇身移动效果,运行过程: 记录上次头部的坐标到 tempBo ...

  4. Java实现贪吃蛇小游戏(附完整源码)

    今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现. 第一步完成的功能:写一个界面 大家见到的贪吃蛇小游戏,界面肯定是少不了的.因此,第一步就是写一个小界面. 实现代码 ...

  5. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

  6. Java Swing 贪吃蛇小游戏

    静态资源参考: 注:实际上没有用到header.png. 工程目录: 源码: package snake;import javax.swing.*; import java.net.URL;/*** ...

  7. 初识Java之贪吃蛇小游戏

    一.绘制静态窗口 这是一个简陋的窗口 package Snake;import javax.swing.*;public class StartGames {public static void ma ...

  8. Java实现贪吃蛇小游戏

    运行效果如下: 新建Yard类 import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt. ...

  9. 【Java】Java实现贪吃蛇小游戏(带详细注释)

    源码 源码来源:Java swing 写的贪吃蛇代码200行 前段时间在博客上看到了这段源码,由于自己没有用Java做过小游戏,于是就copy了一下,然后在自己电脑上运行,顺便加上了注释. 代码 gr ...

最新文章

  1. 基于SSM实现社区医院管理系统
  2. 【技能提升】delegate为什么要用weak
  3. QT学习:QAxObject对象访问
  4. leetcode142 环形链表II
  5. hive随机抽取100条数据_用Excel进行随机抽取数据
  6. 英文版Windows2k服务器无法正常返回中文的问题
  7. 拓端tecdat:R语言用加性多元线性回归、随机森林、弹性网络模型预测鲍鱼年龄和可视化
  8. Pix4dmapper航测教程——全流程内业处理
  9. Matlab中进行高斯滤波-学习笔记
  10. leaflet 加载海量点位,点击marker 查看详情功能
  11. 5个相见恨晚的设计资源网站,记得收藏。
  12. HTML5、CSS、JS基础
  13. 算法刷题记录(Day 73)
  14. 地图行业应用的难点思考
  15. Android Automotive车载嵌入式系统
  16. Android 音乐裁剪器
  17. 【闪电搜索算法】基于闪电搜索算法求解单目标优化问题matlab代码
  18. C#:Invoke 和 BeginInvoke 的真正涵义
  19. 小米10pro卡刷教程 卡刷升级官方系统方法
  20. 《广东省灵活就业人员参加失业保险办法(试行)》的通知

热门文章

  1. 福田中心区中海华庭航拍看楼体和周围配套全景VR解读(40P)
  2. rosdep init和rosdep update出错的解决办法
  3. 苹果手机上网很慢_手机网络慢还不稳定?打开这个“隐藏功能”,网速会有明显提升!...
  4. 计算机在化学中的应用课程名称英文翻译,计算机在化学中的应用,application of computers in chemistry,音标,读音,翻译,英文例句,英语词典...
  5. 某公司北京研发中心“产品经理”内训圆满结束!
  6. Avast Free Antivirus
  7. 字词句段篇章语言训练人教版上册r_字词句段篇章六年级人教版
  8. PostgreSQL服务器管理:从源代码安装
  9. Java面向对象练习-电话本管理系统
  10. NFT 2.0:创新潜力与投资指南