【2023.6.20练习】Java:Tertris游戏窗口的实现

该文章详细介绍了如何使用Java编程语言实现Tertris游戏的过程,从打开窗口、初始化游戏界面到设计游戏面板和说明面板。作者通过设置窗口大小、创建文本域数组和二维数据数组来构建游戏的基础框架,并添加键盘监听事件以实现基本的交互功能。
摘要由CSDN通过智能技术生成

Tertris是一款在1984年,计算机中心工作的数学家帕基特诺夫利用空闲时间通过C语言编出的游戏程序。本文主要参考了网络上的各大现有简单游戏编程教程,利用java实现该游戏。本文主要用于保存自己的代码学习记录,提升自身对于游戏编程的认知,了解到这款游戏是如何被一步步构造出来的。

①打开窗口

代码示例:

import javax.swing.*;

public class Tertris extends JFrame {
    public void initWindow() {
        //设置窗口大小
        this.setSize(600, 850);
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口居中
        this.setLocationRelativeTo(null);
        //设置释放窗体(单击窗口的关闭按钮时自动退出)
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口大小不可变
        this.setResizable(false);
        //设置窗口标题
        this.setTitle("Tertris");
    }

    public Tertris() {//空参构造
        initWindow();
    }

    public static void main(String[] args) {//主函数
        Tertris tertris = new Tertris();
    }
}

以上代码可以实现最基础的打开一个带标题窗口。


②初始化游戏界面

接下来先定义了游戏尺寸(即俄罗斯方块的行数与列数)以及文本域数组和代表方块是否填满的二维数组

public class Tertris extends JFrame {
    //定义常量:
    private static final int map_x = 21;//俄罗斯方块的行数为21
    private static final int map_y = 12;//游戏列数为12
    //文本域数组
    JTextArea[][] text;

    //每个格子值的数组(二维),1代表有方块,0代表无方块
    int [][] data;

再在空参构造区域初始化:

    public Tertris() {//空参构造,打开窗口
        text = new JTextArea[map_x][map_y];
        data = new int[map_x][map_y];
        initWindow();
    }

然后设计好面板结构:

   //初始化游戏面板
    public void initGamePanel() {
        JPanel game_main = new JPanel();
        //游戏界面布局
        game_main.setLayout(new GridLayout(map_x, map_y, 1, 1));//水平间距与数值间距都设置为1
        //初始化面板:双重for循环用于遍历游戏界面
        for (int i = 0; i < text.length; i++) {
            for (int j = 0; j < text[i].length; j++) {

                //设置文本域的行列数
                text[i][j] = new JTextArea(map_x,map_y);
                //设置文本域背景颜色
                text[i][j].setBackground(Color.darkGray);
                //添加键盘监听事件(需要JFrame类实现KeyListener接口)
                text[i][j].addKeyListener(this);
                //初始化游戏边界(先用if语句探寻边界)
                if (j == 0 || j == text[i].length - 1 || i = text.length - 1) {

                    text[i][j].setBackground(Color.lightGray);
                    data[i][j] = 1;//(表示边界处默认有方块不可通过)
                }
                //设置文本区域不可编辑
                text[i][j].setEditable(false);
                //文本区域添加到主面板上
                game_main.add(text[i][j]);
            }

        }

        //将主面板添加到窗口当中
        this.setLayout(new BorderLayout());
        this.add(game_main,BorderLayout.CENTER);
    }

最后回到空参构造,调用设计好的方法:

    public Tertris() {//空参构造,打开窗口
        text = new JTextArea[map_x][map_y];
        data = new int[map_x][map_y];
        initGamePanel();
        initWindow();
    }

③初始化游戏说明面板

依然是构造新的方法,在类中设置相关的成员变量,在空参构造中调用方法。

    //初始化游戏说明面板
    public void initExplainPanel(){
        //创建左说明面板/右说明面板
        JPanel explain_l = new JPanel();
        JPanel explain_r = new JPanel();
        //利用Setlayout方法初始化格式布局
        explain_l.setLayout(new GridLayout(4,1));
        explain_r.setLayout(new GridLayout(2,1));
        //初始化左说明面板,添加说明文字
        explain_l.add(new JLabel("游戏规则:"));
        explain_l.add(new JLabel("Space-变型"));
        explain_l.add(new JLabel("Left-左移"));
        explain_l.add(new JLabel("Right-右移"));
        explain_l.add(new JLabel("Down-下落"));
        //设置标签的内容为红色字体
        label1.setForeground(Color.red);
        //把游戏状态的标签转到右说明面板中
        explain_r.add(label2);
        explain_r.add(label1);
        //左说明面板添加到窗口的左侧
        this.add(explain_l,BorderLayout.WEST);
        //右说明面板添加到窗口的右侧
        this.add(explain_r,BorderLayout.EAST);
    }

最终代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Tertris extends JFrame implements KeyListener {
    /****************************基础变量****************************/

    //定义常量:
    private static final int map_x = 21;//俄罗斯方块的行数为21
    private static final int map_y = 12;//游戏列数为12


    //文本域数组
    JTextArea[][] text;

    //每个格子值的数组(二维),1代表有方块,0代表无方块
    int[][] data;

    //显示游戏状态的标签”1“与显示游戏分数的标签”2“
    JLabel label1;
    JLabel label2;
    //创建布尔变量用于判断游戏是否结束
    boolean isrunning;


    /****************************初始化窗口****************************/

    public void initWindow() {
        //设置窗口大小
        this.setSize(600, 650);
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口居中
        this.setLocationRelativeTo(null);
        //设置释放窗体(单击窗口的关闭按钮时自动退出)
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口大小不可变
        this.setResizable(false);
        //设置窗口标题
        this.setTitle("Tertris");
    }
    /****************************初始化游戏面板****************************/

    //初始化游戏面板
    public void initGamePanel() {
        JPanel game_main = new JPanel();
        //游戏界面布局
        game_main.setLayout(new GridLayout(map_x, map_y, 1, 1));//水平间距与数值间距都设置为1
        //初始化面板:双重for循环用于遍历游戏界面
        for (int i = 0; i < text.length; i++) {
            for (int j = 0; j < text[i].length; j++) {

                //设置文本域的行列数
                text[i][j] = new JTextArea(map_x, map_y);
                //设置文本域背景颜色
                text[i][j].setBackground(Color.darkGray);
                //添加键盘监听事件(需要JFrame类实现KeyListener接口)
                text[i][j].addKeyListener(this);
                //初始化游戏边界(先用if语句探寻边界)
                if (j == 0 || j == text[i].length - 1 || i == text.length - 1) {

                    text[i][j].setBackground(Color.lightGray);
                    data[i][j] = 1;//(表示边界处默认有方块不可通过)
                }
                //设置文本区域不可编辑
                text[i][j].setEditable(false);
                //文本区域添加到主面板上
                game_main.add(text[i][j]);
            }

        }

        //将主面板添加到窗口当中
        this.setLayout(new BorderLayout());
        this.add(game_main, BorderLayout.CENTER);
    }
    /****************************初始化说明****************************/

    //初始化游戏说明面板
    public void initExplainPanel() {
        //创建左说明面板/右说明面板
        JPanel explain_l = new JPanel();
        JPanel explain_r = new JPanel();
        //利用Setlayout方法初始化格式布局
        explain_l.setLayout(new GridLayout(4, 1));
        explain_r.setLayout(new GridLayout(2, 1));
        //初始化左说明面板,添加说明文字
        explain_l.add(new JLabel("游戏规则:"));
        explain_l.add(new JLabel("Space-变型"));
        explain_l.add(new JLabel("Left-左移"));
        explain_l.add(new JLabel("Right-右移"));
        explain_l.add(new JLabel("Down-下落"));
        //设置标签的内容为红色字体
        label1.setForeground(Color.red);
        //把游戏状态的标签转到右说明面板中
        explain_r.add(label2);
        explain_r.add(label1);
        //左说明面板添加到窗口的左侧
        this.add(explain_l, BorderLayout.WEST);
        //右说明面板添加到窗口的右侧
        this.add(explain_r, BorderLayout.EAST);
    }
    /****************************启动游戏****************************/

    public Tertris() {//空参构造,打开窗口
        text = new JTextArea[map_x][map_y];
        data = new int[map_x][map_y];
        //初始化表示游戏状态的标签
        label1 = new JLabel("状态:正在游戏中");
        label2 = new JLabel("目前分数为:0");

        initGamePanel();
        initExplainPanel();
        initWindow();
        //初始化开始游戏的标志
        isrunning = true;
    }

    public static void main(String[] args) {//主函数,调用游戏启动
        Tertris tertris = new Tertris();
    }

    //开始游戏方法
    public void game_begin(){
        while (true){
            //用于判断游戏是否结束
            if(!isrunning){
                break;
            }

            //进行游戏(以后会写的方法
            //game_run();
        }
        //在标签位置显示”游戏结束“
        label1.setText("状态:游戏已结束");
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

总结:包括基础的窗口创建,窗口尺寸调整以及游戏面板、文本面板的构造。游戏的启动通过main类实例化对象,并调用空参构造。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值