Я пытаюсь сделать простую игру в крестики-нолики.Я уже написал логику для решения, кто выиграл, и текстовое поле отображает победителя.Как только кто-то выиграл, я делаю кнопку сброса видимой.И я установил атрибут onclick кнопки для сброса функции, который делает это
public void reset(View view){
for(int i=0;i<playerAt.length;i++)
playerAt[i]=2;
activeGame=1;
activePlayer=1;
Button but = (Button) findViewById(R.id.button);
TextView text = (TextView) findViewById(R.id.text);
but.setVisibility(View.INVISIBLE);
text.setVisibility(View.INVISIBLE);
GridLayout grid = (GridLayout) findViewById(R.id.grid);
for(int i=0;i<grid.getChildCount();i++){
ImageView block = (ImageView) grid.getChildAt(i);
block.setImageDrawable(null);
}
}
. Я исследовал способ обхода объектов сетки только на этом сайте, но, похоже, он не работает.Как только я нажимаю кнопку, приложение закрывается в эмуляторе.Если я удаляю цикл и вместо этого запускаю простой цикл, такой как
for(int i=0;i<9;i++)
, тогда он работает без сбоев, но, очевидно, он ничего не сделает.По сути, я хочу, чтобы кнопка сброса очистила все записи в сетке.У меня есть их изображения черных и красных точек, которые я хочу очистить.
Но таким образом я не могу это сделать.
Я также попробовал это без использования петли
ImageView block = (ImageView) grid.getChildAt(0);
block.setImageDrawable(null);
Но опять тот же результат: приложение закрывается, как только нажимается кнопка.Вероятно, дело обстоит не так в последней версии Android Studio. Если вы хотите посмотреть мой полный код в файле MainActivity.java, то вот он
package com.example.nik7.tictactoe;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.TextView;
import java.nio.InvalidMarkException;
public class MainActivity extends AppCompatActivity {
int activePlayer = 1;
int activeGame = 1;
int [][]winningP = {{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 []playerAt = {2,2,2,2,2,2,2,2,2};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void drop(View view){
ImageView block = (ImageView) view;
int currentPosition = Integer.parseInt(block.getTag().toString());
if(activeGame==0)
return;
if(playerAt[currentPosition]==1 || playerAt[currentPosition]==0)
return;
playerAt[currentPosition] = activePlayer;
if(activePlayer==1) {
block.setImageResource(R.drawable.black);
activePlayer = 0;
}
else{
block.setImageResource(R.drawable.red);
activePlayer=1;
}
//check if someone has won
for(int[] wp:winningP){
if(playerAt[wp[0]] == playerAt[wp[1]] && playerAt[wp[1]] == playerAt[wp[2]] && playerAt[wp[0]] != 2){
activeGame=0;
Button but = (Button) findViewById(R.id.button);
TextView text = (TextView) findViewById(R.id.text);
but.setVisibility(View.VISIBLE);
text.setVisibility(View.VISIBLE);
text.setText((activePlayer==1)?"red has won":"black has won");
}
}
}
public void reset(View view){
for(int i=0;i<playerAt.length;i++)
playerAt[i]=2;
activeGame=1;
activePlayer=1;
Button but = (Button) findViewById(R.id.button);
TextView text = (TextView) findViewById(R.id.text);
but.setVisibility(View.INVISIBLE);
text.setVisibility(View.INVISIBLE);
GridLayout grid = (GridLayout) findViewById(R.id.grid);
ImageView block = (ImageView) grid.getChildAt(0);
block.setImageDrawable(null);
}
}