目录
一.负责内容
主体框架的编写,游戏功能的实现,部分GUI的绘制。
二.git提交记录(个人)
三.项目功能架构图
1.流程图(黄色代表所负责的块)
2.UML类图(黄色为负责块)
四.个人负责关键代码
1.游戏主要流程
void launch(){
GameUtil.START_TIME = System.currentTimeMillis();//开始时间
this.setVisible(true);//可见
if(GameUtil.state==3){
this.setSize(500,500);
}else{
this.setSize(width,height);//窗口大小
}
this.setLocationRelativeTo(null);//居中显示
this.setTitle("扫雷");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭方法
//鼠标事件
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
switch(GameUtil.state){
case 0:
//左键被点击
if(e.getButton()==1){
GameUtil.MOUSE_x = e.getX();
GameUtil.MOUSE_Y =e.getY();
GameUtil.LEFT = true;
}
//右键被点击
if(e.getButton()==3){
GameUtil.MOUSE_x = e.getX();
GameUtil.MOUSE_Y =e.getY();
GameUtil.RIGHT = true;
}
case 1:
case 2:
if(e.getButton()==1) {
if (e.getX() > GameUtil.OFFSET + GameUtil.SQUARE_LENGTH * (GameUtil.MAP_W / 2)
&& e.getX() < GameUtil.OFFSET + GameUtil.SQUARE_LENGTH * (GameUtil.MAP_W / 2) + GameUtil.SQUARE_LENGTH
&& e.getY() > GameUtil.OFFSET
&& e.getY() < GameUtil.OFFSET + GameUtil.SQUARE_LENGTH) {
mapBottom.reGame();
mapTop.reGame();
GameUtil.FLAG_NUM = 0;
GameUtil.START_TIME = System.currentTimeMillis();
GameUtil.state = 0;
}
}
//单机滚轮,切换难度
if(e.getButton()==2){
GameUtil.state=3;
begin=true;
}
break;
case 3:
if(e.getButton()==1){
GameUtil.MOUSE_x = e.getX();
GameUtil.MOUSE_Y = e.getY();
begin = gameSelect.hard();
}
break;
}
}
});
while(true){
repaint();
begin();
try {
Thread.sleep(40);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
- 简述.程序的主要流程快,利用鼠标左右键进行监听得到返回值并判断状态来开始游戏。
2.胜利与失败判断功能
boolean victory(){
//统计未打开格子数
int count = 0;
for (int i = 1; i < GameUtil.MAP_W; i++) {
for (int j = 1; j <= GameUtil.MAP_H; j++) {
if(GameUtil.DATA_TOP[i][j]!=-1){
count++;
}
}
}
if(count==GameUtil.RAY_MAX){
GameUtil.state=1;
for (int i = 1; i < GameUtil.MAP_W; i++) {
for (int j = 1; j <= GameUtil.MAP_H; j++) {
//未翻开,变成旗
if(GameUtil.DATA_TOP[i][j]==0){
GameUtil.DATA_TOP[i][j]=1;
}
}
}
return true;
}
return false;
}
boolean boom() {
for (int i = 1; i < GameUtil.MAP_W; i++) {
for (int j = 1; j <= GameUtil.MAP_H; j++) {
if (GameUtil.DATA_BUTTON[i][j] == -1 && GameUtil.DATA_TOP[i][j] == -1) {
GameUtil.state=2;
seeBoom();
return true;
}
}
}
return false;
}
//失败显示
void seeBoom(){
for (int i = 1; i < GameUtil.MAP_W; i++) {
for (int j = 1; j <= GameUtil.MAP_H; j++) {
//底层不是雷且顶层是旗
if(GameUtil.DATA_BUTTON[i][j]==-1&&GameUtil.DATA_TOP[i][j]!=1){
GameUtil.DATA_TOP[i][j]=-1;
}
//底层不是雷且,顶层是旗
if(GameUtil.DATA_BUTTON[i][j]!=-1&&GameUtil.DATA_TOP[i][j]==1){
GameUtil.DATA_TOP[i][j]=2;
}
}
}
}
- 简述:翻开所以格子且旗子都差在雷上则胜利,反之则失败。
3.提醒功能
//绘制数字,倒计时
GameUtil.drawWord(g,""+(GameUtil.RAY_MAX-GameUtil.FLAG_NUM),GameUtil.OFFSET,2*GameUtil.OFFSET,30,Color.red);
GameUtil.drawWord(g,""+(GameUtil.END_TIME-GameUtil.START_TIME)/1000,
GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W-1),
2*GameUtil.OFFSET,30,Color.black );
switch(GameUtil.state){
case 0:
GameUtil.END_TIME = System.currentTimeMillis();
g.drawImage(GameUtil.face,
GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W/2),
GameUtil.OFFSET,
null);
break;
case 1:
g.drawImage(GameUtil.win,
GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W/2),
GameUtil.OFFSET,
null);
break;
case 2:
g.drawImage(GameUtil.over,
GameUtil.OFFSET+GameUtil.SQUARE_LENGTH*(GameUtil.MAP_W/2),
GameUtil.OFFSET,
null);
break;
}
}
- 简述:打印了基本游戏界面的网格和背景,并设计了游戏中雷数量和游戏时长的提示功能。
4.埋雷功能
public class BottomRay {
//存放坐标
static int []rays = new int [GameUtil.RAY_MAX*2];//相邻两个数为地雷坐标
//地理坐标
int x,y;
//是否放置T表示放置,F表示不可放置
boolean isplace = true;
//生成雷
void newRay(){
for(int i=0;i<GameUtil.RAY_MAX*2;i=i+2){
x=(int)(Math.random()*GameUtil.MAP_W+1);//1-12
y=(int)(Math.random()*GameUtil.MAP_H+1);//1-12
rays[i]=x;
rays[i+1]=y;
//判断坐标是否存在,防止多个雷放在同一个位置
for(int j=0;j<i;j+=2){
if(x==rays[j]&&y==rays[j+1]){
i=i-2;
isplace = false;
break;
}
}
//将坐标放入数组
if(isplace){
rays[i] = x;
rays[i+1] = y;
}
isplace = true;
}
for (int i= 0;i<GameUtil.RAY_MAX*2;i=i+2){
GameUtil.DATA_BUTTON[rays[i]][rays[i+1]]=-1;
}
}
}
- 简述.利用random进行随机坐标的生成,并利用数组进行雷位置的存储。
5.数字填充功能
public class BottomNum {
void newNum(){
for(int i =1;i<=GameUtil.MAP_W;i++){
for(int j =1;j<=GameUtil.MAP_H;j++){
if(GameUtil.DATA_BUTTON[i][j]==-1){
for(int k=i-1;k<=i+1;k++){
for(int l =j-1;l<=j+1;l++){
if(GameUtil.DATA_BUTTON[k][l]>=0){
GameUtil.DATA_BUTTON[k][l]++;
}//判断3*3的区域
}
}
}
}
}
}
}
- 简述:利用多重循环遍历雷的九宫格来进行数字的填充。
五.项目总结
1.不足之处
1).放置第一个旗子时有时会出现闪动现象,且有时点击一下会将所有格子的内容显示出来,暂时还不知道如何解决。
2.展望
1)人机模式想要实现自定义。
2)想要添加pvp技术,实现对战,对战内容可以比一比谁的扫雷速度更快。
3)创建排行榜,不同难度扫雷的时间快慢进行排名。