Java课程设计——扫雷游戏程序

这篇具有很好参考价值的文章主要介绍了Java课程设计——扫雷游戏程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 人员分工

组员 职务 分工
潘鋆祥 组长 顶层格子的代码设计,界面UI设计
覃小杰 组员 扫雷素材的搜集,底层雷的代码设计

2.前期调查

java程序设计扫雷游戏,java

游戏详情

以windows 7自带扫雷为例。游戏区包括雷区、地雷计数器和计时器,确定大小的矩形雷区中随机布置一定数量的地雷(初级为99个方块10个雷,中级为1616个方块40个雷,高级为16*30个方块99个雷),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。

游戏的基本操作包括左键单击、右键单击、双击三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作:

左键单击:

在判断出不是雷的方块上按下左键,可以打开该方块。如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数(一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8);如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。

右键单击:

在判断为地雷的方块上按下右键,可以标记地雷(显示为小红旗)。重复操作可取消标记

双击:

同时按下左键和右键完成双击。当双击位置周围已标记雷数等于该位置数字时操作有效,相当于对该数字周围未打开的方块均进行一次左键单击操作。地雷未标记完全时使用双击无效。若数字周围有标错的地雷,则游戏结束,标错的地雷上会显示一个“ ×”。

3.需求分析

3.1系统数据分析

扫雷雷区是一个二维区间,所以需要一个二维数组进行存储数据,而其中又分为了底层跟上层,底层用于存储雷跟数字,上层用于翻开格子,插旗等操作。
若翻开的格子下是雷,则判定失败;若全局中未翻开的格子数(包括插旗的格子)等于雷数,则默认将所有未翻开的格子插旗,且判定胜利。

3.2系统操作分析

进行左键右键操作的时候,我们需要对鼠标进行监听,若鼠标左键或右键点击,则读取鼠标的横纵坐标,然后通过换算之后,换算成鼠标点击的对应格子的二维数组坐标,然后在二维数组中对其进行操作。因为双击的操作过于繁琐,我们用右键进行替代,若右键点击到的是已被翻开的格子,则判定原本扫雷中的双击操作;若右键点击的是未翻开的格子,则进行插旗操作。

3.3系统界面分析

需要有能进行难度选择的按钮,难度选择后能确确实实地改变雷数与格子数,且窗口的大小能根据难度的变化进行相应的变大缩小,需要有能实时变化的地雷计数器和计时器,且能给与出随时重置游戏的按钮。

4.流程图

java程序设计扫雷游戏,java
java程序设计扫雷游戏,java

5.游戏运行截图

难度选择

java程序设计扫雷游戏,java

简单难度

java程序设计扫雷游戏,java

成功判定

java程序设计扫雷游戏,java

失败判定

java程序设计扫雷游戏,java

普通难度

java程序设计扫雷游戏,java

困难难度

java程序设计扫雷游戏,java

6.关键代码

主页面代码(包括鼠标监听)

public class GameWin extends JFrame{
	int wide = 2*GameUtil.offset + GameUtil.wide*GameUtil.squareLength;
	int high = 2*GameUtil.offset + GameUtil.high*GameUtil.squareLength;
	Image offScreenImage = null;
	
	Map map = new Map();
	MapTop mapTop = new MapTop();
	GameSelect gameSelect = new GameSelect();
	
	boolean begin=false;
	void mainPage() {
		GameUtil.start_time=System.currentTimeMillis();
		this.setVisible(true);
		if(GameUtil.state==3)
		{
			this.setSize(500,500);
		}
		else
		{
			this.setSize(wide,high);
		}
		
		this.setTitle("扫雷游戏");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.addMouseListener(new MouseAdapter()
		{
			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.squareLength*(GameUtil.wide/2)&&
								e.getX()<GameUtil.offset +GameUtil.squareLength*(GameUtil.wide/2)+GameUtil.squareLength*2
								&&e.getY()>GameUtil.offset/3
								&&e.getY()<GameUtil.offset+GameUtil.squareLength)
						{
							map.reGame();
							mapTop.reGame();
							GameUtil.flag_num=0;
							GameUtil.start_time=System.currentTimeMillis();
							GameUtil.state =0;
						}
					}
					break;
				case 3:
					if(e.getButton()==1)
					{
						GameUtil.Mouse_x=e.getX();
						GameUtil.Mouse_y=e.getY();
						begin = gameSelect.hard();
						
					}
				default : 
				}
				
				
			}
		});
		while(true)
		{
			repaint();
			begin();
			try {
				Thread.sleep(40);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	void begin()
	{
		if(begin)
		{
			begin=false;
			gameSelect.hard(GameUtil.level);
			dispose();
			GameWin gameWin = new GameWin();
			GameUtil.start_time = System.currentTimeMillis();
			GameUtil.flag_num=0;
			map.reGame();
			mapTop.reGame();
			gameWin.mainPage();
		}
	}
	public void paint(Graphics g)
	{
		if(GameUtil.state==3)
		{
			g.setColor(Color.white);
			g.fillRect(0,0,500,500);
			gameSelect.paintSelf(g);
		}
		else
		{
		offScreenImage = this.createImage(wide,high);
		Graphics gImage = offScreenImage.getGraphics();
		
		map.paintMap(gImage);
		mapTop.paintMap(gImage);
		g.drawImage(offScreenImage,0,0,null);
		}
		
	}
	public static void main(String[] args)
	{
		GameWin gameWin = new GameWin();
		gameWin.mainPage();
	}

}

底层雷区绘制

public class Map {
	BottomMine bottomMine = new BottomMine();
	BottomNum bottomNum = new BottomNum();
	{
		bottomMine.newMines();
		bottomNum.newNum();
	}
	void reGame()
	{
		for(int i = 1;i <=GameUtil.wide;i++)
		{
			for(int j = 1; j<=GameUtil.high; j++)
			{
				GameUtil.bottom[i][j]=0;
				
			}
		}
		bottomMine.newMines();
		bottomNum.newNum();
	}
	void paintMap(Graphics g)
	{
		
		for(int i=0;i<=GameUtil.wide;i++)
		{
			g.setColor(Color.white);
			g.drawLine(GameUtil.offset+i*GameUtil.squareLength, 
					GameUtil.offset, 
					GameUtil.offset+i*GameUtil.squareLength, 
					GameUtil.offset+GameUtil.high*GameUtil.squareLength);
		}
		for(int i = 0;i<=GameUtil.high;i++)
		{
			g.setColor(Color.white);
			g.drawLine(GameUtil.offset, 
					GameUtil.offset+i*GameUtil.squareLength, 
					GameUtil.offset+GameUtil.wide*GameUtil.squareLength, 
					GameUtil.offset+i*GameUtil.squareLength);
		}
		for(int i = 1;i<=GameUtil.wide;i++)
		{
			for(int j=1;j<=GameUtil.high;j++)
			{
				if(GameUtil.bottom[i][j]==-1) {
				g.drawImage(GameUtil.Mine,
						GameUtil.offset+(i-1)*GameUtil.squareLength+1,
						GameUtil.offset+(j-1)*GameUtil.squareLength+1,
						GameUtil.squareLength-2,
						GameUtil.squareLength-2,
						null);
				}
				if(GameUtil.bottom[i][j]>=0) {
					g.drawImage(GameUtil.images[GameUtil.bottom[i][j]],
							GameUtil.offset+(i-1)*GameUtil.squareLength+1,
							GameUtil.offset+(j-1)*GameUtil.squareLength+1,
							GameUtil.squareLength-2,
							GameUtil.squareLength-2,
							null);
					}
			}
		}
		GameUtil.drawWord(g, ""+(GameUtil.Mine_max-GameUtil.flag_num), GameUtil.offset+GameUtil.squareLength*(GameUtil.wide-1),
				GameUtil.offset/2, 30, Color.black);
		GameUtil.drawWord(g, ""+(GameUtil.end_time-GameUtil.start_time)/1000  , GameUtil.offset, GameUtil.offset/2, 30, Color.black);
		switch (GameUtil.state) {
		case 0 :
			GameUtil.end_time=System.currentTimeMillis();
			g.drawImage(GameUtil.face, 
					GameUtil.offset+GameUtil.squareLength*(GameUtil.wide/2),
					GameUtil.offset/3,
					null);
			break;
		case 1 :
			g.drawImage(GameUtil.win, 
					GameUtil.offset+GameUtil.squareLength*(GameUtil.wide/2),
					GameUtil.offset/3,
					null);
			break;
		case 2:
			g.drawImage(GameUtil.over, 
					GameUtil.offset+GameUtil.squareLength*(GameUtil.wide/2),
					GameUtil.offset/3,
					null);
			break;
			
			default:
		}
	}
	

}


顶层方格的绘制文章来源地址https://www.toymoban.com/news/detail-770668.html

import java.awt.Color;
import java.awt.Graphics;
import java.security.KeyManagementException;

public class MapTop {

	int temp_x;
	int temp_y;
	void reGame()
	{
		for(int i = 1;i <=GameUtil.wide;i++)
		{
			for(int j = 1; j<=GameUtil.high; j++)
			{
				GameUtil.Data[i][j]=0;
			}
		}
	}
	void logic()
	{
		temp_x = 0;
		temp_y = 0;
		
		
		
		if (GameUtil.Mouse_x>GameUtil.offset&&GameUtil.Mouse_y>GameUtil.offset)
		{
			temp_x = (GameUtil.Mouse_x-GameUtil.offset)/GameUtil.squareLength+1;
			temp_y = (GameUtil.Mouse_y-GameUtil.offset)/GameUtil.squareLength+1;
		}
		
		if(temp_x>=1&&temp_x<=GameUtil.wide
				&&temp_y>=1&&temp_y<=GameUtil.high)
		{
			
		
			if(GameUtil.left)
			{
				if(GameUtil.Data[temp_x][temp_y]==0)
				{
					GameUtil.Data[temp_x][temp_y]=-1;
				}
				spaceOpen(temp_x,temp_y);
				GameUtil.left = false;
			}
			if(GameUtil.right)
			{
				if(GameUtil.Data[temp_x][temp_y]==0)
				{
					GameUtil.Data[temp_x][temp_y]=1;
					GameUtil.flag_num++;
				}
				else if(GameUtil.Data[temp_x][temp_y]==1)
				{
					GameUtil.Data[temp_x][temp_y]=0;
					GameUtil.flag_num--;
				}
				else if(GameUtil.Data[temp_x][temp_y]==-1)
				{
					numOpen(temp_x,temp_y);
				}
				GameUtil.right = false;
			}
		}
		boom();
		victory();
	}
	boolean victory()
	{
		int count = 0;
		for(int i = 1; i<=GameUtil.wide; i++)
		{
			for(int j = 1; j<=GameUtil.high;j++)
			{
				if(GameUtil.Data[i][j]!=-1)
				{
					count++;
					
				}
			}
		}
		if(count==GameUtil.Mine_max)
		{
			GameUtil.state=1;
			for(int i = 1; i<=GameUtil.wide; i++)
			{
				for(int j = 1;j<=GameUtil.high;j++)
				{
					
					if(GameUtil.Data[i][j]==0)
					{
						GameUtil.Data[i][j]=1;
					}
				}
			}
			return true;
			
		}
		return false;
	}
	void seeBoom()
	{
		for(int i = 1; i<=GameUtil.wide; i++)
		{
			for(int j = 1; j<=GameUtil.high;j++)
			{
				if(GameUtil.bottom[i][j]==-1&&GameUtil.Data[i][j]!=1)
				{
					GameUtil.Data[i][j]=-1;
				}
				if(GameUtil.bottom[i][j]!=-1&&GameUtil.Data[i][j]==1)
				{
					GameUtil.Data[i][j]=2;
				}
			}
		}
	}
	boolean boom()
	{
		for(int i = 1; i<=GameUtil.wide; i++)
		{
			for(int j = 1; j<=GameUtil.high;j++)
			{
				if(GameUtil.bottom[i][j]==-1&&GameUtil.Data[i][j]==-1)
				{
					GameUtil.state=2;
					seeBoom();
					return true;
				}
			}
		}
		return false;
	}
	void numOpen(int x, int y)
	{
		int count=0;
		if(GameUtil.bottom[x][y]>0)
		{
			for(int i =	x-1; i<=x+1;i++)
			{
				for(int j=y-1;j<=y+1;j++)
				{
					if(GameUtil.Data[i][j]==1)
					{
						count++;
					}
				}
			}
			if(count==GameUtil.bottom[x][y])
			{
				for(int i =	x-1; i<=x+1;i++)
				{
					for(int j=y-1;j<=y+1;j++)
					{
						if(GameUtil.Data[i][j]!=1)
						{
							GameUtil.Data[i][j]=-1;
						}
						if(i>=1&&j>=1&&i<=GameUtil.wide&&j<=GameUtil.high)
						{
							spaceOpen(i,j);
						} 
					}
					
				}
			}
		}
	}
	void spaceOpen(int x,int y)
	{
		if(GameUtil.bottom[x][y]==0)
		{
			for(int i =	x-1; i<=x+1;i++)
			{
				for(int j=y-1;j<=y+1;j++)
				{
					if(GameUtil.Data[i][j]!=-1)
					{
						if(GameUtil.Data[i][j]==1)
						{
							GameUtil.flag_num--;
						}
						GameUtil.Data[i][j]=-1;
						if(i>=1&&j>=1&&i<=GameUtil.wide&&j<=GameUtil.high)
						{
							spaceOpen(i,j);
						}
						
					}
					
				}
			}
		}
	}
	void paintMap(Graphics g)
	{
		logic();
		
		for(int i = 1;i<=GameUtil.wide;i++)
		{
			for(int j=1;j<=GameUtil.high;j++)
			{
				if(GameUtil.Data[i][j]==0) {
				g.drawImage(GameUtil.unknown,
						GameUtil.offset+(i-1)*GameUtil.squareLength+1,
						GameUtil.offset+(j-1)*GameUtil.squareLength+1,
						GameUtil.squareLength-2,
						GameUtil.squareLength-2,
						null);
				}
				if(GameUtil.Data[i][j]==1) {
					g.drawImage(GameUtil.flag,
							GameUtil.offset+(i-1)*GameUtil.squareLength+1,
							GameUtil.offset+(j-1)*GameUtil.squareLength+1,
							GameUtil.squareLength-2,
							GameUtil.squareLength-2,
							null);
				}
				if(GameUtil.Data[i][j]==2) {
					g.drawImage(GameUtil.noflag,
							GameUtil.offset+(i-1)*GameUtil.squareLength+1,
							GameUtil.offset+(j-1)*GameUtil.squareLength+1,
							GameUtil.squareLength-2,
							GameUtil.squareLength-2,
							null);
				}
			}
		}
	}
}

到了这里,关于Java课程设计——扫雷游戏程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算数学表达式的程序(Java课程设计)

    团队名称 团队成 员介绍 任务分配 团队成员博客 XQ Warriors 徐维辉 负责计算器数据的算法操作,如平方数、加减乘除,显示历史计算记录 无 邱良厦(组长) 负责计算器的图形设计,把输入和结果显示在最上面的文本框 无 1)图形界面设计参考:Java Swing界面设计UI(全)_sw

    2024年01月21日
    浏览(32)
  • 面向对象程序设计(Java)课程设计——学生信息管理系统(GUI+文件)

    一、团队成员及任务 组长:宗庆亮  计科(智能)22-1  202203200021 负责模块:静态登录界面实现以及学生信息系统管理界面的创建 组员:郑金洲  计科(智能)22-1  202203200022 负责模块:增加,删除,修改以及查询功能的实现 团队博客:面向对象程序设计(Java)课程设计——学生

    2024年02月03日
    浏览(43)
  • JAVA002打飞机游戏设计(程序+论文)

    1  绪论 1.1 手机软件现状 在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端: 1.  传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错

    2024年02月09日
    浏览(32)
  • 基于Java(Springboot框架) 后台课程学习小程序系统设计与实现研究背景与意义、国内外研究现状

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月03日
    浏览(36)
  • matlab GUI课程设计——扫雷游戏

    1.熟悉matlab基本的代码编写能力; 2.学会利用matlab GUI设计图形交互界面,方便使用者操作; 1.创建15行×20列的扫雷界面,界面上包括棋子数量统计和炸弹数量设置.炸弹数量越多,扫雷难度越大. 2. 正常扫雷演示: 3. 点击到炸弹后,弹出对话框,可选择关闭程序或者重新开始. 每个按

    2024年02月12日
    浏览(33)
  • Java课程设计——挖地雷游戏设计报告

    源文件:  大学生Java课程设计——挖地雷游戏设计报告源文件-其它文档类资源-CSDN文库 目 录 摘 要. 1 一、引言. 2 1.设计任务和基本要求. 2 二、报告正文. 3 1.需求分析. 3 2.概要分析. 6 3.详细分析. 8 4.调试分析. 32 三、总结. 33 四、课程感言. 35 5、 参考文献. 36 附件. 37 在现代,

    2024年02月11日
    浏览(28)
  • Java程序设计-实验五 Java多线程程序设计

    1. 掌握Runnable接口实现多线程的方法 2. 掌握Thread类实现多线程的用法 3. 掌握Java语言中多线程编程的基本方法 要求:编写一个应用程序,除了主线程外,还有三个线程:first、second和third。 first负责模拟一个红色的按钮从坐标(10,60)运动到(100,60); second负责模拟一

    2024年02月03日
    浏览(49)
  • Java程序设计——作业一

    一.单选题(共3题,42.6分) 1 Java属于哪种语言?( ) A、 机器语言 B、 汇编语言 C、 高级语言 D、 以上都不对 正确答案: C 2 下面命令中,可以用来正确编译HelloWorld.java程序的是( ) A、 java HelloWorld B、 java HelloWorld.java C、 javac HelloWorld D、 javac HelloWorld.java 正确答案: D 3 以下

    2023年04月08日
    浏览(52)
  • Java程序设计实验——实验6

    Spraing※boy 在本次实验中,加入了实验中可能遇到的知识点的总结提示和相关知识点的学习链接,个人觉得这次实验在java中的应用还是非常广泛的,在项目的开发中会经常用到,希望各位友友们能通过这篇博客真正学到一些东西❀❀。 附上:java学习笔记 1、将下列数据:“

    2024年02月03日
    浏览(45)
  • 【Java高级程序设计】注解实验

    @Label注解: person类:  PersonAction接口: PersonInput类,负责提示录入人员的相关属性,提示必须是注解@Label所标注的中文名称。 PersonDisplay,负责显示人员信息,显示时的属性名称必须为注解@Label所标注的中文名称 测试类: 运行结果: @Column注解 Person类: MySqlDAO类: CreateSQL类

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包