完善
根据源码
1. 在TestRenderMap 中修改
添加背景图片和消除区域
package com.zy.test;
/*
测试渲染一个地图类
*/
import com.zy.model.*;
import com.zy.util.LayerUtil;
import com.zy.util.MapUtil;
import javazoom.jl.decoder.JavaLayerException;
import javax.swing.*;
import java.io.FileNotFoundException;
import java.util.List;
public class TestRenderMap extends JFrame {
public static Map map = MapUtil.build(3);
private Brand bj =new Brand("背景草地");
private Brand xc = new Brand("消除区域");
public TestRenderMap() throws FileNotFoundException, JavaLayerException {
//初始化窗口
init();
//渲染图层
List<Layer> list = map.getList();
for (int i = 0; i < list.size(); i++) {
renderLayer(list.get(i));
}
map.compareAll();//游戏开始时判定置灰
xc.setBounds(0,575,450,800);
this.getContentPane().add(xc);
bj.setBounds(0,0,450,800);
this.getContentPane().add(bj);
//自动刷新
autoRefresh();
new Music().music();
}
private void renderLayer(Layer layer){
//渲染图层
//默认坐标是(0,0)
//布局方式 默认swing 添加组件 提供了多种布局方式 网格 流
Cell[][] cells = layer.getCells();
for (int row = 0; row < cells.length; row++) {
for (int col = 0; col < cells[row].length; col++) {
Brand brands1 = cells[row][col].getBrand();
int x = col * 50 + layer.getOffsetx();//0 50 100 150 ...
int y = row * 50 + layer.getOffsety();//0 50 100 ...
brands1.setBounds(x,y,50,50);
this.getContentPane().add(brands1);
}
System.out.println();
}
}
private void init(){
this.setTitle("易-java-羊了个羊");//设置弹出游戏窗口的标题
this.setSize(450,800);//设置窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭的同时也推出java进程
//设置绝对布局
this.setLayout(null);
this.setBounds(0,0,450,800);
this.setLocationRelativeTo(null);//居中
this.setVisible(true);//让窗口显示 默认隐藏
}
//线程
private void autoRefresh(){
JFrame start = this;
new Thread(new Runnable() {
@Override
public void run() {
//用来刷新
while (true){
start.repaint();//调用的还是当前窗口的repaint
try {
Thread.sleep(40);
start.setVisible(true);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
repaint();
}
}
}).start();
}
public static void main(String[] args) throws FileNotFoundException, JavaLayerException {
new TestRenderMap();
}
}
此时点击背景图片和消除区域,图片会消失
2. 修改Brand
在Brand的消除代码中修改
if (brand.getGray() || brand.getName().equals("消除区域") || brand.getName().equals("背景草地")){
//灰色
return;
}
3. 修改Start
package com.zy.view;
/*
游戏的启动入口
*/
import com.zy.model.Brand;
import com.zy.model.Map;
import com.zy.test.TestBuildMap;
import com.zy.test.TestRenderMap;
import com.zy.util.MapUtil;
import javazoom.jl.decoder.JavaLayerException;
import javax.swing.*;
import java.awt.*;
import java.io.FileNotFoundException;
//JFrame使jdk提供的类,可以绘制窗口,使用窗口的api
public class Start extends JFrame {
public Start() throws HeadlessException, FileNotFoundException, JavaLayerException {
this.setTitle("易-java-羊了个羊");//设置弹出游戏窗口的标题
this.setSize(450,800);//设置窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭的同时也推出java进程
this.setLocationRelativeTo(null);//居中
this.setVisible(true);//让窗口显示 默认隐藏
TestRenderMap testRenderMap = new TestRenderMap();
//添加组件的方法,可以添加自己定义的组件到当前的窗口当中
// Brand jd = new Brand("剪刀");
// // jd.setGray(true);
// this.getContentPane().add(jd);
// this.setVisible(true);
//启动自动刷新线程
autoRefresh();
}
//线程
private void autoRefresh(){
Start start = this;
new Thread(new Runnable() {
@Override
public void run() {
//用来刷新
while (true){
start.repaint();//调用的还是当前窗口的repaint
try {
Thread.sleep(40);
start.setVisible(true);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
}
public static void main(String[] args) throws FileNotFoundException, JavaLayerException {
new Start();
}
}
此时会产生两个窗口
修改为
package com.zy.view;
/*
游戏的启动入口
*/
import com.zy.model.Brand;
import com.zy.model.Map;
import com.zy.test.TestBuildMap;
import com.zy.test.TestRenderMap;
import com.zy.util.MapUtil;
import javazoom.jl.decoder.JavaLayerException;
import javax.swing.*;
import java.awt.*;
import java.io.FileNotFoundException;
//JFrame使jdk提供的类,可以绘制窗口,使用窗口的api
public class Start extends JFrame {
public Start() throws HeadlessException, FileNotFoundException, JavaLayerException {
// this.setTitle("易-java-羊了个羊");//设置弹出游戏窗口的标题
// this.setSize(450,800);//设置窗口大小
//
// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭的同时也推出java进程
// this.setLocationRelativeTo(null);//居中
// this.setVisible(true);//让窗口显示 默认隐藏
TestRenderMap testRenderMap = new TestRenderMap();
//添加组件的方法,可以添加自己定义的组件到当前的窗口当中
// Brand jd = new Brand("剪刀");
// // jd.setGray(true);
// this.getContentPane().add(jd);
// this.setVisible(true);
//启动自动刷新线程
autoRefresh();
}
//线程
private void autoRefresh(){
Start start = this;
new Thread(new Runnable() {
@Override
public void run() {
//用来刷新
while (true){
start.repaint();//调用的还是当前窗口的repaint
try {
Thread.sleep(40);
start.setVisible(true);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
}
public static void main(String[] args) throws FileNotFoundException, JavaLayerException {
new Start();
}
}
4. 为游戏提供通关提示
4.1 思路
用户点击后,牌的单元格状态会置0,使用方法 brandNum 获取所有图层的单元格,判断所有单元格是否为0
如果为0,返回true,表示所有图层中都无牌,则调用 win 提示用户通关
4.2 代码
在EliminateBox.java中
public static boolean brandNum(){
System.out.println("brandNum");
list = map.getList();
for (int i = 0; i < list.size(); i++) {
Layer layer = list.get(i);
Cell[][] cells = layer.getCells();
for (int row = 0; row < cells.length; row++) {
for (int col = 0; col < cells[row].length; col++) {
Cell cell = cells[row][col];
if (cell.getState() == 0){
continue;
}else {
return false;
}
}
}
}
return true;
}
public static void winner(Brand brand) {
win(brand);
}
static void win(Brand brand){
if (brandNum()){
JOptionPane.showMessageDialog(brand,"恭喜通关!!!\n点击确定退出游戏哦");
System.out.println("通关成功");
System.exit(0);
}
System.out.println("通关失败");
}
在Brand中调用
EliminateBox.winner(brand);
此时运行后台提示通关成功,暂时无法显示弹框
原因是:
JOptionPane.showMessageDialog
中第一个参数用来指定当前对话框所在的一个位置
将第一个参数改为null,使副组件显示在屏幕正中间
if (brandNum()){
System.out.println("通关成功");
JOptionPane.showMessageDialog(null,"恭喜通关!!!\n点击确定退出游戏哦");
System.exit(0);
}
此时出现弹窗,但弹窗反复弹出
原因:
之前在动态刷新的线程中加了代码start.setVisible(true);
导致反复创建
将该行代码注释,问题解决
try {
Thread.sleep(40);
//start.setVisible(true);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}