我正在学习Android应用程序编码,并且认为对TicTacToe进行编码将是一个不错的主意。因此,我在一个活动中获得了六个线性排列的按钮,这些按钮在被点击时会改变颜色,具体取决于玩家的回合(橙色或蓝色)。 onClickListener的onClick方法如下:
public void onClick(View v)
{
if(player == 1)
{
((Button)v).setBackgroundColor(getResources().getColor(android.R.color.holo_orange_dark));
}
else
{
((Button)v).setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));
}
gameControl();
}
gameControl遵循游戏基本知识:检查玩家是否获胜,是否平局等:
public void gameControl()
if(checkForWin())
{
playerWins(player);
}
else if(round == 9)
{
draw();
}
else
{
if(player == 1)
player = 2;
else
player = 1;
}
round++;
}
我的问题是,如果玩家获胜,即单击赢得游戏的最后一个按钮,则按钮的颜色不会改变。而是,playerWins方法(在gameControl中)在按钮颜色更改之前刷新“游戏场”。我已经尝试过诸如Handler.postDelayed之类的东西,因为似乎在解决按钮颜色之前,整个onClick方法都已运行完了,但是在那里没有成功。为什么onClick方法不能线性处理?有什么方法可以刷新活动吗?预先感谢...
感谢您的快速回复,以下是请求的方法:
private void playerWins(int player)
{
if(player == 1)
{
player1Points++;
Toast.makeText(this,"Player 1 wins!", Toast.LENGTH_SHORT).show();
updatePointsText();
resetBoard();
round = 1;
}
if(player == 2)
{
player2Points++;
Toast.makeText(this,"Player 2 wins!", Toast.LENGTH_SHORT).show();
updatePointsText();
resetBoard();
round = 1;
}
}
resetBoard方法:
private void resetBoard()
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
buttons[i][j].setBackgroundColor(Color.parseColor("#B0C4DE"));
}
}
}
答案 0 :(得分:0)
是的,我猜想它正在迅速发生,这就是为什么您没有看到它。您有一些方法:
1-将刷新按钮放在某个位置,仅在单击该按钮时刷新(例如,如果用户知道这将是抽签,并且他们希望在完成之前再次开始,则此选项会很好)。因此,使用此选项,您将不会在用户看到更新之前重置。
2-显示一个AlertDialog,说“玩家X获胜!”当用户按“确定”时,将板复位。就像
AlertDialog dialog = AlertDialog.Builder(context);
dialog.setTitle("Your title");
dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
resetBoard()
}
});
dialog.setCancellable(false);
dialog.show();
也请检查一下,您在重复代码时可以减少一些代码重构。例如playerWins()可能是
private void playerWins(int player){
if(player == 1)
{
player1Points++;
Toast.makeText(this,"Player 1 wins!", Toast.LENGTH_SHORT).show();
}
if(player == 2)
{
player2Points++;
Toast.makeText(this,"Player 2 wins!", Toast.LENGTH_SHORT).show();
}
updatePointsText();
resetBoard();
round = 1;
}