今天很无聊,刚好有人问如何写一个扫雷程序。想了一下,写了一个命令行版的扫雷程序。等有时间再用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.");
}
}
分享到:
相关推荐
"Python趣味编程100例"是一个旨在帮助学习者通过实践来掌握Python编程的资源集合。这个压缩包包含100个精心挑选的实例,覆盖了Python编程的基础和进阶内容,旨在让你在解决问题和实现有趣项目的过程中,逐步提升...
总的来说,Python扫雷游戏设计是一次实践性强、技术含量高的课程设计,它涵盖了面向对象编程的基础概念,如类和对象的定义、继承和封装,同时也锻炼了学生的算法设计能力、问题解决能力和文档撰写能力。完成这个项目...
【Java扫雷游戏】是一款基于Java编程语言开发的桌面版小游戏,它继承了经典扫雷游戏的玩法,同时也融入了开发者独特的设计元素。在大学期间,开发者利用课余时间研究并实现了这款游戏,旨在锻炼自己的编程技能,同时...
扫雷游戏,作为一种逻辑与策略并重的益智游戏,其在Cocos Creator中的实现涉及到了许多编程和游戏设计的概念。 首先,我们要理解扫雷游戏的基本规则:玩家需要在9x9或更大的格子阵列中找出隐藏的雷,通过数字提示来...
扫雷游戏在Linux终端上的实现,主要依赖于C语言编程。C语言是系统级编程的首选,它的效率高、灵活性强,能够直接与硬件交互,因此非常适合在终端这种低级别环境中创建游戏。开发者通过编写C代码,利用VT100的转义...
【Windows经典扫雷游戏Java版】是一款基于Java编程语言实现的扫雷游戏,它复刻了我们熟悉的Windows操作系统内置的扫雷游戏体验。这款游戏的主要特点包括用户自定义难度、计时功能以及独特的求救机制,使得游戏更具...
在这个基于win32 API实现的扫雷项目中,我们将探讨如何利用C++语言和win32 API构建一个简易版的扫雷游戏。 首先,我们从基础开始,win32 API是微软为Windows操作系统提供的编程接口,它允许开发者直接与操作系统...
在Java编程语言中,开发一款扫雷游戏是一个典型的桌面应用程序项目,它可以帮助开发者巩固和提升对Java基础知识的理解,包括面向对象编程、事件处理、图形用户界面(GUI)设计等。以下将详细介绍涉及的知识点。 ...
在这个案例中,`扫雷.fla`包含了扫雷游戏的所有源代码和设计元素,可以通过Adobe Animate或旧版的Flash Professional编辑和导出为SWF可执行文件。 5. **游戏开发流程**:开发这样一个扫雷游戏,通常会经历以下步骤...
本文将深入探讨这款jQuery扫雷游戏的源码,解析其背后的编程思路和技术实现。 首先,我们要明确jQuery库在游戏中的作用。jQuery简化了DOM操作,事件处理和动画效果,使得编写复杂的前端交互变得更加容易。在这个...
"基于Visual C++实现的网络扫雷游戏"这个标题表明我们要讨论的是一款使用Microsoft的Visual C++编程环境开发的网络版扫雷游戏。扫雷是一款经典的单机游戏,而这里将其网络化,意味着玩家可以与他人在线进行对战或...
【Qt扫雷游戏】是一款基于Qt框架开发的趣味性计算机游戏,它实现了经典的扫雷玩法。Qt是一个跨平台的C++图形用户界面应用程序开发框架,适用于Windows、Linux、MacOS等操作系统,使得开发者能够轻松创建出美观且功能...
《Delphi扫雷游戏网络版》是一款基于Delphi编程语言开发的网络对战版扫雷游戏,它在设计上充分借鉴了Windows XP内置扫雷的经典风格,为玩家提供了熟悉而舒适的体验。该游戏不仅具备基本的单人游戏模式,还创新性地...
【扫雷游戏】是经典的一款逻辑推理类游戏,它的java源码揭示了如何用编程语言实现这个游戏的逻辑。在Java编程中,扫雷游戏的实现涉及到面向对象编程、图形用户界面(GUI)设计以及事件处理等多个核心知识点。 首先...
扫雷游戏是一款广为人知的经典益智游戏,而将它与水上舰艇大战结合,增加了游戏的趣味性和竞技性。 【描述】中的信息指出,这个游戏不仅支持单人模式,即人机对战,还支持双人模式,玩家可以在同一台计算机上进行...
这个扫雷游戏是基于Java的基础语法和面向对象编程理念构建的,旨在帮助开发者熟悉和巩固Java编程技能,同时提供一个趣味性的实践平台。 首先,我们要了解Java语言的基础。Java是一种跨平台的、面向对象的编程语言,...
综上所述,开发一款“可联网的扫雷游戏”涵盖了网络编程、图形界面设计、游戏逻辑实现等多个方面的技术,需要开发者具备扎实的编程基础和良好的问题解决能力。通过这样的项目,不仅可以提升技术技能,也能享受到将...
互动性强:C语言编写的扫雷游戏可以实现与用户的实时互动,提高游戏的趣味性和挑战性。 总之,C语言编写的扫雷小游戏不仅可以帮助玩家学习编程知识,还能锻炼玩家的逻辑思维能力。同时,游戏的可定制性和跨平台兼容...
总的来说,通过制作WPF版的扫雷游戏,我们可以深入学习C#语言和WPF框架,掌握控件使用、事件处理、数据结构与算法、界面设计等多个方面的知识。虽然这个项目可能不够完美,但它无疑是一个很好的起点,有助于开发者...
《ZEC 扫雷游戏 v0.9.7》是一款基于C++ Builder开发的经典扫雷游戏,它在传统的扫雷游戏基础上增添了丰富的交互体验。C++ Builder是一款强大的集成开发环境,专为C++编程设计,提供了丰富的类库和组件,使得开发者...