问题描述
所以我有一个错误,无论何时单击左上角的正方形,无论是在游戏开始时,中间还是在任何时候,我总是会收到游戏的抽奖消息,并且可以继续玩游戏。
除此之外,该游戏运行正常。我尝试创建不同的逻辑,但似乎并不能控制该错误。有人可以告诉我我错了吗?我会附上我的代码。
import androidx.appcompat.app.AppCompatActivity;
import android.media.Image;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity {
int activePlayer = 0; //0 = Yellow; 1 = Red
boolean gameIsActive = true;
int[] gameState = {2,2,2}; // 2 = unplayed.
int[][] winningPositions = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,7},{2,5,6}};
public void dropIn(View view) {
ImageView counter = (ImageView) view;
int tappedCounter = Integer.parseInt(counter.getTag().toString());
if (gameState[tappedCounter] == 2 && gameIsActive) {
gameState[tappedCounter] = activePlayer;
counter.setTranslationY(-1500f);
if (activePlayer == 0) {
counter.setimageResource(R.drawable.yellow);
activePlayer = 1;
} else {
counter.setimageResource(R.drawable.red);
activePlayer = 0;
}
counter.animate().translationYBy(1500f).rotation(360).setDuration(600);
for (int[] winningPosition : winningPositions){
System.out.println(Arrays.toString(gameState));
if (gameState[winningPosition[0]] == gameState[winningPosition[1]] &&
gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
gameState[winningPosition[0]] != 2){
//Someone has won
gameIsActive = false;
String winner = "Red";
if (gameState[winningPosition[0]] == 0){
winner = "Yellow";
}
TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
winnerMessage.setText(winner + " has won!");
final LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
layout.setVisibility(View.VISIBLE);
}
// there is a draw
else {
boolean gameIsOver = true;
for (int counterState : gameState) {
if (counterState == 2)
gameIsOver = false;
if(gameIsOver){
TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
winnerMessage.setText("It's a draw. ");
final LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
layout.setVisibility(View.VISIBLE);
}
}
}
}
}
}
public void playAgain(View view){
gameIsActive = true;
LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
layout.setVisibility(View.INVISIBLE);
activePlayer = 0; //0 = Yellow; 1 = Red
for (int i = 0; i < gameState.length; i++){
gameState[i] = 2;
}
androidx.gridlayout.widget.GridLayout gridLayout = findViewById(R.id.gridLayout);
for (int i = 0; i < gridLayout.getChildCount(); i++){
((ImageView) gridLayout.getChildAt(i)).setimageResource(0);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
解决方法
您的问题在这里,如果有2个元素(您未玩的位置),则需要循环 并在循环中设置布尔值。之后,跳出循环并检查是否应该平局。您的问题是您将其包含在循环中。解决方法如下:
boolean gameIsOver = true;
// check if the board contains any unplayed positions
for (int counterState : gameState) {
if (counterState == 2) {
gameIsOver = false;
}
}
// and then check if it's a draw
if (gameIsOver) {
TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
winnerMessage.setText("It's a draw. ");
final LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
layout.setVisibility(View.VISIBLE);
}