Documente Academic
Documente Profesional
Documente Cultură
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
logic = new ComputerLogic();
perfectLogic = new PerfectComputerLogic();
}
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
}
}
package com.indie_an.tictactoe;
import android.os.Handler;
import java.util.Random;
if(board.playerTurn)
return;
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);
} 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;
}
}
}
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;
if(board.playerTurn)
return;
if(board.naught.isChecked()) {
max = "X";
min = "O";
} else {
max = "O";
min = "X";
}
level = "max";
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(level.equals("max"))
child[i] = max;
else if(level.equals("min"))
child[i] = min;
successor.add(child);
}
}
// 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;
}
}
ResulutMM.java
package com.indie_an.tictactoe;
<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">