相信大家都玩过俄罗斯方块,这里就不介绍规则了。 使用的主要框架是Swing。
Java俄罗斯方块目录:
Java俄罗斯方块---(一)游戏场景Java俄罗斯方块---(二)游戏操作与逻辑Java编写俄罗斯方块(完整版)
将使用以下材料:
1.小方块
2.游戏背景图
3.
———————————————————— 我是分割线—————————————————————
好了,废话不多说,我们直接进入主题:
直接上图:
上图展示了俄罗斯方块中的七个经典方块。 每个立方体由4个小立方体组成,并为立方体的变形专门标记了序列号。
抽象出对应的数据类型
首先,创建一个Cell类来表示一个小方块,Cell类的主要成员就是这些。
row,表示小方块的行号。 col
,表示小方块的列号。 image,代表小方块的图片,就是之前素材中的那个。 left()、right()、drop()分别表示一个小方块向左移动一格、向右移动一格、下降一格。public class Cell {
private int row;
private int col;
private BufferedImage image;
public Cell() {}
public Cell(int row, int col, BufferedImage image) {
this.row = row;
this.col = col;
this.image = image;
}
/*向左移动*/
public void left() {
col--;
}
/*向右移动*/
public void right() {
col++;
}
/*向下移动*/
public void drop() {
row++;
}
}
接下来,按照国际惯例(标准),我们完成这个类,创建全参数和无参数的构造函数,属性的get/set方法,重写方法。
public class Cell {
private int row;
private int col;
private BufferedImage image;
@Override
public String toString() {
return "(" + row + ", " + col + ")";
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
public Cell() {}
public Cell(int row, int col, BufferedImage image) {
this.row = row;
this.col = col;
this.image = image;
}
/*向左移动*/
public void left() {
col--;
}
/*向右移动*/
public void right() {
col++;
}
/*向下移动*/
public void drop() {
row++;
}
}
如前所述,俄罗斯方块中有七种经典形状,它们有一些共同的特征:
全部由4个小方块组成。 可以左移、右移、下落。 变形,因为变形比较麻烦,所以不会写在父类中,变形的方法后面会介绍。
所以现在我们创建一个类作为7个经典形状的父类并提供相应的成员。
元胞数组,用于创建 4 个小方块。 ()、()、()分别用于四块盒子的左移、右移、软落。 软掉落是指一个四块盒子掉落,以后再写一个硬掉落,让四块盒子瞬间掉落。
public class Tetromino {
protected Cell[] cells=new Cell[4];
/*四格方块向左移动*/
public void moveLeft() {
for(Cell c:cells)
c.left();
}
/*四格方块向右移动*/
public void moveRight() {
for(Cell c:cells)
c.right();
}
/*四格方块向下移动*/
public void softDrop() {
for(Cell c:cells)
c.drop();
}
@Override
public String toString() {
return "[" + Arrays.toString(cells) + "]";
}
}
接下来创建7种不同的形状,根据形状的大致形状,为了方便,这里用I、J、L、O、S、T、Z来表示。
形状必须继承类。 这7个形状类的作用就是初始化形状的位置。 在初始化位置之前,先提一下游戏资源,即背景、图片等,为了加载的效率,一般都会创建为静态成员。 所以这里我们使用创建静态图片并使用静态代码块调用流来读取图片。 先在主类中创建一下用小方块拼图案y图,方便以后调用。 因此,在初始化形状之前,创建一个主类,class,因为我这次主要使用这个框架来完成制作,所以需要通过重写的方式继承并完成游戏的制作。
类,首先初始化游戏资源,主要是使用和流,因为IO流有检查异常,所以这里需要使用try循环IO流,使用catch捕获异常。
public class Tetris extends JPanel{
//载入方块图片
public static BufferedImage T;
public static BufferedImage I;
public static BufferedImage O;
public static BufferedImage J;
public static BufferedImage L;
public static BufferedImage S;
public static BufferedImage Z;
public static BufferedImage background;
public static BufferedImage gameover;
static {
try {
/*
* getResource(String url)
* url:加载图片的路径
* 相对位置是同包下
*/
T = ImageIO.read(Tetris.class.getResource("T.png"));
I = ImageIO.read(Tetris.class.getResource("I.png"));
O = ImageIO.read(Tetris.class.getResource("O.png"));
J = ImageIO.read(Tetris.class.getResource("J.png"));
L = ImageIO.read(Tetris.class.getResource("L.png"));
S = ImageIO.read(Tetris.class.getResource("S.png"));
Z = ImageIO.read(Tetris.class.getResource("Z.png"));
background = ImageIO.read(Tetris.class.getResource("tetris.png"));
gameover = ImageIO.read(Tetris.class.getResource("game-over.png"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
接下来,使用相应的形状类初始化形状。
public class I extends Tetromino{
/*
* 提供构造器进行初始化
* I型的四格方块的位置
*/
public I() {
cells[0]=new Cell(0,4,Tetris.I);
cells[1]=new Cell(0,3,Tetris.I);
cells[2]=new Cell(0,5,Tetris.I);
cells[3]=new Cell(0,6,Tetris.I);
}
}
其余的形状也类似,只需要根据之前的形状坐标进行修改即可,图片是随机的,创建完形状后,需要生成一个四块的正方形,所以回到类中,在为了方便以后调用,写了一个随机生成方法的块。
总共有7种形状,这里用(int)Math.()*7来表示7种不同的形状,因为形状都是继承自父类的,这里直接向上变换就可以了。
/*随机生成一个四格方块*/
public static Tetromino randomOne() {
Tetromino t = null;
int num=(int)(Math.random()*7);
switch (num) {
case 0:t=new T();break;
case 1:t=new O();break;
case 2:t=new I();break;
case 3:t=new J();break;
case 4:t=new L();break;
case 5:t=new S();break;
case 6:t=new Z();break;
}
return t;
}
一切创建完毕后,回到主类。 游戏中存在以下对象,我们将它们抽象成相应的成员:
,描述下落的方块。 ,描述将要掉落的方块。 墙,游戏的主要区域。 这里需要提到的是,我们把生成块的方法放到了父类中。 为了方便调用,我们将生成区块的方法创建为静态方法。
/*属性:正在下落的四格方块*/
private Tetromino currentOne = Tetromino.randomOne();
/*属性:将要下落的四格方块*/
private Tetromino nextOne = Tetromino.randomOne();
/*属性:墙,20行 10列的 表格 宽度为26*/
private Cell[][] wall=new Cell[20][10];
接下来在 中创建一个 main 方法,并在 main 方法中创建一个游戏场景。 为了配合游戏场景,窗口尺寸为535*595。
public static void main(String[] args) {
//1:创建一个窗口对象
JFrame frame=new JFrame("玩玩俄罗斯方块");
//2:设置为可见
frame.setVisible(true);
//3:设置窗口的尺寸
frame.setSize(535, 595);
//4:设置窗口居中
frame.setLocationRelativeTo(null);
//5:设置窗口关闭,即程序中止
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
运行效果图
1.绘制游戏背景
现在,我们有了游戏窗口,接下来要做的就是绘制游戏场景,在main方法中添加以下两行代码,为了避免一些不必要的麻烦,建议添加这两行代码=new("玩俄罗斯方块"); 这行代码如下。
//创建游戏界面,即画板(面板)
Tetris panel = new Tetris();
//将面板嵌入窗口
frame.add(panel);
接下来我们来绘制游戏,重写paint方法(paint方法用于描述游戏的所有场景和元素),绘制游戏背景。 这里主要采用以下方法进行带框绘制。
(image, x, y, null),用于绘制图片。 (x, y, width,) 用于绘制图形。 (str, x, y) 用于绘制字符串。 以上三个方法都需要通过刷机调用,参数含义就不说了。
public void paint(Graphics g) {
//绘制背景
/*
* g:画笔
* g.drawImage(image,x,y,null)
* image:绘制的图片
* x:开始绘制的横坐标
* y:开始绘制的纵坐标
*/
g.drawImage(background, 0,0, null);
}
运行结果
我们绘制了游戏背景,然后继续绘制其他游戏元素。
1.要绘制游戏的主要区域,请编写以下方法并在paint方法中调用它。 画图之前用小方块拼图案y图,我们先来说说画图。 绘制图形时,是从上到下、从左到右绘制的:
,是一个用来描述单元格宽度的常量,在游戏中是26,不用管这个数字,只是为了匹配游戏区域(为了好看),直接在类中创建这个常量即可。 前面说过,游戏的主区域是一个20行10列的二维数组,所以这里使用双层for循环来绘制各个小方块,形成游戏的主区域。 绘图时需要判断小方格中是否有小方格,即wall[i][j]。 这是因为当正方形不能再掉落时,需要将其嵌入到墙壁中,即画一个小正方形的图,并将四个正方形的坐标分配给墙壁。
/*小方格宽度*/
private static final int CELL_SIZE=26;
public void paintWall(Graphics a) {
//外层循环控制行数
for(int i=0;i<20;i++)
{
//内层循环控制列数
for(int j=0;j<10;j++)
{
int x = j*CELL_SIZE;
int y = i*CELL_SIZE;
Cell cell=wall[i][j];
/*
* 判断所在单元格是否有方块,
* 有方块的话,获取方块的图片,绘制成图片嵌入墙中。
* 没有方块的话,绘制一个矩形作为墙的一部分。
*/
if(cell==null)//判断所在单元格是否无方块
{
a.drawRect(x, y, CELL_SIZE, CELL_SIZE);
}
else
{
a.drawImage(cell.getImage(),x,y,null);
}
}
}
}
编写完成后,运行一下看看效果。
你会发现墙的位置和预期的位置不一样。 这就是前面提到的从上到下、从左到右的绘制规则。 而且,游戏的主要区域并不是从游戏背景的左上角开始的。 ,一点偏移,现在,将这个一点偏移添加到paint方法中。
将以下代码添加到绘图中。 下面代码的作用是对坐标轴进行平移。 横坐标和纵坐标之间的偏移约为15:
//平移坐标轴
g.translate(15, 15);
然后,当我们在绘制其他游戏元素的时候,如果我们想要画一些东西用小方块拼图案y图,我们封装一个绘制方法,然后在paint方法中调用它。
2.画下落的方块
首先获取随机生成的四格正方形,将其赋值给Cell数组,遍历Cell数组,得到每个小正方形的行数和列数乘以宽度,将每个小正方形绘制为主区域的图片游戏的。
1.告诉我为什么需要乘以宽度,前面提到的绘制规则,以及创建的游戏的主要区域,即墙Wall是一个由26*26组成的20*10*正方形的大矩形方格,画落四方格就是在主区域内画四个小方格,小方格的宽度就是方格的宽度。 因此,需要将宽度乘以小正方形的坐标,最终绘制出四方形的形状。
/*绘制正在下落的四格方块
* 取出数组的元素
* 绘制元素的图片
* 横坐标x
* 纵坐标y
*/
public void paintCurrentOne(Graphics g){
Cell[] cells = currentOne.cells;
for(Cell c:cells)
{
int x = c.getCol()*CELL_SIZE;
int y = c.getRow()*CELL_SIZE;
g.drawImage(c.getImage(),x,y,null);
}
}
3. 画出下一个要落下的四块正方形
原理和绘制下落的立方体是一样的,主要是因为游戏场景位于不同的位置,需要加上偏移量。
public void paintNextOne(Graphics g) {
//获取nextOne对象的四个元素
Cell[] cells = nextOne.cells;
for(Cell c:cells) {
//获取每一个元素的行号和列号
int row = c.getRow();
int col = c.getCol();
//横坐标
int x = col*CELL_SIZE+260;
//纵坐标
int y = row*CELL_SIZE+26;
g.drawImage(c.getImage(),x,y,null);
}
}
4. 绘制游戏得分
首先,需要创建以下常量来存储游戏分数。
,游戏得分池,根据一次消除的线数不同,得分也不同,消除一根线1分,消除两线2分,消除三线5分,消除最多10分到四行。 ,当前获得的游戏分数。 ,当前消除的行数。
/*统计分数*/
int[] scores_pool = {0,1,2,5,10};
private int totalScore = 0;
private int totalLine = 0;
使用该方法绘制游戏得分:
G。 就是设置字符串的格式、字体、大小等。 G。 之前说过它是用来拉弦的。
public void paintScore(Graphics g) {
g.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 30));
g.drawString("SCORES:"+totalScore, 285, 160);
g.drawString("LINES:"+totalLine, 285, 215);
}
运行结果
5.绘制游戏状态
接下来我们来画一下游戏状态。 游戏分为三种状态,游戏中、暂停、游戏结束。 使用常量作为游戏状态,定义一个变量来存储当前的游戏状态。
/*定义三个常量:充当游戏的状态*/
public static final int PLAYING = 0;
public static final int PAUSE = 1;
public static final int GAMEOVER = 2;
/*定义一个属性,存储游戏的当前状态*/
private int game_state;
1.、用于绘制游戏当前状态,在绘制之前,创建一个字符串数组来显示游戏状态。 即游戏运行时显示按P暂停,游戏暂停时显示按C继续,游戏结束时显示按S重新开始。
String[] show_state = {"P[pause]","C[continue]","S[replay]"};
public void paintState(Graphics g) {
if(game_state == GAMEOVER) {
g.drawImage(gameover, 0, 0, null);
g.drawString(show_state[GAMEOVER], 285, 265);
}
else if (game_state == PLAYING) {
g.drawString(show_state[PLAYING], 285, 265);
}
else if (game_state == PAUSE) {
g.drawString(show_state[PAUSE], 285, 265);
}
}
运行结果
请查看后续教程《Java俄罗斯方块》---(二)游戏操作与逻辑
用小方块拼图案y图 Java俄罗斯方块---(1)游戏场景相关下载
- 查看详情 k歌伴侣PC版 v14.6 简体中文 2023-08-16
- 查看详情 易我剪辑大师 v1.6.3 简体中文 2023-08-16
- 查看详情 迅捷视频转换器电脑版 v2.7.0 简体中文 2023-08-16
用小方块拼图案y图 Java俄罗斯方块---(1)游戏场景相关文章