消除区域的实现
学习于bilibili 尚学堂官方
1. 在model里创建类
在model中创建EliminateBox类
package com.zy.model;
/*
消除区域
*/
import java.util.ArrayList;
import java.util.List;
public class EliminateBox {
//存放点击牌的数据
private static List<Brand> slot = new ArrayList<>();
//消除牌的方法
public void addSlot(Brand brand){
slot.add(brand);
paint();
}
//将点击的牌绘制到消除框
void paint(){
for (int i = 0; i < slot.size(); i++) {
Brand brand = slot.get(i);
int x = i * brand.getWidth() + 10;
brand.setBounds(x,600,50,50);
}
}
}
Brand注释代码
//brand.getParent().remove(brand);//通过父容器删掉自己 一般树形结构使用此方式
在Brand中new一下消除区域类
EliminateBox eliminateBox = new EliminateBox();
在点击事件里调用消除牌的方法
//此时只是在页面ui树中删除了对象,Cell的state和Brand没有删除
//brand.getParent().remove(brand);//通过父容器删掉自己 一般树形结构使用此方式
eliminateBox.addSlot(brand);
//解决 既要删除UI的图片 也要删除数据模型的数据和对应状态
cell.setState(0);
cell.setBrand(null);
2. 消除区域牌的排序
在EliminateBox中
public void addSlot(Brand brand){
slot.add(brand);
//牌的排序 根据牌的名称
slot.sort(Comparator.comparing(Brand::getName));
paint();
}
3. 牌的消除方法
在EliminateBox中
public void addSlot(Brand brand){
slot.add(brand);
//牌的排序 根据牌的名称
slot.sort(Comparator.comparing(Brand::getName));
//获取牌名称
Map<String, List<Brand>> map = slot.stream().collect(Collectors.groupingBy(Brand::getName));
Set<String> key = map.keySet();
for (String s : key) {
List<Brand> brands = map.get(s);
if (brands.size() == 3){
break;
}
}
paint();
}
使用迭代器清空集合
创建方法
/*
迭代器清空集合
*/
void deleteByBrandName(String name){
//获取迭代器
Iterator<Brand> iterator = slot.iterator();
while (iterator.hasNext()){
//获取下一个元素
Brand next = iterator.next();
//判断
if (next.getName().equals(name)){
next.getParent().remove(next);
iterator.remove();
}
}
}
调用方法
if (brands.size() == 3){
deleteByBrandName(s);
break;
}
4. 游戏失败
写方法
void over(Brand brand){
if (slot.size() >= 7){
JOptionPane.showMessageDialog(brand,"游戏结束");
System.exit(0);
}
}
调用
paint();
over(brand);