关于css:GUI编程贪吃蛇小游戏开发

2次阅读

共计 6500 个字符,预计需要花费 17 分钟才能阅读完成。

①初识实践
帧:工夫片足够小 =》就是动画,1 秒 30 帧。连起来是动画,拆开就是动态的图片!
键盘监听
定时器 Timer

②游戏开发思路

(定义数据,画上面板,监听事件(键盘 / 事件))

1、首先一个游戏主启动类 StartGame 类,外面放一个 JFrame 窗口及其大小地位设置,敞开设置,这里设置窗口大小不可变,以防拉伸导致游戏图标变形,相干的具体操作都在相应类中进行!

2、失常的游戏界面应在面板上!因而定义一个 GamePanel 类进行操作,首先是重写了 painComponent(Graphics p)办法,游戏中的所有货色都是用这支画笔来画!首先是绘制动态的面板,设置面板色彩为红色。

3、接着把游戏图片素材放入 static 字典中,放入游戏开发包下,定义一个 Data 类,在其中获取寄存游戏图片的地址,并把它们变为图标,接着在花瓣上画上头部广告栏、矩形(默认彩色)的游戏界面。

4、绘制动态的的小蛇,在 GamePanel 类中定义小蛇的数据结构!

int length; => 蛇的长度

int[] snakeX=new int[600]; => 蛇的地位的 x 坐标 25*25

int[] snakeY=new int[500]; => 蛇的地位的 y 坐标 25*25

String fx; => 初始方向

而后写初始化办法 init()办法初始化动态小蛇的长度、地位及其初始方向,再在结构器中调用 init()办法,接着把小蛇画入面板中!(要判断头的方向!),身材用 for 循环画。

5、游戏以后状态 inStart:开始 / 进行,空格键管制!初始设为进行 false,判断状态后将提醒文字画上面板!

6、空格键管制游戏开始与进行!设置键盘监听!间接在 GamePanel 类中实现 KeyListener 接口!按下空格键–> 状态取反,重画 repaint(),再 init()函数中设置焦点事件和增加键盘监听。

7、小蛇动起来,Timer 定时器!在 GamePanel 类中实现 ActionListener 接口即可。游戏一开始就启动定时器!接着写出小蛇挪动的地位坐标解决,上下左右挪动,头部、身材坐标如何变动,最初 repaint()重画页面。这样子小蛇能够本人动了。但咱们须要通过键盘监听上下左右键来管制小蛇的挪动!身材挪动是一样的,咱们只须要判断挪动方向,把头的地位坐标找好就行!

8、小蛇吃食物长大啦~,定义食物的坐标并在 init()中初始化

int foodX;

int foodY;

Random random=new Random();

吃食物即是头部坐标和食物坐标重合,小蛇长度 +1,再次生成随机的食物,吃完食物再画身材!

9、定义失败状态,默认是不失败,如果失败面板上须要呈现文字提醒,在面板上画即可。空格键可能是开始 / 进行游戏,也可能是失败后从新开始游戏,所以按下空格键得依据游戏失败装药 isFail 判断时开始 / 进行、还是从新初始开始游戏!如果游戏开始状态且没有失败,那么须要在走向前面加上失败断定:头部坐标和本人身材的任一坐标重合即为游戏失败,isfail=true! 此时会呈现游戏失败提醒,按下空格键是从新初始化开始游戏,而不是一般的暂停开始。

10、积分,定义数据,画上画板,监听:吃到食物分数 +10

11、实现代码:

package com.xiao.lesson07_game;import javax.swing.*;// 游戏的主启动类
public class StartGame {

public static void main(String[] args) {JFrame frame = new JFrame("贪吃蛇");

    // 失常游戏界面应在面板上
    frame.add(new GamePanel());
    
    frame.setBounds(10,10,900,720);
    frame.setResizable(false);// 大小不可变
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setVisible(true);
}}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.

package com.xiao.lesson07_game;import javax.swing.*;import java.net.URL;// 数据中心
public class Data {

// 相对路径“tx.jpg
// 绝对路径:/  相当于以后的我的项目
// 头 + 身材 + 食物
public static URL headerURL=Data.class.getResource("statics/header.png");
public static ImageIcon header=new ImageIcon(headerURL);
public static URL bodyURL=Data.class.getResource("statics/body.png");
public static ImageIcon body=new ImageIcon(bodyURL);
public static URL foodURL=Data.class.getResource("statics/food.png");
public static ImageIcon food=new ImageIcon(foodURL);

// 上下左右
public static URL upURL=Data.class.getResource("statics/up.png");
public static URL downURL=Data.class.getResource("statics/down.png");
public static URL leftURL=Data.class.getResource("statics/left.png");
public static URL rightURL=Data.class.getResource("statics/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);}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.

package com.xiao.lesson07_game;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;// 游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {

// 定义小蛇的数据结构
int length;  // 长度
int[] snakeX=new int[600]; // x 坐标 25*25
int[] snakeY=new int[500]; // y 坐标 25*25
String fx; // 初始方向

// 食物的坐标(随机!)int foodX;  // 失常食物
int foodY;
Random random=new Random();// 随机

int score;  // 问题

boolean isStart=false;// 游戏以后状态:开始 / 进行,默认进行

boolean isFail=false;  // 游戏失败状态

// 定时器,以毫秒为单位
Timer timer=new Timer(100,this); //100ms 执行一次

// 结构器
public GamePanel() {init();
    // 取得焦点和键盘监听
    this.setFocusable(true);  // 取得焦点事件
    this.addKeyListener(this);  // 取得键盘监听器
    timer.start();// 游戏一开始定时器就启动

    // 食物坐标得在游戏界面,小蛇能力吃到!foodX=25+25*random.nextInt(34);
    foodY=75+25*random.nextInt(24);

    score=0;
}

// 小蛇初始化办法
public void init(){
    length=3;
    snakeX[0]=100;  snakeY[0]=100;  // 脑袋坐标
    snakeX[1]=75;  snakeY[1]=100;  // 第一个身材坐标
    snakeX[2]=50;  snakeY[2]=100;  // 第二个身材坐标        fx="R";  // 初始方向向右    }

// 绘制面板,游戏中的所有货色,都是用这支画笔来画!@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);  // 画矩形 =》游戏界面

    // 画积分
    g.setColor(Color.WHITE);
    g.setFont(new Font("微软雅黑",Font.BOLD,18));
    g.drawString("长度:"+length,775,30);
    g.drawString("分数:"+score,775,50);
    // 画食物
    Data.food.paintIcon(this,g,foodX,foodY);
    // 把小蛇画下来, 得判断初始方向!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++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);// 身材        }

    // 游戏状态
    if(isStart==false){g.setColor(Color.WHITE);// 设置画笔色彩
        g.setFont(new Font("微软雅黑",Font.BOLD,40));// 设置字体
        g.drawString("按下空格键开始游戏!",250,380);  // 写游戏提醒        }

    if(isFail){g.setColor(Color.WHITE);// 设置画笔色彩
        g.setFont(new Font("微软雅黑",Font.BOLD,40));// 设置字体
        g.drawString("Score:"+score,230,330);
        score=0;
        g.setColor(Color.RED);// 设置画笔色彩
        g.drawString("失败,按下空格键从新开始!",230,380);  // 写游戏提醒        }
}

// 键盘监听事件:键盘按压,管制游戏开始、进行
@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_UP){fx="U";}else if(keyCode==KeyEvent.VK_DOWN){fx="D";}else if(keyCode==KeyEvent.VK_LEFT){fx="L";}else if(keyCode==KeyEvent.VK_RIGHT){fx="R";}
}
@Override
public void keyReleased(KeyEvent e) { }
@Override
public void keyTyped(KeyEvent e) { }


// 事件监听 -- 须要通过固定事件来刷新,1s=10 次,Timer
@Override
public void actionPerformed(ActionEvent e) {
    // 如果游戏是开始状态,就让小蛇动起来
    if(isStart && isFail==false) {// 吃食物,坐标重合            if((snakeX[0]==foodX && snakeY[0]==foodY)){
            length++;  // 小蛇长长了!score+=10;
            // 食物再次随机生成!foodX = 25 + 25 * random.nextInt(34);
            foodY = 75 + 25 * random.nextInt(24);
            }

        // 身材挪动不必变!都一样的            for (int i = length - 1; i > 0; i--) {
            // 向前挪动一节, 后一节变为前一节的地位
            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;
            }
        }
        // 失败断定:撞到本人            for (int i = 1; i < length; i++) {if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){isFail=true;}
        }
        repaint();// 重画页面}
    timer.start();

13、打包公布

点击 Project Structure–>Artifaxts–>”+“号–> 抉择 JAR–>from modules with dependencies,抉择 main 办法函数,例如在 www.cungun.com 能够启动类,apply 即可。

抉择 build–>build Artifacts–>build,期待即可在我的项目的 out 目录下看到 artifacts 目录,外面就是生成的 jar 包,能够发给敌人玩了

命令行关上:java -jar gui-study.jar,即可开始贪吃蛇游戏!

14、优化(未实现!)

level:越到前面速度越快!依据 level 设定定时器 delay

撞墙断定

小蛇不能回头

食物模式,分数或长度增长不一样

界面优化

游戏联机(网络编程)

正文完
 0