Sunteți pe pagina 1din 26

MainActivity.

java
package com.indie_an.tictactoe;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener {

public Button button1, button2, button3, button4, button5, button6,


button7, button8, button9, start, reset;
public RadioButton naught, cross;
public TextView text;
public ComputerLogic logic; // For when not using minimax
public PerfectComputerLogic perfectLogic; // For when using minimax
public Menu menu;
public MenuItem item;

public boolean playerTurn = false;


public boolean playerWon = false;
public boolean computerWon = false;
public boolean draw = false;
public boolean winnable = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initViews();
logic = new ComputerLogic();
perfectLogic = new PerfectComputerLogic();
}

private void initViews() {


button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button4 = (Button) findViewById(R.id.button4);
button5 = (Button) findViewById(R.id.button5);
button6 = (Button) findViewById(R.id.button6);
button7 = (Button) findViewById(R.id.button7);
button8 = (Button) findViewById(R.id.button8);
button9 = (Button) findViewById(R.id.button9);
start = (Button) findViewById(R.id.start);
reset = (Button) findViewById(R.id.reset);

naught = (RadioButton) findViewById(R.id.naught);


cross = (RadioButton) findViewById(R.id.cross);

text = (TextView) findViewById(R.id.text);

button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
button5.setOnClickListener(this);
button6.setOnClickListener(this);
button7.setOnClickListener(this);
button8.setOnClickListener(this);
button9.setOnClickListener(this);
start.setOnClickListener(this);
reset.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
this.menu = menu;
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

if(id == R.id.winnable) {
item.setChecked(!item.isChecked());
winnable = item.isChecked();
}

return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start:
// Make the menu item and views required to start the game invisible
item = menu.findItem(R.id.winnable);
item.setVisible(false);
start.setVisibility(View.INVISIBLE);
naught.setVisibility(View.INVISIBLE);
cross.setVisibility(View.INVISIBLE);
if(cross.isChecked()) {
playerTurn = true;
text.setText("Player's turn");
} else if(naught.isChecked()) {
playerTurn = false;
text.setText("Computer's turn");
logic.nextMove(this); // Place the first move in the center
}

break;
case R.id.reset:
// Make all the invisible views visible again
item = menu.findItem(R.id.winnable);
item.setVisible(true);
start.setVisibility(View.VISIBLE);
naught.setVisibility(View.VISIBLE);
cross.setVisibility(View.VISIBLE);
text.setText("");
playerTurn = false;
playerWon = false;
computerWon = false;
draw = false;

button1.setText("");
button2.setText("");
button3.setText("");
button4.setText("");
button5.setText("");
button6.setText("");
button7.setText("");
button8.setText("");
button9.setText("");
break;
default:
if(start.getVisibility() == View.VISIBLE)
break; // If a button is pressed without starting the game
placeObject(v.getId());
if(winnable)
logic.nextMove(this); // Don't use minimax
else
perfectLogic.nextMove(this); // Use minimax
}
}

public void placeObject(int id) {


Button button = (Button) findViewById(id);
if(!button.getText().equals(""))
return;

if(cross.isChecked() && playerTurn)


button.setText("X");
else if(naught.isChecked() && playerTurn)
button.setText("O");

check(); // check if the game is over


if(playerWon && !draw)
text.setText("Player Won!");
else if(computerWon && !draw)
text.setText("Computer Won!");
else if(draw)
text.setText("It's a draw!");
else
changeTurn();
}

public void changeTurn() {


playerTurn = !playerTurn;
if(playerTurn)
text.setText("Player's Turn");
else
text.setText("Computer's Turn");
}

public void check() {


if (crossHorizontal() || crossVertical() || crossDiagonal()) {
if(cross.isChecked())
playerWon = true;
else
computerWon = true;
} else if (naughtsHorizontal() || naughtsVertical()
|| naughtsDiagonal()) {
if(naught.isChecked())
playerWon = true;
else
computerWon = true;
} else if(full() && !playerWon && !computerWon)
draw = true;
}

public boolean full(){


return !button1.getText().equals("")
&& !button2.getText().equals("")
&& !button3.getText().equals("")
&& !button4.getText().equals("")
&& !button5.getText().equals("")
&& !button6.getText().equals("")
&& !button7.getText().equals("")
&& !button8.getText().equals("")
&& !button9.getText().equals("");
}

public boolean isEmpty() {


return button1.getText().equals("")
&& button2.getText().equals("")
&& button3.getText().equals("")
&& button4.getText().equals("")
&& button5.getText().equals("")
&& button6.getText().equals("")
&& button7.getText().equals("")
&& button8.getText().equals("")
&& button9.getText().equals("");
}

public boolean crossHorizontal() {


return (button1.getText().equals("X") && button2.getText().equals("X") &&
button3.getText().equals("X")) ||
(button4.getText().equals("X") && button5.getText().equals("X") &&
button6.getText().equals("X")) ||
(button7.getText().equals("X") && button8.getText().equals("X") &&
button9.getText().equals("X"));
}

public boolean naughtsHorizontal() {


return (button1.getText().equals("O") && button2.getText().equals("O") &&
button3.getText().equals("O")) ||
(button4.getText().equals("O") && button5.getText().equals("O") &&
button6.getText().equals("O")) ||
(button7.getText().equals("O") && button8.getText().equals("O") &&
button9.getText().equals("O"));
}

public boolean crossVertical() {


return (button1.getText().equals("X") && button4.getText().equals("X") &&
button7.getText().equals("X")) ||
(button2.getText().equals("X") && button5.getText().equals("X") &&
button8.getText().equals("X")) ||
(button3.getText().equals("X") && button6.getText().equals("X") &&
button9.getText().equals("X"));
}

public boolean naughtsVertical() {


return (button1.getText().equals("O") && button4.getText().equals("O") &&
button7.getText().equals("O")) ||
(button2.getText().equals("O") && button5.getText().equals("O") &&
button8.getText().equals("O")) ||
(button3.getText().equals("O") && button6.getText().equals("O") &&
button9.getText().equals("O"));
}

public boolean crossDiagonal() {


return (button1.getText().equals("X") && button5.getText().equals("X") &&
button9.getText().equals("X")) ||
(button3.getText().equals("X") && button5.getText().equals("X") &&
button7.getText().equals("X"));
}

public boolean naughtsDiagonal() {


return (button1.getText().equals("O") && button5.getText().equals("O") &&
button9.getText().equals("O")) ||
(button3.getText().equals("O") && button5.getText().equals("O") &&
button7.getText().equals("O"));
}
}
ComputerLogic.java

package com.indie_an.tictactoe;

import android.os.Handler;

import java.util.Random;

public class ComputerLogic {

private MainActivity board;


private boolean computerFirst = false;
private boolean movePlayed = false; // Check to see if the computer played it's
move

public void nextMove(final MainActivity board) {


computerFirst = !board.cross.isChecked() && board.isEmpty(); // is Computer
going first
this.board = board;

if(board.playerTurn)
return;

Handler handler = new Handler(); // Give a delay of 1 second to make it look


realistic
handler.postDelayed(new Runnable() {
@Override
public void run() {
movePlayed = false;
if (computerFirst && board.button5.getText().equals("")) {
board.button5.setText("X"); // Place the move in the center
movePlayed = true;
} else if(!computerFirst) {
if(!movePlayed) win(); // First priority goes to winning
if(!movePlayed) defend(); // Second priority goes to preventing
player from winning
if(!movePlayed) randomMove(); // Make a random move
}

if(movePlayed) {
board.check();
if (board.playerWon && !board.draw)
board.text.setText("Player Won!");
else if (board.computerWon && !board.draw)
board.text.setText("Computer Won!");
else if (board.draw)
board.text.setText("It's a draw!");
else
board.changeTurn();
}
}
}, 1000);

private void defend() {


if(board.cross.isChecked()) {
if(board.button1.getText().equals("X") &&
board.button2.getText().equals("X") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("O");
movePlayed = true;
} else if(board.button3.getText().equals("X") &&
board.button2.getText().equals("X") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("O");
movePlayed = true;
} else if(board.button1.getText().equals("X") &&
board.button3.getText().equals("X") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("O");
movePlayed = true;
}
else if(board.button4.getText().equals("X") &&
board.button5.getText().equals("X") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("O");
movePlayed = true;
} else if(board.button6.getText().equals("X") &&
board.button5.getText().equals("X") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("O");
movePlayed = true;
} else if(board.button4.getText().equals("X") &&
board.button6.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
else if(board.button7.getText().equals("X") &&
board.button8.getText().equals("X") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("O");
movePlayed = true;
} else if(board.button9.getText().equals("X") &&
board.button8.getText().equals("X") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("O");
movePlayed = true;
} else if(board.button7.getText().equals("X") &&
board.button9.getText().equals("X") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("O");
movePlayed = true;
}
else if(board.button1.getText().equals("X") &&
board.button4.getText().equals("X") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("O");
movePlayed = true;
} else if(board.button7.getText().equals("X") &&
board.button4.getText().equals("X") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("O");
movePlayed = true;
} else if(board.button1.getText().equals("X") &&
board.button7.getText().equals("X") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("O");
movePlayed = true;
}
else if(board.button2.getText().equals("X") &&
board.button5.getText().equals("X") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("O");
movePlayed = true;
} else if(board.button8.getText().equals("X") &&
board.button5.getText().equals("X") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("O");
movePlayed = true;
} else if(board.button2.getText().equals("X") &&
board.button8.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
else if(board.button3.getText().equals("X") &&
board.button6.getText().equals("X") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("O");
movePlayed = true;
} else if(board.button9.getText().equals("X") &&
board.button6.getText().equals("X") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("O");
movePlayed = true;
} else if(board.button3.getText().equals("X") &&
board.button9.getText().equals("X") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("O");
movePlayed = true;
}
else if(board.button1.getText().equals("X") &&
board.button5.getText().equals("X") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("O");
movePlayed = true;
} else if(board.button9.getText().equals("X") &&
board.button5.getText().equals("X") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("O");
movePlayed = true;
} else if(board.button1.getText().equals("X") &&
board.button9.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
else if(board.button3.getText().equals("X") &&
board.button5.getText().equals("X") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("O");
movePlayed = true;
} else if(board.button7.getText().equals("X") &&
board.button5.getText().equals("X") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("O");
movePlayed = true;
} else if(board.button3.getText().equals("X") &&
board.button7.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
} else if(board.naught.isChecked()) {
if(board.button1.getText().equals("O") &&
board.button2.getText().equals("O") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("X");
movePlayed = true;
} else if(board.button3.getText().equals("O") &&
board.button2.getText().equals("O") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("X");
movePlayed = true;
} else if(board.button1.getText().equals("O") &&
board.button3.getText().equals("O") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("X");
movePlayed = true;
}
else if(board.button4.getText().equals("O") &&
board.button5.getText().equals("O") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("X");
movePlayed = true;
} else if(board.button6.getText().equals("O") &&
board.button5.getText().equals("O") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("X");
movePlayed = true;
} else if(board.button4.getText().equals("O") &&
board.button6.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
else if(board.button7.getText().equals("O") &&
board.button8.getText().equals("O") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("X");
movePlayed = true;
} else if(board.button9.getText().equals("O") &&
board.button8.getText().equals("O") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("X");
movePlayed = true;
} else if(board.button7.getText().equals("O") &&
board.button9.getText().equals("O") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("X");
movePlayed = true;
}
else if(board.button1.getText().equals("O") &&
board.button4.getText().equals("O") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("X");
movePlayed = true;
} else if(board.button7.getText().equals("O") &&
board.button4.getText().equals("O") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("X");
movePlayed = true;
} else if(board.button1.getText().equals("O") &&
board.button7.getText().equals("O") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("X");
movePlayed = true;
}
else if(board.button2.getText().equals("O") &&
board.button5.getText().equals("O") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("X");
movePlayed = true;
} else if(board.button8.getText().equals("O") &&
board.button5.getText().equals("O") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("X");
movePlayed = true;
} else if(board.button2.getText().equals("O") &&
board.button8.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
else if(board.button3.getText().equals("O") &&
board.button6.getText().equals("O") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("X");
movePlayed = true;
} else if(board.button9.getText().equals("O") &&
board.button6.getText().equals("O") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("X");
movePlayed = true;
} else if(board.button3.getText().equals("O") &&
board.button9.getText().equals("O") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("X");
movePlayed = true;
}
else if(board.button1.getText().equals("O") &&
board.button5.getText().equals("O") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("X");
movePlayed = true;
} else if(board.button9.getText().equals("O") &&
board.button5.getText().equals("O") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("X");
movePlayed = true;
} else if(board.button1.getText().equals("O") &&
board.button9.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
else if(board.button3.getText().equals("O") &&
board.button5.getText().equals("O") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("X");
movePlayed = true;
} else if(board.button7.getText().equals("O") &&
board.button5.getText().equals("O") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("X");
movePlayed = true;
} else if(board.button3.getText().equals("O") &&
board.button7.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
}
}

private void win() {


if(board.cross.isChecked()) {
if(board.button1.getText().equals("O") &&
board.button2.getText().equals("O") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("O");
movePlayed = true;
} else if(board.button3.getText().equals("O") &&
board.button2.getText().equals("O") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("O");
movePlayed = true;
} else if(board.button1.getText().equals("O") &&
board.button3.getText().equals("O") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("O");
movePlayed = true;
}
else if(board.button4.getText().equals("O") &&
board.button5.getText().equals("O") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("O");
movePlayed = true;
} else if(board.button6.getText().equals("O") &&
board.button5.getText().equals("O") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("O");
movePlayed = true;
} else if(board.button4.getText().equals("O") &&
board.button6.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
else if(board.button7.getText().equals("O") &&
board.button8.getText().equals("O") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("O");
movePlayed = true;
} else if(board.button9.getText().equals("O") &&
board.button8.getText().equals("O") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("O");
movePlayed = true;
} else if(board.button7.getText().equals("O") &&
board.button9.getText().equals("O") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("O");
movePlayed = true;
}
else if(board.button1.getText().equals("O") &&
board.button4.getText().equals("O") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("O");
movePlayed = true;
} else if(board.button7.getText().equals("O") &&
board.button4.getText().equals("O") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("O");
movePlayed = true;
} else if(board.button1.getText().equals("O") &&
board.button7.getText().equals("O") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("O");
movePlayed = true;
}
else if(board.button2.getText().equals("O") &&
board.button5.getText().equals("O") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("O");
movePlayed = true;
} else if(board.button8.getText().equals("O") &&
board.button5.getText().equals("O") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("O");
movePlayed = true;
} else if(board.button2.getText().equals("O") &&
board.button8.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
else if(board.button3.getText().equals("O") &&
board.button6.getText().equals("O") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("O");
movePlayed = true;
} else if(board.button9.getText().equals("O") &&
board.button6.getText().equals("O") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("O");
movePlayed = true;
} else if(board.button3.getText().equals("O") &&
board.button9.getText().equals("O") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("O");
movePlayed = true;
}
else if(board.button1.getText().equals("O") &&
board.button5.getText().equals("O") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("O");
movePlayed = true;
} else if(board.button9.getText().equals("O") &&
board.button5.getText().equals("O") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("O");
movePlayed = true;
} else if(board.button1.getText().equals("O") &&
board.button9.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}
else if(board.button3.getText().equals("O") &&
board.button5.getText().equals("O") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("O");
movePlayed = true;
} else if(board.button7.getText().equals("O") &&
board.button5.getText().equals("O") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("O");
movePlayed = true;
} else if(board.button3.getText().equals("O") &&
board.button7.getText().equals("O") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("O");
movePlayed = true;
}

} else if(board.naught.isChecked()) {
if(board.button1.getText().equals("X") &&
board.button2.getText().equals("X") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("X");
movePlayed = true;
} else if(board.button3.getText().equals("X") &&
board.button2.getText().equals("X") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("X");
movePlayed = true;
} else if(board.button1.getText().equals("X") &&
board.button3.getText().equals("X") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("X");
movePlayed = true;
}
else if(board.button4.getText().equals("X") &&
board.button5.getText().equals("X") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("X");
movePlayed = true;
} else if(board.button6.getText().equals("X") &&
board.button5.getText().equals("X") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("X");
movePlayed = true;
} else if(board.button4.getText().equals("X") &&
board.button6.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
else if(board.button7.getText().equals("X") &&
board.button8.getText().equals("X") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("X");
movePlayed = true;
} else if(board.button9.getText().equals("X") &&
board.button8.getText().equals("X") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("X");
movePlayed = true;
} else if(board.button7.getText().equals("X") &&
board.button9.getText().equals("X") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("X");
movePlayed = true;
}
else if(board.button1.getText().equals("X") &&
board.button4.getText().equals("X") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("X");
movePlayed = true;
} else if(board.button7.getText().equals("X") &&
board.button4.getText().equals("X") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("X");
movePlayed = true;
} else if(board.button1.getText().equals("X") &&
board.button7.getText().equals("X") && board.button4.getText().equals("") &&
!board.playerTurn) {
board.button4.setText("X");
movePlayed = true;
}
else if(board.button2.getText().equals("X") &&
board.button5.getText().equals("X") && board.button8.getText().equals("") &&
!board.playerTurn) {
board.button8.setText("X");
movePlayed = true;
} else if(board.button8.getText().equals("X") &&
board.button5.getText().equals("X") && board.button2.getText().equals("") &&
!board.playerTurn) {
board.button2.setText("X");
movePlayed = true;
} else if(board.button2.getText().equals("X") &&
board.button8.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
else if(board.button3.getText().equals("X") &&
board.button6.getText().equals("X") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("X");
movePlayed = true;
} else if(board.button9.getText().equals("X") &&
board.button6.getText().equals("X") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("X");
movePlayed = true;
} else if(board.button3.getText().equals("X") &&
board.button9.getText().equals("X") && board.button6.getText().equals("") &&
!board.playerTurn) {
board.button6.setText("X");
movePlayed = true;
}
else if(board.button1.getText().equals("X") &&
board.button5.getText().equals("X") && board.button9.getText().equals("") &&
!board.playerTurn) {
board.button9.setText("X");
movePlayed = true;
} else if(board.button9.getText().equals("X") &&
board.button5.getText().equals("X") && board.button1.getText().equals("") &&
!board.playerTurn) {
board.button1.setText("X");
movePlayed = true;
} else if(board.button1.getText().equals("X") &&
board.button9.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
else if(board.button3.getText().equals("X") &&
board.button5.getText().equals("X") && board.button7.getText().equals("") &&
!board.playerTurn) {
board.button7.setText("X");
movePlayed = true;
} else if(board.button7.getText().equals("X") &&
board.button5.getText().equals("X") && board.button3.getText().equals("") &&
!board.playerTurn) {
board.button3.setText("X");
movePlayed = true;
} else if(board.button3.getText().equals("X") &&
board.button7.getText().equals("X") && board.button5.getText().equals("") &&
!board.playerTurn) {
board.button5.setText("X");
movePlayed = true;
}
}
}

private void randomMove() {


Random r = new Random();

while (!movePlayed) {
switch (r.nextInt(9)) {
case 0:
if(board.button1.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button1.setText("O");
else
board.button1.setText("X");

movePlayed = true;
}
break;
case 1:
if(board.button2.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button2.setText("O");
else
board.button2.setText("X");

movePlayed = true;
}
break;
case 2:
if(board.button3.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button3.setText("O");
else
board.button3.setText("X");

movePlayed = true;
}
break;
case 3:
if(board.button4.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button4.setText("O");
else
board.button4.setText("X");

movePlayed = true;
}
break;
case 4:
if(board.button5.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button5.setText("O");
else
board.button5.setText("X");

movePlayed = true;
}
break;
case 5:
if(board.button6.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button6.setText("O");
else
board.button6.setText("X");

movePlayed = true;
}
break;
case 6:
if(board.button7.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button7.setText("O");
else
board.button7.setText("X");

movePlayed = true;
}
break;
case 7:
if(board.button8.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button8.setText("O");
else
board.button8.setText("X");

movePlayed = true;
}
break;
case 8:
if(board.button9.getText().equals("") && !board.playerTurn) {
if(board.cross.isChecked())
board.button9.setText("O");
else
board.button9.setText("X");

movePlayed = true;
}
break;
}
}
}
}
PerfectComputerLogic.java
package com.indie_an.tictactoe;

import android.os.Handler;

import java.util.ArrayList;

public class PerfectComputerLogic {

private MainActivity board;


private String[] textBoard = new String[9]; // The state of the board in text form
private static String max; // The piece computer is controlling(X or O)
private static String min; // The piece player is controlling(X or O)
private String level; // Current level of operation (Max or Min)

public void nextMove(final MainActivity board) {


this.board = board;

if(board.playerTurn)
return;

if(board.naught.isChecked()) {
max = "X";
min = "O";
} else {
max = "O";
min = "X";
}
level = "max";

Handler handler = new Handler(); // Create a time delay of 1 second to make it


realistic
handler.postDelayed(new Runnable() {
@Override
public void run() {
setTextBoard(); // Convert the current board state in text format
ResultMM bestMove = minimax(textBoard, level, 0, 0); // (textBoard,
level, recurse, depth)
applyTextBoard(bestMove.matrix); // Apply the text board to the actual
view
board.check();
if (board.playerWon && !board.draw)
board.text.setText("Player Won!");
else if (board.computerWon && !board.draw)
board.text.setText("Computer Won!");
else if (board.draw)
board.text.setText("It's a draw!");
else
board.changeTurn();
}
}, 1000);
}

private ResultMM getResult(ArrayList<ResultMM> listScore, String level) {


ResultMM result = listScore.get(0);

if(level.equals("max")) {
for(int i = 1; i < listScore.size(); i++) {
if((listScore.get(i).getScore() > result.getScore()) ||
(listScore.get(i).getScore() == result.getScore()
&& listScore.get(i).depth < result.depth))
result = listScore.get(i);
}
} else {
for(int i = 1; i < listScore.size(); i++) {
if((listScore.get(i).getScore() < result.getScore()) ||
(listScore.get(i).getScore() == result.getScore()
&& listScore.get(i).depth < result.depth))
result = listScore.get(i);
}
}

return result;
}

private ResultMM minimax(String[] textBoard, String level, int recurse, int depth)
{
ArrayList<String[]> children = generateSuccessor(textBoard, level); // Get
list of all possible moves

if(children == null || gameOver(textBoard)) {


return new ResultMM(textBoard, getScore(textBoard), depth); // if no
children or game over
} else {
ArrayList<ResultMM> listScore = new ArrayList<>(); // Get a list of scores
for all available children
for(int i = 0; i < children.size(); i++) {
listScore.add(minimax(children.get(i), invertLevel(level), 1, depth +
1)); // recursive call

// with recurse = 1 and depth + 1


}

ResultMM res = getResult(listScore, level); // Get the child


// with maximum (for max
condition) or minimum (for min condition) score
if(recurse == 1)
res.setMatrix(textBoard); // If this is a recursive call, set the
result
return res;
}
}

private ArrayList<String[]> generateSuccessor(String[] textBoard, String level) {


ArrayList<String[]> successor = new ArrayList<>();

for(int i = 0; i < textBoard.length; i++) {


if(textBoard[i].equals("")) {
String[] child = new String[9];
System.arraycopy(textBoard, 0, child, 0, 9); // First match the child
with the parent board state

if(level.equals("max"))
child[i] = max;
else if(level.equals("min"))
child[i] = min;

successor.add(child);
}
}

return (successor.size() == 0) ? null : successor;


}
private String invertLevel(String level) {
return (level.equals("max")) ? "min" : "max"; // If the level is max, set to
min and vice-versa
}

private boolean gameOver(String[] textBoard) {


return (getScore(textBoard) != 0); // Is the game over (is the score not 0)
}

// Return +1 when the computer wins, -1 when the computer loses and 0 otherwise
private int getScore(String[] textBoard) {
if(max.equals("O")) {
if((textBoard[0].equals("X") && textBoard[1].equals("X") &&
textBoard[2].equals("X")) ||
(textBoard[3].equals("X") && textBoard[4].equals("X") &&
textBoard[5].equals("X")) ||
(textBoard[6].equals("X") && textBoard[7].equals("X") &&
textBoard[8].equals("X")) ||
(textBoard[0].equals("X") && textBoard[3].equals("X") &&
textBoard[6].equals("X")) ||
(textBoard[1].equals("X") && textBoard[4].equals("X") &&
textBoard[7].equals("X")) ||
(textBoard[2].equals("X") && textBoard[5].equals("X") &&
textBoard[8].equals("X")) ||
(textBoard[0].equals("X") && textBoard[4].equals("X") &&
textBoard[8].equals("X")) ||
(textBoard[2].equals("X") && textBoard[4].equals("X") &&
textBoard[6].equals("X")))
return -1;
else if((textBoard[0].equals("O") && textBoard[1].equals("O") &&
textBoard[2].equals("O")) ||
(textBoard[3].equals("O") && textBoard[4].equals("O") &&
textBoard[5].equals("O")) ||
(textBoard[6].equals("O") && textBoard[7].equals("O") &&
textBoard[8].equals("O")) ||
(textBoard[0].equals("O") && textBoard[3].equals("O") &&
textBoard[6].equals("O")) ||
(textBoard[1].equals("O") && textBoard[4].equals("O") &&
textBoard[7].equals("O")) ||
(textBoard[2].equals("O") && textBoard[5].equals("O") &&
textBoard[8].equals("O")) ||
(textBoard[0].equals("O") && textBoard[4].equals("O") &&
textBoard[8].equals("O")) ||
(textBoard[2].equals("O") && textBoard[4].equals("O") &&
textBoard[6].equals("O")))
return 1;
} else if(max.equals("X")) {
if((textBoard[0].equals("X") && textBoard[1].equals("X") &&
textBoard[2].equals("X")) ||
(textBoard[3].equals("X") && textBoard[4].equals("X") &&
textBoard[5].equals("X")) ||
(textBoard[6].equals("X") && textBoard[7].equals("X") &&
textBoard[8].equals("X")) ||
(textBoard[0].equals("X") && textBoard[3].equals("X") &&
textBoard[6].equals("X")) ||
(textBoard[1].equals("X") && textBoard[4].equals("X") &&
textBoard[7].equals("X")) ||
(textBoard[2].equals("X") && textBoard[5].equals("X") &&
textBoard[8].equals("X")) ||
(textBoard[0].equals("X") && textBoard[4].equals("X") &&
textBoard[8].equals("X")) ||
(textBoard[2].equals("X") && textBoard[4].equals("X") &&
textBoard[6].equals("X")))
return 1;
else if((textBoard[0].equals("O") && textBoard[1].equals("O") &&
textBoard[2].equals("O")) ||
(textBoard[3].equals("O") && textBoard[4].equals("O") &&
textBoard[5].equals("O")) ||
(textBoard[6].equals("O") && textBoard[7].equals("O") &&
textBoard[8].equals("O")) ||
(textBoard[0].equals("O") && textBoard[3].equals("O") &&
textBoard[6].equals("O")) ||
(textBoard[1].equals("O") && textBoard[4].equals("O") &&
textBoard[7].equals("O")) ||
(textBoard[2].equals("O") && textBoard[5].equals("O") &&
textBoard[8].equals("O")) ||
(textBoard[0].equals("O") && textBoard[4].equals("O") &&
textBoard[8].equals("O")) ||
(textBoard[2].equals("O") && textBoard[4].equals("O") &&
textBoard[6].equals("O")))
return -1;
}

return 0;
}

private void setTextBoard() {


textBoard[0] = board.button1.getText().toString();
textBoard[1] = board.button2.getText().toString();
textBoard[2] = board.button3.getText().toString();
textBoard[3] = board.button4.getText().toString();
textBoard[4] = board.button5.getText().toString();
textBoard[5] = board.button6.getText().toString();
textBoard[6] = board.button7.getText().toString();
textBoard[7] = board.button8.getText().toString();
textBoard[8] = board.button9.getText().toString();
}

private void applyTextBoard(String[] textBoard) {


board.button1.setText(textBoard[0]);
board.button2.setText(textBoard[1]);
board.button3.setText(textBoard[2]);
board.button4.setText(textBoard[3]);
board.button5.setText(textBoard[4]);
board.button6.setText(textBoard[5]);
board.button7.setText(textBoard[6]);
board.button8.setText(textBoard[7]);
board.button9.setText(textBoard[8]);
}

}
ResulutMM.java
package com.indie_an.tictactoe;

public class ResultMM {

String[] matrix; // The state of the board at a given stage


int score; // The score associated with the board (win = +1, lose = -1, else = 0)
int depth; // The depth in the tree structure in which this state exists

public ResultMM(String[] matrix, int score, int depth) {


this.matrix = matrix;
this.score = score;
this.depth = depth;
}

public int getScore() {


return score;
}

public void setMatrix(String[] matrix) {


this.matrix = matrix;
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button1"
android:layout_above="@+id/button5"
android:layout_toLeftOf="@+id/button5"
android:layout_toStartOf="@+id/button5" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:layout_alignTop="@+id/button1"
android:layout_toRightOf="@+id/button1"
android:layout_toEndOf="@+id/button1" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button3"
android:layout_alignTop="@+id/button2"
android:layout_toRightOf="@+id/button2"
android:layout_toEndOf="@+id/button2" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button4"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/button1"
android:layout_alignStart="@+id/button1" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button5"
android:layout_alignBottom="@+id/button4"
android:layout_centerHorizontal="true" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button6"
android:layout_below="@+id/button3"
android:layout_alignLeft="@+id/button3"
android:layout_alignStart="@+id/button3" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button7"
android:layout_below="@+id/button4"
android:layout_toLeftOf="@+id/button5"
android:layout_toStartOf="@+id/button5" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button8"
android:layout_alignTop="@+id/button7"
android:layout_alignLeft="@+id/button5"
android:layout_alignStart="@+id/button5" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button9"
android:layout_alignTop="@+id/button8"
android:layout_toRightOf="@+id/button8"
android:layout_toEndOf="@+id/button8" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start"
android:id="@+id/start"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/button1"
android:layout_toEndOf="@+id/button1"
android:layout_marginTop="53dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text"
android:layout_above="@+id/button1"
android:layout_centerHorizontal="true" />

<RadioGroup
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:checkedButton="@+id/cross"
android:orientation="horizontal">

<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="80dp"
android:layout_marginLeft="80dp"
android:text="@string/cross"
android:id="@+id/cross" />

<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="80dp"
android:layout_marginLeft="80dp"
android:text="@string/naught"
android:id="@+id/naught" />
</RadioGroup>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset"
android:id="@+id/reset"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
Menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">

<item android:id="@+id/winnable" android:title="@string/winnable"


android:checkable="true" android:checked="true" />
</menu>

S-ar putea să vă placă și