#java #arrays #android-studio-2.2
#java #массивы #android-studio-2.2
Вопрос:
package com.example.sys.tictactoe2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Random;
public class GameBoard extends AppCompatActivity {
int c[][];
int i,j=0;
Button b[][];
Button newgame;
AI ai;
Human human;
TextView textView;
//Initiates the application
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_board);
setBoard();
randomMove();
}
// Random player moves first
public boolean randomMove(){
Random firstMove = new Random();
int player = firstMove.nextInt(2);
if (player == 1) {
textView.setText("You play first!");
human.humanTurn();
return true;
} else {
textView.setText("I play first!");
ai.aiTurn();
return false;
}
}
//Initiates the Game Board
public void setBoard(){
ai = new AI();
b = new Button[4][4];
c = new int[4][4];
newgame = (Button) findViewById(R.id.New);
newgame.setOnClickListener(new NewClickListener());
textView = (TextView) findViewById(R.id.message);
b[1][1] = (Button) findViewById(R.id.button1);
b[1][2] = (Button) findViewById(R.id.button2);
b[1][3] = (Button) findViewById(R.id.button3);
b[2][1] = (Button) findViewById(R.id.button4);
b[2][2] = (Button) findViewById(R.id.button5);
b[2][3] = (Button) findViewById(R.id.button6);
b[3][1] = (Button) findViewById(R.id.button7);
b[3][2] = (Button) findViewById(R.id.button8);
b[3][3] = (Button) findViewById(R.id.button9);
for (i=1; i<=3;i ){
for (j=1;j<=3;j )
c[i][j] = 2;
if (!b[i][j].isEnabled()) {
b[i][j].setText("");
b[i][j].setEnabled(true);
}
}
}
//If human plays first, class MyClickListener is initialized
public class Human {
private void humanTurn() {
for (i = 1; i <= 3; i ) {
for (j = 1; j <= 3; j ) {
b[i][j].setOnClickListener(new MyClickListener(i, j));
}
}
}
}
public class MyClickListener implements View.OnClickListener{
int x ;
int y;
private MyClickListener (int x, int y){
this.x = x;
this.y = y;
}
public void onClick(View View){
if (b[x][y].isEnabled()){
b[x][y].setEnabled(false);
b[x][y].setText("O");
c[x][y] = 0;
textView.setText("");
checkBoard();
if(!checkBoard()){
ai.aiTurn();
}
}
}
}
public class AI {
private void aiTurn(){
if(c[1][1]==2 amp;amp;
((c[1][2]==0 amp;amp; c[1][3]==0) ||
(c[2][2]==0 amp;amp; c[3][3]==0) ||
(c[2][1])==0 amp;amp; c[3][1]==0)){
markSquare(1,1);
} else if (c[1][2]==2 amp;amp;
((c[2][2]==0 amp;amp; c[3][2]==0) ||
(c[1][1]==0 amp;amp; c[1][3]==0))) {
markSquare(1,2);
} else if(c[1][3]==2 amp;amp;
((c[1][1]==0 amp;amp; c[1][2]==0) ||
(c[3][1]==0 amp;amp; c[2][2]==0) ||
(c[2][3]==0 amp;amp; c[3][3]==0))) {
markSquare(1,3);
} else if(c[2][1]==2 amp;amp;
((c[2][2]==0 amp;amp; c[2][3]==0) ||
(c[1][1]==0 amp;amp; c[3][1]==0))){
markSquare(2,1);
} else if(c[2][2]==2 amp;amp;
((c[1][1]==0 amp;amp; c[3][3]==0) ||
(c[1][2]==0 amp;amp; c[3][2]==0) ||
(c[3][1]==0 amp;amp; c[1][3]==0) ||
(c[2][1]==0 amp;amp; c[2][3]==0))) {
markSquare(2,2);
} else if(c[2][3]==2 amp;amp;
((c[2][1]==0 amp;amp; c[2][2]==0) ||
(c[1][3]==0 amp;amp; c[3][3]==0))) {
markSquare(2,3);
} else if(c[3][1]==2 amp;amp;
((c[1][1]==0 amp;amp; c[2][1]==0) ||
(c[3][2]==0 amp;amp; c[3][3]==0) ||
(c[2][2]==0 amp;amp; c[1][3]==0))){
markSquare(3,1);
} else if(c[3][2]==2 amp;amp;
((c[1][2]==0 amp;amp; c[2][2]==0) ||
(c[3][1]==0 amp;amp; c[3][3]==0))) {
markSquare(3,2);
} else if( c[3][3]==2 amp;amp;
((c[1][1]==0 amp;amp; c[2][2]==0) ||
(c[1][3]==0 amp;amp; c[2][3]==0) ||
(c[3][1]==0 amp;amp; c[3][2]==0))) {
markSquare(3, 3);
} else {
Random rand = new Random();
int a = rand.nextInt(4);
int b = rand.nextInt(4);
while (a==0 || b==0 || c[a][b]!=2) {
a = rand.nextInt(3);
b = rand.nextInt(3);
}
markSquare(a,b);
}
}
private void markSquare(int x, int y){
b[x][y].setEnabled(false);
b[x][y].setText("X");
c[x][y] = 1;
checkBoard();
if(!checkBoard()){
human.humanTurn();
}
}
}
//Check for the winner
public boolean checkBoard(){
boolean gameOver=false;
if ((c[1][1]==0 amp;amp; c[2][2]==0 amp;amp; c[3][3]==0) ||
(c[1][3]==0 amp;amp; c[2][2]==0 amp;amp; c[3][1]==0) ||
(c[1][2]==0 amp;amp; c[2][2]==0 amp;amp; c[3][2]==0) ||
(c[1][3]==0 amp;amp; c[2][3]==0 amp;amp; c[3][3]==0) ||
(c[1][1]==0 amp;amp; c[1][2]==0 amp;amp; c[1][3]==0) ||
(c[2][1]==0 amp;amp; c[2][2]==0 amp;amp; c[2][3]==0) ||
(c[3][1]==0 amp;amp; c[3][2]==0 amp;amp; c[3][3]==0) ||
(c[1][1]==0 amp;amp; c[2][1]==0 amp;amp; c[3][1]==0)){
textView.setText("Game over. You win!");
gameOver = true;
} else if ((c[1][1]==1 amp;amp; c[2][2]==1 amp;amp; c[3][3]==1) ||
(c[1][3]==1 amp;amp; c[2][2]==1 amp;amp; c[3][1]==1) ||
(c[1][2]==1 amp;amp; c[2][2]==1 amp;amp; c[3][2]==1) ||
(c[1][3]==1 amp;amp; c[2][3]==1 amp;amp; c[3][3]==1) ||
(c[1][1]==1 amp;amp; c[1][2]==1 amp;amp; c[1][3]==1) ||
(c[2][1]==1 amp;amp; c[2][2]==1 amp;amp; c[2][3]==1) ||
(c[3][1]==1 amp;amp; c[3][2]==1 amp;amp; c[3][3]==1) ||
(c[1][1]==1 amp;amp; c[2][1]==1 amp;amp; c[3][1]==1)){
textView.setText("Game over. You lost!");
gameOver = true;
} else {
boolean empty = false;
for (i=1; i<=3; i ) {
for (j = 1; j <= 3; j ) {
if (c[i][j] == 2) {
empty = true;
break;
}
}
}
if(!empty){
gameOver=true;
textView.setText("Game over. It's a draw!");
}
}
return gameOver;
}
//New Button resets the game
class NewClickListener implements View.OnClickListener{
private NewClickListener(){
}
@Override
public void onClick(View v) {
setBoard();
textView.setText("");
}
}
}
Это мой файл MainActivity в Android Studio (реорганизуется как игровая панель). Я пытаюсь создать игру в крестики-нолики. Когда я пытаюсь запустить это приложение на своем устройстве Android, оно выходит из строя с сообщением «К сожалению, приложение остановлено».
Согласно моему поиску, я попытался удалить кеш на устройстве и перестроить проект Android. Консоль вообще не показывает никаких ошибок. Это должна быть какая-то логическая ошибка. Пожалуйста, дайте мне знать, где я делаю неправильно. Кроме того, может кто-нибудь подсказать мне в целом, как найти логические ошибки?
Комментарии:
1. Либо научитесь использовать отладчик, либо добавьте некоторое ведение журнала, чтобы вы могли сузить область сбоя — где-то между последним сообщением, которое вышло, и следующим, которое не вышло
2. «Кроме того, может кто-нибудь предложить мне в целом, как найти логические ошибки?» ДА. Используйте встроенный отладчик IDE и пошагово просматривайте код. Сравните ожидания с реальностью.
Ответ №1:
Нам действительно нужно больше информации. Я бы начал с показа нам файла макета. Ошибка может быть там. Или ошибка может быть в одном из двух методов:
- setBoard ();
- randomMove();
Возможно, ошибка возникает в randomMove() при вызове human.humanMove() . Вы еще не присвоили значение человеческому объекту, и, следовательно, оно равно нулю.
Я рекомендую:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_board);
human = new Human();
setBoard();
randomMove();
}
Хотя я думаю, что setBoard () не выдаст фатальную ошибку, я вижу, что вы привыкли к индексации на основе ненулевого значения. Ваши массивы имеют размер от 1 элемента до большого. например, вы должны объявить массив из трех элементов следующим образом:
b = new Button[3][3];
и получить доступ ко всем элементам, подобным этому:
b[0][0] = ...;
b[0][1] = ...;
b[0][2] = ...;
b[1][0] = ...;
таким образом, вы можете видеть, что индекс 2 на самом деле является третьим элементом.
Я также предлагаю вам создать общий класс Player и позволить AI и Human наследовать от него — это облегчит вам обеспечение того, чтобы оба игрока вели себя по одним и тем же правилам, вместо того, чтобы реализовывать правила дважды каждый раз, когда вы вводите новый.