#java #android #algorithm #android-studio
#java #Android #алгоритм #android-студия
Вопрос:
Обзор: Пытаюсь сделать игру, похожую на крестики-нолики, но не работает с сеткой 3/3. Не могу понять, что не так с кодом. Пожалуйста, помогите.
Проблема: Сетка не составляет 3 линий для завершения игры. Проблема заключается в правильном построении логики.
Чего я хочу добиться: я хочу сделать сетку 3 на 3, чтобы показывать, когда игра завершается сообщением, что вы выиграли.
public class MainActivity extends AppCompatActivity {
// 0: yellow, 1: red, 2: empty
int[] gameState = { 2, 2, 2, 2, 2, 2, 2, 2, 2 };
int[][] winningPositions = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 },
{ 0, 4, 8 }, { 2, 4, 6 } };
int activePlayer = 0;
boolean gameActive = true;
public void dropIn(View view) {
ImageView counter = (ImageView) view;
int tappedCounter = Integer.parseInt(counter.getTag().toString());
if (gameState[tappedCounter] == 1 amp;amp; gameActive) {
gameState[tappedCounter] = activePlayer;
counter.setTranslationY(-1500);
if (activePlayer == 0) {
counter.setImageResource(R.drawable.yellow);
activePlayer = 1;
} else {
counter.setImageResource(R.drawable.red);
activePlayer = 0;
}
counter.animate().translationYBy(1500).rotation(3600).setDuration(300);
for (int[] winningPosition : winningPositions) {
if (gameState[winningPosition[0]] == gameState[winningPosition[1]]
amp;amp; gameState[winningPosition[1]] == gameState[winningPosition[2]]
amp;amp; gameState[winningPosition[0]] != 2) {
// Somone has won!
gameActive = false;
String winner = "";
if (activePlayer == 1) {
winner = "Yellow";
} else {
winner = "Red";
}
}
}
}
}
}
Ответ №1:
Ваша проверка состояния игры на цикл верна. Я думаю, что проблема заключается в правильной настройке массива GameState.
Ответ №2:
Решение
Предположим activity_main.xml
, здесь вы создаете экран для игры в крестики-нолики.
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@ id/winnerTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:textSize="24sp"
android:textStyle="bold"
android:visibility="gone" />
<GridLayout
android:id="@ id/gameBoard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp">
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="0"
android:layout_column="0"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:background="#FFF"
android:onClick="dropIn"
android:tag="0" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="0"
android:layout_column="1"
android:layout_marginEnd="10dp"
android:background="#FFF"
android:onClick="dropIn"
android:tag="1" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="0"
android:layout_column="2"
android:background="#FFF"
android:onClick="dropIn"
android:tag="2" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="1"
android:layout_column="0"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:background="#FFF"
android:onClick="dropIn"
android:tag="3" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="1"
android:layout_column="1"
android:layout_marginEnd="10dp"
android:background="#FFF"
android:onClick="dropIn"
android:tag="4" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="1"
android:layout_column="2"
android:background="#FFF"
android:onClick="dropIn"
android:tag="5" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="2"
android:layout_column="0"
android:layout_marginEnd="10dp"
android:background="#FFF"
android:onClick="dropIn"
android:tag="6" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="2"
android:layout_column="1"
android:layout_marginEnd="10dp"
android:background="#FFF"
android:onClick="dropIn"
android:tag="7" />
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_row="2"
android:layout_column="2"
android:background="#FFF"
android:onClick="dropIn"
android:tag="8" />
</GridLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="reset"
android:text="Reset" />
</LinearLayout>
Дизайн
MainActivity
public class MainActivity extends AppCompatActivity {
// 0: yellow, 1: red, 2: empty
int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2};
int[][] winningPositions = {
{0, 1, 2},
{3, 4, 5},
{6, 7, 8},
{0, 3, 6},
{1, 4, 7},
{2, 5, 8},
{0, 4, 8},
{2, 4, 6}};
int activePlayer = 0;
boolean gameActive = true;
private GridLayout gameBoard;
private TextView winnerTextView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gameBoard = findViewById(R.id.gameBoard);
winnerTextView = findViewById(R.id.winnerTextView);
}
public void dropIn(View view) {
ImageView counter = (ImageView) view;
int tappedCounter = Integer.parseInt(counter.getTag().toString());
if (gameActive) {
gameState[tappedCounter] = activePlayer;
counter.setTranslationY(-1500);
if (activePlayer == 0) {
counter.setImageResource(R.drawable.yellow);
activePlayer = 1;
} else {
counter.setImageResource(R.drawable.red);
activePlayer = 0;
}
counter.animate().translationYBy(1500).rotation(3600).setDuration(300);
for (int[] winningPosition : winningPositions) {
if (gameState[winningPosition[0]] == gameState[winningPosition[1]]
amp;amp; gameState[winningPosition[1]] == gameState[winningPosition[2]]
amp;amp; gameState[winningPosition[0]] != 2) {
// Someone has won!
gameActive = false;
String winner;
int color;
if (activePlayer == 1) {
winner = "Yellow";
color = Color.YELLOW;
} else {
winner = "Red";
color = Color.RED;
}
winnerTextView.setVisibility(View.VISIBLE);
winnerTextView.setTextColor(color);
winnerTextView.setText(winner " won!");
}
}
}
}
public void reset(View view) {
activePlayer = 0;
gameActive = true;
Arrays.fill(gameState, 2);
for (int i = 0; i < gameBoard.getChildCount(); i) {
ImageView cell = (ImageView) gameBoard.getChildAt(i);
cell.setImageDrawable(null);
}
winnerTextView.setVisibility(View.GONE);
winnerTextView.setText("");
}
}
Результат