用Java写一款小游戏
关于本次程序用到的的技能有:数组、监听器、适配器、定时器、本次用到的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写一款小游戏相关推荐
- 【python小游戏】用python写一款小游戏--贪吃蛇
大家好,我是爱吃饼干的小白鼠,今天给大家分享一款自制小游戏.如何用python编写贪吃蛇. 今天,突发奇想的想用python写一款小游戏--贪吃蛇.相信大家都玩过,那么玩一款自己写的是一种什么样的体验 ...
- 用JAVA写个飞机小游戏玩玩吧
闲来无事写了个飞机小游戏. 设定很简单,子弹打到飞机就结束游戏. 实现步骤如下,有问题可以评论区讨论: 首先建立一个PlayGame项目和它之下的包: MyGameFrame(游戏实现)类: pack ...
- java写的麻将小游戏
过年回家在家打麻将,觉得蛮有趣的,就用java写了一个麻将小游戏(没有界面,只能在控制台玩). 说明: 使用语言:java(jdk1.7) 开发工具:eclipse 项目集成:maven 1 麻将说明 ...
- 用Java写“数字华容道”小游戏,适合初学者的小游戏
游戏资源放在这里: 链接:百度网盘 请输入提取码 提取码:9290 在这个小游戏里,我们不仅用到了JFrame类,还用到了继承的方法.所以在这里我们用IDEA实现,在一个包下创建一个华容道类,用来进行 ...
- 用Java写一个五子棋小游戏
棋盘是15*15(可以自己规定) 游戏规则: (1)对局双方各执一色棋子. (2)空棋盘开局. (3)黑先.白后,交替下子,每次只能下一子. (4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动 ...
- 用Java写一个弹球小游戏
目录 一.前言 二.弹球小游戏 (1)分析游戏 (2)游戏代码 一.前言 想做出这个游戏,最好是已经学习过了AWT或者Swing编程,知道了图形界面的知识,也知道绘图.这个游戏可以帮你更好的打牢基础. ...
- 用JAVA写一个趣味小游戏
趣味猜数小游戏代码如下: public class task08 {public static void main(String[] args) {//声明部分int x,target;Scanner ...
- java飞机_使用java写出飞机小游戏
很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目 ...
- 用Java写贪吃蛇小游戏
贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...
最新文章
- 你真的掌握了并发编程volatile synchronized么?
- SAX解析XML文档——(二)
- 关于Python正则表达式的问题
- android 启动第三方程序的代码(利用ComponentName)
- Hybris开发环境的license计算实现
- 2019人工智能实战 第六次作业 段峙宇
- 2020牛客多校第1场I-1 or 2一般图最大匹配带花树
- Java SE 11:推动Java向前发展
- 庖丁解InnoDB之REDO LOG
- 由已打开的文件读取数据---read
- 用QXmlStreamWriter写入xml
- WPF的5种绑定模式(mode)
- Linux宝库的八多和八少
- 老男孩linux运维50期-谢江平
- 常用的测试用例设计方法有那些?看这一篇就够了
- Vant(有赞)UI框架爬坑记——图片轮播+预览
- 如何优化内存?Unity中的内存种类;冯乐乐的总结的优化技术。
- 第十一届蓝桥杯大赛软件类决赛(2020javaB国赛)
- 车轮轨迹原理_方向盘与车轮轨迹图解,方向盘和车轮的动态图
- 女生适合学软件测试吗?这个工作压力大不大?