⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slcontroller.java

📁 手机游戏 《扫雷》 大家快快来下呀! 绝对的源码共享。
💻 JAVA
字号:
/*
 * 好好学习,天天向上。
 *
 * 作者:        牛潇
 * MSN:	       niuxiao@msn.com
 * E-Mail:     gniuxiao@gmail.com
 * QQ:          19528689
 * 
 * 创建日期:    2006-2-20
 */

import java.util.Random;

/**
 * 
 * @author 牛潇
 */
public class slController
{
    public static final int GAME_RUNNING    = 1;
    public static final int GAME_OVER       = 2;
    public static final int GAME_WIN        = 3;
    
    public static final int MINE    = 0x1;  // 有雷
    public static final int KNOWN   = 0x2;  // 已经打开
    public static final int FLAG    = 0x4;  // 标记为雷
    public static final int UNKNOWN = 0x8;  // 标记为问号
    
    int gameState;
	int row, col, mineCnt; // 多少行、列的雷、一共多少雷
    int[][] map;
    
    public slController(int row, int col, int mineCnt)
    {
        this.gameState = GAME_RUNNING;
        this.row = row;
        this.col = col;
        this.mineCnt = mineCnt;
        this.map = new int[row][col];
        generateMines();
    }
    
    /**
     * 挖雷
     * @param r 行
     * @param c 列
     */
    public void uncover(int r, int c)
    {
        if ((map[r][c]&KNOWN) != 0)
            return;
    	// 检查是否挖到了雷
    	if ((map[r][c]&MINE) != 0) {
    		gameState = GAME_OVER;
            return;
        }
    	map[r][c] |= KNOWN;
        map[r][c] &= ~FLAG;
        map[r][c] &= ~UNKNOWN;
        // 检查是否胜利
        int i,j,n;
        n = 0;
        for (i=0; i<row; ++i)
            for (j=0; j<col; ++j)
                if ((map[i][j]&KNOWN) != 0)
                    ++n;
        if (n+mineCnt == row*col) {
            gameState = GAME_WIN;
            return;
        }
		// 四周没有雷,继续扩展挖
        if (surroundingMineCount(r,c) == 0) {   
        	if (r!=0) uncover(r-1,c);  // 上
            if (r!=row-1) uncover(r+1,c);  // 下
            if (c!=0) uncover(r,c-1);  // 左
            if (c!=col-1) uncover(r,c+1);  // 右
            if (r!=0 && c!=0) uncover(r-1,c-1); // 左上
            if (r!=row-1 && c!=0) uncover(r+1,c-1); // 左下
            if (r!=0 && c!=col-1) uncover(r-1,c+1); // 右上
            if (r!=row-1 && c!=col-1) uncover(r+1,c+1); // 右下
        }
    }
    
    /**
     * 根据当前标记的状态,标记为雷或者问号或者去掉标记
     * @param r
     * @param c
     */
    public void mark(int r, int c)
    {
        if ((map[r][c]&KNOWN) != 0) // 已经打开的不能再标记了
            return;
    	if ((map[r][c]&FLAG) != 0) {
    		map[r][c] &= ~FLAG;
            map[r][c] |= UNKNOWN;
        }
        else if ((map[r][c]&UNKNOWN) != 0)
        	map[r][c] &= ~UNKNOWN;
        else
            map[r][c] |= FLAG;
    }
    
    public int surroundingMineCount(int r, int c)
    {
    	int n = 0;
        if (r!=0 && (map[r-1][c]&MINE)!=0)  // 上
            ++n;
        if (r!=row-1 && (map[r+1][c]&MINE)!=0)  // 下
            ++n;
        if (c!=0 && (map[r][c-1]&MINE)!=0)  // 左
            ++n;
        if (c!=col-1 && (map[r][c+1]&MINE)!=0)  // 右
            ++n;
        if (r!=0 && c!=0 && (map[r-1][c-1]&MINE)!=0)  // 左上
            ++n;
        if (r!=row-1 && c!=0 && (map[r+1][c-1]&MINE)!=0)  // 左下
            ++n;
        if (r!=0 && c!=col-1 && (map[r-1][c+1]&MINE)!=0)  // 右上
            ++n;
        if (r!=row-1 && c!=col-1 && (map[r+1][c+1]&MINE)!=0)  // 右下
            ++n;
        return n;
    }
   
    /**
     * 剩下多少雷没有标记
     */
    public int remainingMineCount()
    {
        int i,j,n;
        n = mineCnt;
        for (i=0; i<row; ++i)
            for (j=0; j<col; ++j)
                if ((map[i][j]&FLAG) != 0)
                    --n;
        return n;
    }
    
    private void generateMines()
    {
        Random r = new Random();
        r.setSeed(System.currentTimeMillis());
    	int n = mineCnt;
        while (n != 0) {
        	int ri = Math.abs(r.nextInt())%row;
            int rc = Math.abs(r.nextInt())%col;
            if ((map[ri][rc]&MINE) != 0)
                continue;
            --n;
            map[ri][rc] |= MINE;
        }
        int i,j;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -