本人也是个初学者,有什么不对的地方,请大佬指点!!!
一、涉及到的知识点如下:
- 循环,分支
- 方法的抽取
- 数组的使用
- 面向对象
- 继承,子类方法的重写
- 接口,接口的实现
二、游戏图形化界面编程----》GUI图形化界面编程
注意:GUI 已经被很少使用 主要是理解监听思维 帮助刚学java的同学提升兴趣。
GUI的组件:
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 交互的时间:监听事件(鼠标事件,键盘事件)
里面的代码 随着学习 随着使用 不必再去细扣每个代码是什么意思。
准备工作

新建俩个文件夹
- com.msb.game 我用来存放代码
- images 用来存放图片
图片我会放在最后,有需要的小伙伴自行下载,下载不下来开启网页审查元素下载。
新建java文件

代码如下:
package com.msb.game;import javax.swing.*;
import java.awt.*;
public class StartGame {public static void main(String[] args) {//创建一个窗体:JFrame jf = new JFrame();//给窗体设置一个标题:jf.setTitle("贪吃蛇 v0.1版本 by:十一");//获取屏幕宽高int height = Toolkit.getDefaultToolkit().getScreenSize().height;int wight = Toolkit.getDefaultToolkit().getScreenSize().width;//设置窗体弹出的坐标,对应的窗体的宽高:jf.setBounds(((wight-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);}
}
注意下面代码
(“/images/body.png”); 必须为你存放图片的地址
package com.msb.game;import javax.swing.*;
import java.net.URL;//专门获取游戏中所涉及的图片/**必须将图片封装成一个对象,才能操作对象 来使用图片* */
public class Images {//将图片的路径封装成一个对象public static URL bodyURL = Images.class.getResource("/images/body.png");//将图片封装成为程序中的一个对象:public static ImageIcon bodyImg = new ImageIcon(bodyURL);public static URL downURL = Images.class.getResource("/images/down.png");public static ImageIcon downImg = new ImageIcon(downURL);public static URL foodURL = Images.class.getResource("/images/food.png");public static ImageIcon foodImg = new ImageIcon(foodURL);public static URL leftURL = Images.class.getResource("/images/left.png");public static ImageIcon leftImg = new ImageIcon(leftURL);public static URL rightURL = Images.class.getResource("/images/right.png");public static ImageIcon rightImg = new ImageIcon(rightURL);public static URL upURL = Images.class.getResource("/images/up.png");public static ImageIcon upImg = new ImageIcon(upURL);public static URL headerURL = Images.class.getResource("/images/header.png");public static ImageIcon headerImg = new ImageIcon(headerURL);}
package com.msb.game;import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import javafx.scene.input.KeyCode;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;/** 继承JPanel 才具备面板功能* */
public class GamePanel extends JPanel {//定义俩个数组 一个专门存蛇的X轴坐标,一个专门存y轴坐标//蛇的长度:int length;//x轴int[] snakeX = new int[200];//yint[] snakeY = new int[200];//游戏状态 开始,暂停boolean isStart = false;//默认暂停//加入定时器Timer timer;//定义食物的坐标int foodX;int foodY;//积分int score;//判断小蛇是否死亡boolean isDie = false;//默认活着//定义蛇行走的方向:String direction;public void init() {//初始化蛇的长度:length = 3;//图片大小为25x25//初始化蛇头轴坐标:snakeX[0] = 175;snakeY[0] = 175;//初始化第一节身子坐标:snakeX[1] = 150;snakeY[1] = 175;//初始化第二节身子坐标:snakeX[2] = 125;snakeY[2] = 175;//初始化蛇头的方向:direction = "R";//食物初始的坐标foodX = 300;foodY = 200;//积分score = 0;}public 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); 32if (keyCode == KeyEvent.VK_SPACE) {//监听空格if (isDie) {init();isDie = false;} else {isStart = !isStart;}repaint();//重绘游戏} else if (keyCode == KeyEvent.VK_UP) {//上direction = "U";} else if (keyCode == KeyEvent.VK_DOWN) {//下direction = "D";} else if (keyCode == KeyEvent.VK_LEFT) {//左direction = "L";} else if (keyCode == KeyEvent.VK_RIGHT) {//右direction = "R";}}});//对定时器进行初始化操作timer = new Timer(100, new ActionListener() {/*ActionListener 是事件监听相当于每100ms监听一下你是否发生了一个动作将具体的动作放入actionPerformed*/@Overridepublic void actionPerformed(ActionEvent e) {//后一节走向前一节if (isStart && isDie == false) {////身子for (int i = length - 1; i > 0; i--) {snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}if ("R".equals(direction)) {snakeX[0] += 25;} else if ("U".equals(direction)) {snakeY[0] -= 25;} else if ("D".equals(direction)) {snakeY[0] += 25;} else if ("L".equals(direction)) {snakeX[0] -= 25;}//防止蛇超出边界:if (snakeX[0] > 750) {snakeX[0] = 25;} else if (snakeY[0] < 100) {snakeY[0] = 725;} else if (snakeX[0] < 25) {snakeX[0] = 750;} else if (snakeY[0] > 725) {snakeY[0] = 100;}//检测碰撞的动作:if (snakeX[0] == foodX && snakeY[0] == foodY) {//长度加+length++;//随机生存坐标foodX = ((int) (Math.random() * 30) + 1) * 25;//[25,750]foodY = (new Random().nextInt(26) + 4) * 25;//[100,750]score += 10;}//死亡判断for (int i = 1; i < length; i++) {if (snakeX[i] == snakeX[0] && snakeY[i] == snakeY[0]) {isDie = true;}}repaint();}}});//定时器必须要启动timer.start();}/** paintComponent这个方法比较特殊,这个方法属于图形版的main方法* 自动调用** */@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//自动填充背景颜色this.setBackground(new Color(200, 246, 243));//画头部图片//paintIcon 四个参数:this 指的是当前面板 g:知道是画笔 x,y 指的是对应坐标
// Images.headerImg.paintIcon(this, g, 1, 2);//调画笔颜色g.setColor(new Color(0xE3FFF6));//画一个矩形g.fillRect(10, 70, 760, 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.upImg.paintIcon(this, g, snakeX[0], snakeY[0]);} else if ("D".equals(direction)) {Images.downImg.paintIcon(this, g, snakeX[0], snakeY[0]);}
// Images.rightImg.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 < length; i++) {Images.bodyImg.paintIcon(this, g, snakeX[i], snakeY[i]);}//游戏提示语if (isStart == false) {//画一个文字g.setColor(new Color(0xFF7373));//字体 字号 大小g.setFont(new Font("微软雅黑", Font.BOLD, 40));//文字内容 出现的位置g.drawString("点击空格开始/暂停游戏", 200, 330);}Images.foodImg.paintIcon(this, g, foodX, foodY);g.setColor(new Color(255, 76, 76));g.setFont(new Font("微软雅黑", Font.BOLD, 40));g.drawString("积分" + ":" + score, 600, 40);if (isDie) {g.setColor(new Color(255, 76, 76));g.setFont(new Font("微软雅黑", Font.BOLD, 40));g.drawString("小蛇死亡,按空格重新开始", 200, 330);}}
}
所需要的图片如下:






下载不下来开启网页审查元素下载。


















