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类实例化对象,并调用空参构造。