当前位置:文档之家› Android的扫雷游戏源代码

Android的扫雷游戏源代码

Android的扫雷游戏源代码:


公共类MinesweeperGame延伸活动
{
私人TextView的txtMineCount;
私人TextView的txtTimer;
私人ImageButton btnSmile;

私人TableLayout雷区; / /表的布局添加地雷

私人块多块[][]; / /块矿田
私人诠释blockDimension = 24; / /每块的宽度
私人诠释blockPadding = 2; / /块之间填充

私人诠释numberOfRowsInMineField = 9;
私人诠释numberOfColumnsInMineField = 9;
私人诠释totalNumberOfMines = 10;

/ /定时器的运行时间保持跟踪
私人处理程序定时器=新的处理程序();
私人诠释secondsPassed = 0;

私人布尔isTimerStarted; / /检查是否已经开始或不定时
私人布尔areMinesSet; / /检查是否以块种植地雷
私人布尔isGameOver;
私人诠释minesToFind / /的地雷数量尚未被发现

@覆盖
公共无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(https://www.doczj.com/doc/2618961301.html,yout.main);

txtMineCount =(TextView的)findViewById(R.id.MineCount);
txtTimer =(TextView的)findViewById(R.id.Timer);

/ /设置定时器和矿山数液晶风格的字体样式
字体lcdFont = Typeface.createFromAsset(getAssets()
“fonts/lcd2mono.ttf”);
txtMineCount.setTypeface(lcdFont);
txtTimer.setTypeface(lcdFont);

btnSmile =(ImageButton)findViewById(R.id.Smiley);
btnSmile.setOnClickListener(新OnClickListener()
{
@覆盖
公共无效的onClick(View视图)
{
endExistingGame();
startNewGame();
}
});

雷区=(TableLayout)findViewById(R.id.MineField);

ShowDialog的(“点击笑脸,开始新游戏”,2000年,真,假);
}

私人无效startNewGame()
{
/ /埋设地雷,并执行其他计算
createMineField();
/ /显示在用户界面的所有块
showMineField();

minesToFind = totalNumberOfMines;
isGameOver = 0;
secondsPassed = 0;
}

私人无效showMineField()
{
/ /请记住,我们不会显示第0个和最后一个行和列
/ /他们是仅用于计算
为(int行= 1;行{
新的TableRow的TableRow的TableRow =(本);
tableRow.setLayoutParams(新的LayoutParams((blockDimension + 2 * blockPadding)* numberOfColumnsInMineField,blockDimension + 2 * blockPadding));

为(int列= 1;“列{
块[行] [列]。setLayoutParams(新的LayoutParams(
blockDimension + 2 * blockPadding,
blockDimension + 2 * blockPadding));
块[行] [列] setPadding(blockPadding,blockPadding,blockPadding,blockPadding)。
tableRow.addView(块[行] [列]);
}
mineField.addView(TableRow的,新的https://www.doczj.com/doc/2618961301.html,youtParams(
(blockDimension + 2 * blockPadding)* numberOfColumnsInMineField

,blockDimension + 2 * blockPadding));
}
}

私人无效endExistingGame()
{
stopTimer(); / /停止,如果计时器正在运行
txtTimer.setText(“000”); / /恢复所有文本
txtMineCount.setText(“000”); / /恢复矿山数量
btnSmile.setBackgroundResource(R.drawable.smile);

/ /删除所有行雷区TableLayout
mineField.removeAllViews();

/ /设置变量,以支持所有比赛结束
isTimerStarted = 0;
areMinesSet = 0;
isGameOver = 0;
minesToFind = 0;
}

私人无效createMineField()
{
/ /我们为每方一列额外的行
/ /整体两个额外的两个额外的行和列
/ /第一个和最后一个行/列用于计算仅
/ / x |的xxxxxxxxxxxxxx | x
/ / ------------------
/ / X的| | x
/ / X的| | x
/ / ------------------
/ / x |的xxxxxxxxxxxxxx | x
/ /行和列标记为x的只是用来保持近数地雷

块=新座[numberOfRowsInMineField + 2] [numberOfColumnsInMineField + 2];

为(int行= 0;行{
为(int列= 0;“列{
块[行] [列] =新的块(这个);
块[行] [列] setDefaults()。

/ /把当前行和列编号为最终诠释的给事件侦听器
/ /这样我们可以确保每一个事件侦听器关联
/ /具体实例,只座
最后诠释currentRow =行;
最后诠释currentColumn =列;

/ /添加监听器点击
/ /这被视为鼠标左键
块[行] [列]。setOnClickListener(新OnClickListener()
{
@覆盖
公共无效的onClick(View视图)
{
/ /在第一次单击启动定时器
如果(!isTimerStarted)
{
startTimer();
isTimerStarted =真;
}

/ /在第一次单击设置地雷
如果(!areMinesSet)
{
areMinesSet =真;
setMines(currentRow,currentColumn);
}

/ /这不是第一次点击
/ /检查当前块被标记
/ /如果不这样做标记的东西
/ /因为该操作是处理LongClick
/ /如果块没有再发现标记附近区
/ /直到我们得到编号地雷
如果(!块[currentRow] [currentColumn]。isFlagged())
{
/ /打开,直到我们得到的块数块附近
rippleUncover(currentRow,currentColumn);

/ /我们点击一??个地雷
如果(块[currentRow] [currentColumn]。hasMine())
{
/ /糟糕,游戏结束
finishGame(currentRow,currentColumn);
}

/ /检查,如果我们赢了这场比赛
如果(checkGameWin())
{
/ /为赢得比赛大关
winGame();
}
}
}
});

/ /添加监听长摁
/ /这被视为右击鼠标监听器
块[行] [列]。setOnLongClickListene

r(新OnLongClickListener()
{
公共布尔onLongClick(View视图)
{
/ /模拟左右(中)点击
/ /如果它是对一个开了我那么长摁
/ /打开所有周边街区
如果(!块[currentRow] [currentColumn]。isCovered()&&(块[currentRow] [currentColumn]。getNumberOfMinesInSorrounding()“0)&&!isGameOver)
{
诠释nearbyFlaggedBlocks = 0;
为(int previousRow = -1; previousRow <2; previousRow + +)
{
为(int previousColumn = -1; previousColumn <2; previousColumn + +)
{
如果(块[currentRow + previousRow] [currentColumn + previousColumn]。isFlagged())
{
nearbyFlaggedBlocks + +;
}
}
}

/ /如果标记的块数等于附近的矿山数量
/ /然后打开附近的街区
如果(nearbyFlaggedBlocks ==块[currentRow] [currentColumn]。getNumberOfMinesInSorrounding())
{
为(int previousRow = -1; previousRow <2; previousRow + +)
{
为(int previousColumn = -1; previousColumn <2; previousColumn + +)
{
/ /不公开块标记
如果(!块[currentRow + previousRow] [currentColumn + previousColumn]。isFlagged())
{
/ /直到我们得到的块数块开放
rippleUncover(currentRow + previousRow,currentColumn + previousColumn);

/ /我们点击一??个地雷
如果(块[currentRow + previousRow] [currentColumn + previousColumn]。hasMine())
{
/ /糟糕游戏结束
finishGame(currentRow + previousRow,currentColumn + previousColumn);
}

/ /我们赢了这场比赛
如果(checkGameWin())
{
/ /为赢得比赛大关
winGame();
}
}
}
}
}

/ /因为我们不再要判断这个手势所以返回
/ /不从这里返回确实会触发其他行动
/ /它可以作为一个标志或标志问号或空白
返回true;
}

/ /如果点击块被启用,可点击或标记
如果(块[currentRow] [currentColumn]。isClickable()&&
(块[currentRow] [currentColumn] isEnabled()|。|块[currentRow] [currentColumn] isFlagged()。))
{

/ /集长点击:
/ / 1。 对空块标记
/ / 2。 标记,以问号
/ / 3。 问号空白

/ /案例1。 设置空白块标记
如果(!块[currentRow] [currentColumn]。isFlagged()&&!块[currentRow] [currentColumn]。isQuestionMarked())
{
块[currentRow] [currentColumn] setBlockAsDisabled(假)。
块[currentRow] [currentColumn] setFlagIcon(真)。
块[currentRow] [currentColumn] setF

lagged(真)。
minesToFind - ; / /减少矿山数量
updateMineCountDisplay();
}
/ /例2。 设置标记,以问号
否则,如果(!块[currentRow] [currentColumn]。isQuestionMarked())
{
块[currentRow] [currentColumn] setBlockAsDisabled(真)。
块[currentRow] [currentColumn] setQuestionMarkIcon(真)。
块[currentRow] [currentColumn] setFlagged(假)。
块[currentRow] [currentColumn] setQuestionMarked(真)。
minesToFind + +; / /增加矿井数量
updateMineCountDisplay();
}
/ /例3。 更改为空白方块
其他
{
块[currentRow] [currentColumn] setBlockAsDisabled(真)。
块[currentRow] [currentColumn] clearAllIcons()。
块[currentRow] [currentColumn] setQuestionMarked(假)。
/ /如果是我的标记,然后递增计数
如果(块[currentRow] [currentColumn]。isFlagged())
{
minesToFind + +; / /增加矿井数量
updateMineCountDisplay();
}
/ /删除标记状态
块[currentRow] [currentColumn] setFlagged(假)。
}

updateMineCountDisplay(); / /更新我的显示
}

返回true;
}
});
}
}
}

私人布尔checkGameWin()
{
为(int行= 1;行{
为(int列= 1;“列{
如果(!块[行] [列]。hasMine()&&块[行] [列]。isCovered())
{
返回false;
}
}
}
返回true;
}

私人无效updateMineCountDisplay()
{
如果(minesToFind <0)
{
txtMineCount.setText(Integer.toString(minesToFind));
}
否则,如果(minesToFind“10)
{
txtMineCount.setText(“00”+ Integer.toString(minesToFind));
}
否则,如果(minesToFind <100)
{
txtMineCount.setText(“0”+ Integer.toString(minesToFind));
}
其他
{
txtMineCount.setText(Integer.toString(minesToFind));
}
}

私人无效winGame()
{
stopTimer();
isTimerStarted = 0;
isGameOver =真;
minesToFind = 0; / /设置矿山数为0

/ /设置图标冷却花花公子
btnSmile.setBackgroundResource(R.drawable.cool);

updateMineCountDisplay(); / /更新我的计数

/ /关闭所有按钮
/ /设置标记所有未标记块
为(int行= 1;行{
为(int列= 1;“列{
块[行] [列] setClickable(假)。
如果(块[行] [列]。hasMine())
{
块[行] [列] setBlockAsDisabled(假)。
块[行] [列] setFlagIcon(真)。
}
}
}

/ /显示消息
ShowDialog的(“你赢得了”+ Integer.toString(se

condsPassed)+“秒!”,1000,虚假,真实);
}

私人无效finishGame(智力currentRow,诠释currentColumn)
{
isGameOver =真; / /作为对马克的游戏
stopTimer(); / /停止定时器
isTimerStarted = 0;
btnSmile.setBackgroundResource(R.drawable.sad);

/ /显示所有地雷
/ /关闭所有块
为(int行= 1;行{
为(int列= 1;“列{
/ /禁止块
块[行] [列] setBlockAsDisabled(假)。

/ /块有地雷和未标示
如果(块[行] [列]。hasMine()&&!块[行] [列]。isFlagged())
{
/ /设置我的图标
块[行] [列] setMineIcon(假)。
}

/ /块标记,不不也有我
如果(!块[行] [列]。hasMine()&&块[行] [列]。isFlagged())
{
/ /设置的标志图标
块[行] [列] setFlagIcon(假)。
}

/ /块被标记
如果(块[行] [列]。isFlagged())
{
/ /禁用块
块[行] [列] setClickable(假)。
}
}
}

/ /触发地雷
块[currentRow] [currentColumn] triggerMine()。

/ /显示消息
ShowDialog的(“你尝试过”+ Integer.toString(secondsPassed)+“秒!”,1000,假,假);
}


私人无效setMines(智力currentRow,诠释currentColumn)
{
/ /设置地雷排除用户点击的位置
新的随机随机兰特=();
诠释mineRow,mineColumn;

为(int行= 0;行{
mineRow = rand.nextInt(numberOfColumnsInMineField);
mineColumn = rand.nextInt(numberOfRowsInMineField);
如果((mineRow + 1 = currentColumn)|!|!(mineColumn + 1 = currentRow))
{
如果(块[mineColumn + 1] [mineRow + 1]。hasMine())
{
行 - ; / /我已经在那儿,不重复同一个块
}
/ /我在这个位置厂
块[mineColumn + 1] [mineRow + 1] plantMine()。
}
/ /排除用户点击的位置
其他
{
行 - ;
}
}

诠释nearByMineCount;

/ /计数的地雷周围的块数
为(int行= 0;行{
为(int列= 0;“列{
/ /查找每个块附近的矿山数量
nearByMineCount = 0;
如果((行!= 0)&&(行!=(numberOfRowsInMineField + 1))&&(列!= 0)&&(列!=(numberOfColumnsInMineField + 1)))
{
/ /检查所有附近的街区
为(int previousRow = -1; previousRow <2; previousRow + +)
{
为(int previousColumn = -1; previousColumn <2; previousColumn + +)
{
如果(块[行+ previousRow] [列+ previousColumn]。hasMine())
{
/ /我发现这样一个递增计数器
nearByMineCount + +;
}
}
}

块[

行] [列] setNumberOfMinesInSurrounding(nearByMineCount)。
}
/ /侧行(第0个和最后一个行/列)
/ /为9套算并标记为已打开
其他
{
块[行] [列] setNumberOfMinesInSurrounding(9)。
块[行] [列] OpenBlock()。
}
}
}
}

私人无效rippleUncover(智力rowClicked,诠释columnClicked)
{
/ /不开放或采行标记
如果(块[rowClicked] [columnClicked] hasMine()|。|。块[rowClicked] [columnClicked] isFlagged())
{
返回;
}

/ /打开点击块
块[rowClicked] [columnClicked] OpenBlock()。

/ /如果点击块附近有地雷然后不进一步开放
如果(块[rowClicked] [columnClicked]。getNumberOfMinesInSorrounding()!= 0)
{
返回;
}

/ /打开下一个3行3列和递归
为(int行= 0;行<3;行+ +)
{
为(int列= 0;“列<3;柱+ +)
{
/ /检查所有上述检查情况
/ /如果遇到然后打开以后块
如果(块[rowClicked +行 - 1] [columnClicked +柱 - 1]。isCovered()
&&(rowClicked +行 - 1> 0)&&(columnClicked +列 - 1> 0)
&&(rowClicked +行 - 1 {
rippleUncover(rowClicked +行 - 1,columnClicked +列 - 1);
}
}
}
返回;
}

公共无效startTimer()
{
如果(secondsPassed == 0)
{
timer.removeCallbacks(updateTimeElasped);
/ /告诉计时器运行1秒后回电话
timer.postDelayed(updateTimeElasped,1000);
}
}

公共无效stopTimer()
{
/ /禁止回调
timer.removeCallbacks(updateTimeElasped);
}

/ /定时器回调时,计时器滴答
私人的Runnable updateTimeElasped =新的Runnable()
{
公共无效的run()
{
= System.currentTimeMillis的()长currentMilliseconds;
+ + secondsPassed;

如果(secondsPassed“10)
{
txtTimer.setText(“00”+ Integer.toString(secondsPassed));
}
否则,如果(secondsPassed <100)
{
txtTimer.setText(“0”+ Integer.toString(secondsPassed));
}
其他
{
txtTimer.setText(Integer.toString(secondsPassed));
}

/ /添加通知
timer.postAtTime(这一点,currentMilliseconds);
/ /调用通知后1秒回
/ /基本上停留在计时器循环
timer.postDelayed(updateTimeElasped,1000);
}
};

私人无效的ShowDialog(字符串消息,诠释毫秒,布尔useSmileImage,布尔useCoolImage)
{
/ /显示消息
吐司对话框= Toast.makeText(
getApplicationContext()
消息
Toast.LENGTH_LONG);

dialog.setGravity(Gravity.CENTER,0,0);
LinearLayout中dialogView =(LinearLayout中)dialog.getView();
ImageView coolImage =新ImageView(getApplicationContext());
如果(useS

mileImage)
{
coolImage.setImageResource(R.drawable.smile);
}
否则,如果(useCoolImage)
{
coolImage.setImageResource(R.drawable.cool);
}
其他
{
coolImage.setImageResource(R.drawable.sad);
}
dialogView.addView(coolImage,0);
dialog.setDuration(毫秒);
dialog.show();
}
}

相关主题
文本预览
相关文档 最新文档