关于本次程序用到的的技能有:数组、监听器、适配器、定时器、本次用到的Java的swing不需要记住这已经被淘汰

效果展示

窗口

import javax.swing.*;
import java.awt.*;public class DomeMain {public static void main(String[] args) {//创建一个窗体JFrame jf = new JFrame();//给窗体设置一个标题:jf.setTitle("贪吃蛇");//设置窗体弹出坐标,对应窗体的宽和高int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;jf.setBounds((width-800)/2,(height-800)/2,800,800);//设置窗体大小不可调jf.setResizable(false);//关闭窗口的同时关闭程序jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//创建面板:GamePanel gp = new GamePanel();//将面板放入窗体jf.add(gp);//默认情况下窗体是隐藏效果,必须将窗体进行显现:细节-->这个显现方法最好放在最后jf.setVisible(true);}
}

把图片抽象化

import javax.swing.*;
import java.net.URL;//本类专门用来获取游戏中所涉及的图片public class Images {//面向对象的语言,面向对象的思维-->将图片进行封装,封装成为一个对象,这样在程序中才可以通过操作这个对象来操做图片//将图片封装为一个对象public  static URL bodyURL = Images.class.getResource("/images/body.jpg");//将图片封装为程序的一个对象public static ImageIcon bodyImg = new ImageIcon(bodyURL);//将图片封装为一个对象public  static URL foodURL = Images.class.getResource("/images/food.jpg");//将图片封装为程序的一个对象public static ImageIcon foodImg = new ImageIcon(foodURL);//将图片封装为一个对象public  static URL headURL = Images.class.getResource("/images/head.jpg");//将图片封装为程序的一个对象public static ImageIcon headImg = new ImageIcon(headURL);//将图片封装为一个对象public  static URL downURL = Images.class.getResource("/images/head - down.jpg");//将图片封装为程序的一个对象public static ImageIcon downImg = new ImageIcon(downURL);//将图片封装为一个对象public  static URL leftURL = Images.class.getResource("/images/head - left.jpg");//将图片封装为程序的一个对象public static ImageIcon leftImg = new ImageIcon(leftURL);//将图片封装为一个对象public  static URL rightURL = Images.class.getResource("/images/head - right.jpg");//将图片封装为程序的一个对象public static ImageIcon rightImg = new ImageIcon(rightURL);//将图片封装为一个对象public  static URL titleURL = Images.class.getResource("/images/title.jpg");//将图片封装为程序的一个对象public static ImageIcon titleImg = new ImageIcon(titleURL);}

程序的逻辑代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;//GamePanel继承了JPanel以后,才具备面板的功能,才能成为一个面板
public class GamePanel extends JPanel{//paintComponent这个方法比较特殊,这个方法就属于图形版的main方法,自动调用//定义两个数组//蛇的长度int lenght;//一个数组,专门存储蛇的X轴坐标int[] snakeX = new int[200];//一个数组,专门存储蛇的Y轴坐标int[] snakeY = new int[200];//游戏只有两个状态:开始,结束boolean isStart = false;//默认是暂停//加入一个定时器Timer timer;//定义蛇的行走放向String direction;//定义食物的X,Y轴坐标int foodX;int foodY;//定义一个积分int score;//加入一个变量,判断小蛇的死亡状态boolean isDie = false;//默认情况小蛇没有死亡public void  init(){//初始化蛇的长度lenght = 3;//初始化蛇头坐标snakeX[0] = 175;snakeY[0] = 275;//初始化第一节身子坐标snakeX[1] = 150;snakeY[1] = 275;//初始化第二节身子坐标snakeX[2] = 125;snakeY[2] = 275;//初始化蛇的蛇头方向direction = "R";//U D L R//初始化食物的坐标foodX = 300;foodY = 200;//初始化一个积分score = 0;}GamePanel(){init();//将焦点定位在当前做的面板上:this.setFocusable(true);//加入监听,监听按键的按下操作this.addKeyListener(new KeyAdapter() {//设配器模式@Overridepublic void keyPressed(KeyEvent e){super.keyPressed(e);int keyCode = e.getKeyCode();System.out.println(keyCode);if (keyCode == KeyEvent.VK_SPACE){//监听空格if (isDie){//全部恢复初始化状态init();isDie = false;}else{//小蛇没有死亡的情况下System.out.println("点击了空格");isStart = !isStart;repaint();//重绘的动作}}//监听向上箭头if(keyCode == KeyEvent.VK_UP){direction = "U";}//监听向下箭头if(keyCode == KeyEvent.VK_DOWN){direction = "D";}//监听向左箭头if(keyCode == KeyEvent.VK_LEFT){direction = "L";}//监听向右箭头if(keyCode == KeyEvent.VK_RIGHT){direction = "R";}}});//对定时器进行一个初始化操作timer = new Timer(100, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//事件监听,相当于每100ms监听一下你是否发生了一个动作具体的动作放入actionPerformedif (isStart&&isDie == false){//游戏是开始状态的时候,蛇才动,后一节身子走到前一节身子的位置上for (int i = lenght-1;i>0;i--){snakeX[i] = snakeX[i-1];snakeY[i] = snakeY[i-1];}//动头if ("R".equals(direction)){snakeX[0]+=25;}if ("L".equals(direction)){snakeX[0]-=25;}if ("U".equals(direction)){snakeY[0]-=25;}if ("D".equals(direction)){snakeY[0]+=25;}//防止蛇超出边界if (snakeX[0]>750){snakeX[0] = 25;}if (snakeX[0]<25){snakeX[0] = 750;}if (snakeY[0]<100){snakeY[0] = 725;}if (snakeY[0]>750){snakeY[0] = 100;}//检测碰撞操作://食物的坐标和蛇头的坐标一样是,算作碰到if (snakeX[0] == foodX&&snakeY[0] == foodY){//蛇的长度+1lenght++;//食物的坐标改变,随机生成坐标坐标必须是25的倍数/*[25,750] -> [1,30]*25Math.random() -> [0.0,1.0)Math.random()*30 -> [0.0,30.0)(int)(Math.random()*30)+1 ->[1,30]*//*[100,725] -> [4,29]*25[4,29]->[0,25]+4[0,25]new Random().nextInt(26) -> [0,26) ->[0,25]*/foodX = ((int)(Math.random()*30)+1)*25;//【25,750】foodY = (new Random().nextInt(26)+4)*25;//【100,725】//吃上食物以后 积分加十分score += 10;}//死亡判定for (int i = 1;i<lenght;i++){if (snakeX[i] == snakeX[0]&&snakeY[i] == snakeY[0]){//将死亡状态改为trueisDie = true;}}repaint();//重绘}}});//定时器必须要启动timer.start();}@Overrideprotected void paintChildren(Graphics g) {super.paintChildren(g);//填充背景颜色this.setBackground(new Color(77,255,36));//paintIcon四个参数:this指的是当前面板 g:指的是当前使用的画笔 x,y对应的坐标Images.titleImg.paintIcon(this,g,2,10);//头部图片//调整话笔颜色g.setColor(new Color(240,245,117));//画一个矩形g.fillRect(6,70,775,685);//画小蛇//蛇头朝向if("R".equals(direction)){Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);}else if ("L".equals(direction)){Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);}else if ("U".equals(direction)){Images.headImg.paintIcon(this,g,snakeX[0],snakeY[0]);}else if("D".equals(direction)){Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);}
//        //第一节身子
//        Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
//        //第二节身子
//        Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);//优化为循环画蛇的部分for (int i = 1;i<lenght;i++){Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);}//如果游戏是暂停的,界面会有一句提示语if (isStart == false){//画一个文字g.setColor(new Color(114,98,255));//颜色//三个参数:字体,加粗,字号g.setFont(new Font("微软雅黑",Font.BOLD,40));//画文字:三个参数:文字内容,X轴坐标,Y轴坐标g.drawString("点击空格开始游戏",250,300);}//画食物:Images.foodImg.paintIcon(this,g,foodX,foodY);//画积分g.setColor(new Color(255,3,9));//颜色//三个参数:字体,加粗,字号g.setFont(new Font("微软雅黑",Font.BOLD,20));//画文字:三个参数:文字内容,X轴坐标,Y轴坐标g.drawString(""+score,650,40);//画入死亡状态if (isDie){g.setColor(new Color(255,3,9));//颜色//三个参数:字体,加粗,字号g.setFont(new Font("微软雅黑",Font.BOLD,35));//画文字:三个参数:文字内容,X轴坐标,Y轴坐标g.drawString("小蛇死亡 共得分:"+score,200,200);}}
}

用Java写一款小游戏相关推荐

  1. 【python小游戏】用python写一款小游戏--贪吃蛇

    大家好,我是爱吃饼干的小白鼠,今天给大家分享一款自制小游戏.如何用python编写贪吃蛇. 今天,突发奇想的想用python写一款小游戏--贪吃蛇.相信大家都玩过,那么玩一款自己写的是一种什么样的体验 ...

  2. 用JAVA写个飞机小游戏玩玩吧

    闲来无事写了个飞机小游戏. 设定很简单,子弹打到飞机就结束游戏. 实现步骤如下,有问题可以评论区讨论: 首先建立一个PlayGame项目和它之下的包: MyGameFrame(游戏实现)类: pack ...

  3. java写的麻将小游戏

    过年回家在家打麻将,觉得蛮有趣的,就用java写了一个麻将小游戏(没有界面,只能在控制台玩). 说明: 使用语言:java(jdk1.7) 开发工具:eclipse 项目集成:maven 1 麻将说明 ...

  4. 用Java写“数字华容道”小游戏,适合初学者的小游戏

    游戏资源放在这里: 链接:百度网盘 请输入提取码 提取码:9290 在这个小游戏里,我们不仅用到了JFrame类,还用到了继承的方法.所以在这里我们用IDEA实现,在一个包下创建一个华容道类,用来进行 ...

  5. 用Java写一个五子棋小游戏

    棋盘是15*15(可以自己规定) 游戏规则: (1)对局双方各执一色棋子. (2)空棋盘开局. (3)黑先.白后,交替下子,每次只能下一子. (4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动 ...

  6. 用Java写一个弹球小游戏

    目录 一.前言 二.弹球小游戏 (1)分析游戏 (2)游戏代码 一.前言 想做出这个游戏,最好是已经学习过了AWT或者Swing编程,知道了图形界面的知识,也知道绘图.这个游戏可以帮你更好的打牢基础. ...

  7. 用JAVA写一个趣味小游戏

    趣味猜数小游戏代码如下: public class task08 {public static void main(String[] args) {//声明部分int x,target;Scanner ...

  8. java飞机_使用java写出飞机小游戏

    很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目 ...

  9. 用Java写贪吃蛇小游戏

    贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...

最新文章

  1. 你真的掌握了并发编程volatile synchronized么?
  2. SAX解析XML文档——(二)
  3. 关于Python正则表达式的问题
  4. android 启动第三方程序的代码(利用ComponentName)
  5. Hybris开发环境的license计算实现
  6. 2019人工智能实战 第六次作业 段峙宇
  7. 2020牛客多校第1场I-1 or 2一般图最大匹配带花树
  8. Java SE 11:推动Java向前发展
  9. 庖丁解InnoDB之REDO LOG
  10. 由已打开的文件读取数据---read
  11. 用QXmlStreamWriter写入xml
  12. WPF的5种绑定模式(mode)
  13. Linux宝库的八多和八少
  14. 老男孩linux运维50期-谢江平
  15. 常用的测试用例设计方法有那些?看这一篇就够了
  16. Vant(有赞)UI框架爬坑记——图片轮播+预览
  17. 如何优化内存?Unity中的内存种类;冯乐乐的总结的优化技术。
  18. 第十一届蓝桥杯大赛软件类决赛(2020javaB国赛)
  19. 车轮轨迹原理_方向盘与车轮轨迹图解,方向盘和车轮的动态图
  20. 女生适合学软件测试吗?这个工作压力大不大?

热门文章

  1. Leetcode 题解-59题
  2. 深度学习之目标检测(十一)--DETR详解
  3. serialize()方法
  4. 向量运算 与 JavaScript
  5. 【githubshare】基于 C 语言编写的一款 2D 太空射击游戏,已在 Windows 10 和 Ubuntu Linux 16.04 系统上跑通测试
  6. HTML复选框checkbox默认样式修改
  7. 蓝桥杯学习记录-基础练习
  8. 网络设计与网络设备配置,网络设计需要哪些设备
  9. Django实现用户管理
  10. 模板--二分图最大匹配