`
qdzheng
  • 浏览: 67743 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

趣味编程:命令行版的扫雷游戏

    博客分类:
  • Java
阅读更多
今天很无聊,刚好有人问如何写一个扫雷程序。想了一下,写了一个命令行版的扫雷程序。等有时间再用Swing写个界面吧。贴在这里让大家玩玩,哈哈。
package fun.mine;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Random;

public class FunMine {
	int row,column; //行数、列数
	int mineNum;    //布雷数
	int marked;     //已标记雷数
	
	Cell[][] cells; //表示雷区的数组
	
	/**
	 * 布雷
	 */
	public void fill(int row,int column,int num){
		this.row=row;
		this.column=column;
		this.mineNum=num;
		this.marked=0;
		
		cells=new Cell[row][column];
		for(int i=0;i<row;i++){
			for(int j=0;j<column;j++){
				cells[i][j]=new Cell();
				cells[i][j].rowIndex=i;
				cells[i][j].colIndex=j;
			}
		}
		
		int nm=mineNum;
		Random rand=new Random(System.currentTimeMillis());
		while(nm>0){
			int r=rand.nextInt(row);
			int c=rand.nextInt(column);
			if (cells[r][c].mine==Cell.MINE_EMPTY){
				cells[r][c].mine=Cell.MINE_HAS;
				nm--;
			}
		}
		
		settingNumber();
	}
	/**
	 * 填数
	 */
	private void settingNumber(){
		for(int r=0;r<row;r++)
			for(int c=0;c<column;c++){
				if (cells[r][c].mine==Cell.MINE_EMPTY){
					List<Cell> adj=getAdjacentCells(cells[r][c], new CellFilter(){
						public boolean filter(Cell cell){
							return cell.mine==Cell.MINE_HAS;
						}
					});
					cells[r][c].mine=adj.size();
				}
			}
	}
	
	/**
	 * 取相邻单元格
	 * @param cell
	 * @param filter  一个实现了CellFilter接口的实例,用于过滤单元格
	 * @return
	 */
	private List<Cell> getAdjacentCells(Cell cell,CellFilter filter){
		List<Cell> rs=new java.util.ArrayList<Cell>();
		for(int roff=-1;roff<2;roff++)
			for(int coff=-1;coff<2;coff++){
				int cr=cell.rowIndex+roff;
				int cc=cell.colIndex+coff;
				if (cr>=0 && cr<row && cc >= 0 && cc < column ){
					if (cr==cell.rowIndex && cc==cell.colIndex) continue;
					if (filter.filter(cells[cr][cc]))
						rs.add(cells[cr][cc]);
				}
			}
		return rs;
	}
	
	/**
	 * 标记/取消标记
	 * @param r
	 * @param c
	 * @param mark
	 */
	public void mark(int r,int c,int mark){
		if (mark!=Cell.CELL_MARK && mark!=Cell.CELL_UNMARK) return;
		cells[r][c].mark=mark;
		if (mark==Cell.CELL_MARK) {
			marked++;
		}else{
			marked--;
		}
	}
	/**
	 * 打开指定的单元格
	 * 如果是空白,则打开其周围的单元格;
	 * 如果是雷,则 game over.
	 * 如果是数字,则只是置成打开的状态,不做进一步处理。
	 * 
	 * @param cell
	 */
	public int open(Cell cell){
		cell.status=Cell.STATUS_OPENED;
		if (cell.mine==Cell.MINE_HAS) return -1;
		if (cell.mine==Cell.MINE_EMPTY){
			List<Cell> adj=getAdjacentCells(cell, new CellFilter(){
				public boolean filter(Cell cell){
					return cell.status==Cell.STATUS_CLOSED;
				}
			});
			for(Cell a:adj) open(a);
		}
		return 0;
	}
	/**
	 * 打开指定的单元格
	 * 如果是空白,则打开其周围的单元格;
	 * 如果是雷,则 game over.
	 * 如果是数字,则只是置成打开的状态,不做进一步处理。
	 * 
	 * @param r
	 * @param c
	 */
	public int open(int r,int c){
		return open(cells[r][c]);
	}
	/**
	 * 单元格描述类
	 * 表示有雷或无雷、打开或关闭、标记或未标记。
	 */
	public static class Cell {
		public static int MINE_HAS=-1;
		public static int MINE_EMPTY=0;
		public static int CELL_UNMARK=0;
		public static int CELL_MARK=1;
		public static int STATUS_CLOSED=0;
		public static int STATUS_OPENED=1;
		
		public Cell(){
			mark=CELL_UNMARK;
			mine=MINE_EMPTY;
			status=STATUS_CLOSED;
		}
		
		int rowIndex;
		int colIndex;
		
		int mark;
		int mine;
		int status;
	}
	
	public static interface CellFilter{
		public boolean filter(Cell cell);
	}

	/**
	 * 打印雷区实际情况
	 */
	protected void debug(){
		System.out.println("Debug: ");
		for(int r=0;r<row;r++){
			for(int c=0;c<column;c++){
				System.out.print(String.format("%1$8s", cells[r][c].mine));
			}
			System.out.println();
		}
	}
	
	/**
	 * 打印游戏状态
	 */
	protected void print(){
		System.out.println("Status:");
		for(int r=0;r<row;r++){
			for(int c=0;c<column;c++){
				if (cells[r][c].status==Cell.STATUS_OPENED){
					System.out.print(String.format("%1$8s", cells[r][c].mine));
				}else if (cells[r][c].mark==Cell.CELL_MARK){
					System.out.print(String.format("%1$8s", "P"));
				}else{
					System.out.print(String.format("%1$8s", "I"));
				}
			}
			System.out.println();
		}
		System.out.println(String.format("总雷数:%1$d   已标记:%2$d ",mineNum,marked));
	}
	
	public static void main(String[] args){
		FunMine cm=new FunMine();
		cm.fill(8,8,15);
		System.out.println("准备好了吗?开始扫雷吧。");
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line;
		try{
			while((line=br.readLine())!=null){
				try{
						if ("exit".equals(line)){
							break;
						}
						String[] argv=line.split("\\s");
						if ("open".equals(argv[0])){
							int r=Integer.parseInt(argv[1]);
							int c=Integer.parseInt(argv[2]);
							cm.open(r, c);
						}else if ("mark".equals(argv[0])){
							int r=Integer.parseInt(argv[1]);
							int c=Integer.parseInt(argv[2]);
							cm.mark(r, c, Cell.CELL_MARK);
						}else if ("umark".equals(argv[0])){
							int r=Integer.parseInt(argv[1]);
							int c=Integer.parseInt(argv[2]);
							cm.mark(r, c, Cell.CELL_UNMARK);
						}else if ("debug".equals(argv[0])){
							cm.debug();
						}else if ("print".equals(argv[0])){
							cm.print();
						}else if ("fill".equals(argv[0])){
							int r=Integer.parseInt(argv[1]);
							int c=Integer.parseInt(argv[2]);
							int n=Integer.parseInt(argv[3]);
							cm.fill(r,c,n);
						}else if ("help".equals(argv[0])){
							showUseage();
						}else{
							throw new Exception("input error.");
						}
					}catch(Exception ex){
						System.out.println("input error.");
					}
				}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	public static void showUseage(){
		System.out.println("exit           Quit this program.");
		System.out.println("fill r c num   Fill mines.");
		System.out.println("mark r c       Mark a unit as mine.");
		System.out.println("umark r c      Cancel a marking of the unit.");
		System.out.println("open r c       open the unit, be careful.");
		System.out.println("print          Print game status.");
		System.out.println("debug          Print all mines of the game, for debug.");
		System.out.println("help           Show this help screen.");
		
	}
}
分享到:
评论
3 楼 QuakeWang 2009-01-07  
有创意,这个要比谁敲键盘快了
2 楼 zhouzhao21 2009-01-06  
不行,有创意,在 mark 后直接 print 一下,多数人都要看的
1 楼 Neuaaron 2009-01-06  
好玩

相关推荐

    python趣味编程100例

    "Python趣味编程100例"是一个旨在帮助学习者通过实践来掌握Python编程的资源集合。这个压缩包包含100个精心挑选的实例,覆盖了Python编程的基础和进阶内容,旨在让你在解决问题和实现有趣项目的过程中,逐步提升...

    python扫雷游戏设计(课程设计版)

    总的来说,Python扫雷游戏设计是一次实践性强、技术含量高的课程设计,它涵盖了面向对象编程的基础概念,如类和对象的定义、继承和封装,同时也锻炼了学生的算法设计能力、问题解决能力和文档撰写能力。完成这个项目...

    基于Java的扫雷游戏

    【Java扫雷游戏】是一款基于Java编程语言开发的桌面版小游戏,它继承了经典扫雷游戏的玩法,同时也融入了开发者独特的设计元素。在大学期间,开发者利用课余时间研究并实现了这款游戏,旨在锻炼自己的编程技能,同时...

    cocos creator 扫雷游戏资源工程

    扫雷游戏,作为一种逻辑与策略并重的益智游戏,其在Cocos Creator中的实现涉及到了许多编程和游戏设计的概念。 首先,我们要理解扫雷游戏的基本规则:玩家需要在9x9或更大的格子阵列中找出隐藏的雷,通过数字提示来...

    linux 终端的 扫雷游戏

    扫雷游戏在Linux终端上的实现,主要依赖于C语言编程。C语言是系统级编程的首选,它的效率高、灵活性强,能够直接与硬件交互,因此非常适合在终端这种低级别环境中创建游戏。开发者通过编写C代码,利用VT100的转义...

    windows经典扫雷游戏Java版

    【Windows经典扫雷游戏Java版】是一款基于Java编程语言实现的扫雷游戏,它复刻了我们熟悉的Windows操作系统内置的扫雷游戏体验。这款游戏的主要特点包括用户自定义难度、计时功能以及独特的求救机制,使得游戏更具...

    win32简单的扫雷游戏

    在这个基于win32 API实现的扫雷项目中,我们将探讨如何利用C++语言和win32 API构建一个简易版的扫雷游戏。 首先,我们从基础开始,win32 API是微软为Windows操作系统提供的编程接口,它允许开发者直接与操作系统...

    java编写扫雷游戏

    在Java编程语言中,开发一款扫雷游戏是一个典型的桌面应用程序项目,它可以帮助开发者巩固和提升对Java基础知识的理解,包括面向对象编程、事件处理、图形用户界面(GUI)设计等。以下将详细介绍涉及的知识点。 ...

    Flash做的扫雷小游戏

    在这个案例中,`扫雷.fla`包含了扫雷游戏的所有源代码和设计元素,可以通过Adobe Animate或旧版的Flash Professional编辑和导出为SWF可执行文件。 5. **游戏开发流程**:开发这样一个扫雷游戏,通常会经历以下步骤...

    jQuery扫雷游戏源码下载.zip

    本文将深入探讨这款jQuery扫雷游戏的源码,解析其背后的编程思路和技术实现。 首先,我们要明确jQuery库在游戏中的作用。jQuery简化了DOM操作,事件处理和动画效果,使得编写复杂的前端交互变得更加容易。在这个...

    基于Visual C++实现的网络扫雷游戏

    "基于Visual C++实现的网络扫雷游戏"这个标题表明我们要讨论的是一款使用Microsoft的Visual C++编程环境开发的网络版扫雷游戏。扫雷是一款经典的单机游戏,而这里将其网络化,意味着玩家可以与他人在线进行对战或...

    qt扫雷游戏

    【Qt扫雷游戏】是一款基于Qt框架开发的趣味性计算机游戏,它实现了经典的扫雷玩法。Qt是一个跨平台的C++图形用户界面应用程序开发框架,适用于Windows、Linux、MacOS等操作系统,使得开发者能够轻松创建出美观且功能...

    Delphi 扫雷游戏网络版.rar

    《Delphi扫雷游戏网络版》是一款基于Delphi编程语言开发的网络对战版扫雷游戏,它在设计上充分借鉴了Windows XP内置扫雷的经典风格,为玩家提供了熟悉而舒适的体验。该游戏不仅具备基本的单人游戏模式,还创新性地...

    扫雷游戏java源码

    【扫雷游戏】是经典的一款逻辑推理类游戏,它的java源码揭示了如何用编程语言实现这个游戏的逻辑。在Java编程中,扫雷游戏的实现涉及到面向对象编程、图形用户界面(GUI)设计以及事件处理等多个核心知识点。 首先...

    水上舰艇大战扫雷游戏含源码

    扫雷游戏是一款广为人知的经典益智游戏,而将它与水上舰艇大战结合,增加了游戏的趣味性和竞技性。 【描述】中的信息指出,这个游戏不仅支持单人模式,即人机对战,还支持双人模式,玩家可以在同一台计算机上进行...

    java_扫雷游戏——java_扫雷游戏

    这个扫雷游戏是基于Java的基础语法和面向对象编程理念构建的,旨在帮助开发者熟悉和巩固Java编程技能,同时提供一个趣味性的实践平台。 首先,我们要了解Java语言的基础。Java是一种跨平台的、面向对象的编程语言,...

    可联网的扫雷游戏

    综上所述,开发一款“可联网的扫雷游戏”涵盖了网络编程、图形界面设计、游戏逻辑实现等多个方面的技术,需要开发者具备扎实的编程基础和良好的问题解决能力。通过这样的项目,不仅可以提升技术技能,也能享受到将...

    c语言程序 - 扫雷小游戏

    互动性强:C语言编写的扫雷游戏可以实现与用户的实时互动,提高游戏的趣味性和挑战性。 总之,C语言编写的扫雷小游戏不仅可以帮助玩家学习编程知识,还能锻炼玩家的逻辑思维能力。同时,游戏的可定制性和跨平台兼容...

    用WPF做的扫雷游戏

    总的来说,通过制作WPF版的扫雷游戏,我们可以深入学习C#语言和WPF框架,掌握控件使用、事件处理、数据结构与算法、界面设计等多个方面的知识。虽然这个项目可能不够完美,但它无疑是一个很好的起点,有助于开发者...

    ZEC 扫雷游戏 v0.9.7(C++)

    《ZEC 扫雷游戏 v0.9.7》是一款基于C++ Builder开发的经典扫雷游戏,它在传统的扫雷游戏基础上增添了丰富的交互体验。C++ Builder是一款强大的集成开发环境,专为C++编程设计,提供了丰富的类库和组件,使得开发者...

Global site tag (gtag.js) - Google Analytics