@[TOC]
package com.xdr630.snake; // awt import javax.swing.*; * @author xdr630 * @version 1.0 * @date 2021/2/23 9:35 public class StartGames { public static void main(String[] args) { // 1.绘制一个静态窗口 JFrame JFrame jFrame = new JFrame("兮动人-贪吃蛇小游戏"); // 设置界面大小 jFrame.setBounds(10,10,900,720); // 窗口大小不可改变 jFrame.setResizable(false); // 设置关闭时间,游戏关闭了 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 2. 面板 JPanel 可以加入到JFrame jFrame.add(new GamePanel()); // 让窗口能够展现出来 jFrame.setVisible(true); }2. GamePanel:游戏控制面板
package com.xdr630.snake; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; * @author xdr630 * @version 1.0 * @date 2021/2/23 10:06 public class GamePanel extends JPanel implements KeyListener,ActionListener { int length; //蛇的坐标 X int[] snakeX = new int[600]; //蛇的坐标 Y int[] snakeY = new int[500]; // R:右,L:左,U:上,D:下,蛇头的方向 String fx = "R"; //游戏是否开始 boolean isStart = false; //定时器,第一个参数,就是定时执行时间 Timer timer = new Timer(100,this); //食物 int foodx; int foody; Random random = new Random(); //游戏是否结束 boolean isFail = false; //游戏分数 int score; //构造方法 public GamePanel(){ //初始化 init(); //获取焦点事件 this.setFocusable(true); //键盘监听事件 this.addKeyListener(this); //让时间动起来 timer.start(); //初始化方法 public void init(){ //初始小蛇有三节,包括小脑袋。初始化开始的蛇,给蛇定位 length = 3; //头部坐标 snakeX[0] = 100; snakeY[0] = 100; //第一个身体坐标 snakeX[1] = 75; snakeY[1] = 100; //第二个身体坐标 snakeX[2] = 50; snakeY[2] = 100; //初始化食物数据 foodx = 25 + 25 * random.nextInt(34); foody = 75 + 25 * random.nextInt(24); //初始化游戏分数 score = 0; // 画板:画界面,画蛇 // Graphics:画笔 @Override protected void paintComponent(Graphics g) { //清屏 super.paintComponent(g); //设置背景颜色 this.setBackground(Color.WHITE); //绘制头部的广告栏 Data.header.paintIcon(this,g,25,11); //绘制游戏区域 g.fillRect(25,75,850,600); //画一条静态的小蛇 if (fx.equals("R")){ Data.right.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("L")){ Data.left.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("U")){ Data.up.paintIcon(this,g,snakeX[0],snakeY[0]); }else if (fx.equals("D")){ Data.down.paintIcon(this,g,snakeX[0],snakeY[0]); for (int i = 1;i length;i++){ //蛇的身体长度通过该length控制 Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); //画食物 Data.food.paintIcon(this,g,foodx,foody); g.setColor(Color.white); g.setFont(new Font("微软雅黑",Font.BOLD,18)); g.drawString("长度 " + length,750,35); g.drawString("分数 " + score,750,50); //游戏提示: 是否开始 if(isStart==false){ //画一个文字,String //设置画笔的颜色 g.setColor(Color.WHITE); //设置字体 g.setFont(new Font("微软雅黑",Font.BOLD,40)); g.drawString("按下空格开始游戏!",300,300); //失败判断 if (isFail){ g.setColor(Color.RED); g.setFont(new Font("微软雅黑",Font.BOLD,40)); g.drawString("失败, 按下空格重新开始",200,300); //接收键盘的输入:监听 @Override public void keyPressed(KeyEvent e) { //键盘按下,未释放 //获取按下的键是哪个键 int keyCode = e.getKeyCode(); //如果是空格 if (keyCode==KeyEvent.VK_SPACE){ //如果游戏失败,从头再来! if (isFail){ isFail = false; init(); //重新初始化 }else { //否则,暂停游戏 isStart = !isStart; repaint(); //键盘控制走向 if (keyCode == KeyEvent.VK_LEFT) { fx = "L"; } else if (keyCode == KeyEvent.VK_RIGHT) { fx = "R"; } else if (keyCode == KeyEvent.VK_UP) { fx = "U"; } else if (keyCode == KeyEvent.VK_DOWN) { fx = "D"; //定时器,监听时间,帧:执行定时操作 @Override public void actionPerformed(ActionEvent e) { //如果游戏处于开始状态,并且没有结束,则小蛇可以移动 if (isStart isFail==false){ //右移:即让后一个移到前一个的位置即可 //除了脑袋都往前移:身体移动 for (int i = length-1; i i--) { //即第i节(后一节)的位置变为(i-1:前一节)节的位置! snakeX[i] = snakeX[i-1]; snakeY[i] = snakeY[i-1]; //通过方向控制,头部移动 if (fx.equals("R")){ snakeX[0] = snakeX[0]+25; if (snakeX[0] 850) snakeX[0] = 25; }else if (fx.equals("L")){ snakeX[0] = snakeX[0]-25; if (snakeX[0] 25) snakeX[0] = 850; }else if (fx.equals("U")){ snakeY[0] = snakeY[0]-25; if (snakeY[0] 75) snakeY[0] = 650; }else if (fx.equals("D")){ snakeY[0] = snakeY[0]+25; if (snakeY[0] 650) snakeY[0] = 75; //吃食物:当蛇的头和食物一样时,算吃到食物! if (snakeX[0]==foodx snakeY[0]==foody){ //1.长度加一 length++; //每吃一个食物,增加积分 score = score + 10; //2.重新生成食物 foodx = 25 + 25* random.nextInt(34); foody = 75 + 25* random.nextInt(24); //结束判断,头和身体撞到了 for (int i = 1; i length; i++) { //如果头和身体碰撞,那就说明游戏失败 if (snakeX[i]==snakeX[0] snakeY[i]==snakeY[0] ){ isFail = true; repaint(); //需要不断的更新页面实现动画 timer.start();//让时间动起来! @Override public void keyTyped(KeyEvent e) { //键盘按下,弹起:敲击 @Override public void keyReleased(KeyEvent e) { //释放某个键3. Data:导入游戏素材数据
package com.xdr630.snake; //存放外部数据 import javax.swing.*; import java.net.URI; import java.net.URL; * @author xdr630 * @version 1.0 * @date 2021/2/23 10:14 public class Data { // 头部的图片 URL:定位图片地址 ImageIcon:图片 public static URL headerURL = Data.class.getResource("/static/header.png"); public static ImageIcon header = new ImageIcon(headerURL); // 头部 public static URL upURL = Data.class.getResource("/static/up.png"); public static URL downURL = Data.class.getResource("/static/down.png"); public static URL leftURL = Data.class.getResource("/static/left.png"); public static URL rightURL = Data.class.getResource("/static/right.png"); public static ImageIcon up = new ImageIcon(upURL); public static ImageIcon down = new ImageIcon(downURL); public static ImageIcon left = new ImageIcon(leftURL); public static ImageIcon right = new ImageIcon(rightURL); //身体 public static URL bodyURL = Data.class.getResource("/static/body.png"); public static ImageIcon body = new ImageIcon(bodyURL); //食物 public static URL foodURL = Data.class.getResource("/static/body.png"); public static ImageIcon food = new ImageIcon(foodURL);4. 图片素材body.pngdown.pngfood.pngheader.pngleft.pngright.pngup.png5. 实现效果完成后也可打成 jar 包,使用终端执行 java -jar xxx.jar 运行,效果和idea运行效果一样,方便移动。
托管服务器故障分析 在互联网快速发展的时代,很多企业通过互联网挖掘到人生的第...
本文转载自微信公众号数世咨询(dwconcn)。 在过去的软件开发流程中,安全总是...
近日,有网友反映某电商平台存在杀熟现象,很多老用户甚至是会员用户购买同款商...
毫无疑问,数据科学是21世纪最吸引人的职业道路,由具有强烈求知欲和技术专长的...
TIOBE 公布了 2021 年 2 月的编程语言排行榜。 有人说,IT 行业在不断变化,每天...
虚拟主机 如何买便宜?决定虚拟主机价格的因素包括 网页空间 、流量以及数据库,...
域名 怎么注册多少钱?查看域名的注册费用,可以直接去 域名注册 服商的注册页面...
【51CTO.com快译】随着全球的企业持续将日常业务转换为数字化运营的方式,许多公...
来源 | 阿里巴巴云原生公众号 ? 2021 年 5 月 26 日,由阿里云计算有限公司、中...
作者 修治 背景 微服务在最近几年大行其道 很多公司的研发人员都在考虑微服务架...