Tic Tac Toe

Basic Tutorials concerning: GUI, Views, Activites, XML, Layouts, Intents, ...

What do you think?

thumbs up
7
88%
thumbs down
1
13%
 
Total votes : 8

Tic Tac Toe

Postby jasonahoule » Mon Feb 16, 2009 3:54 am

I saw a tic tac toe tutorial on here somewhere and thought I would add my own. It is kind of like the other but refactored, cleaner, much easier to understand and with better AI (I think...). If you have any questions or comments, please post.

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package com.jasonhoule.tictactoe;
  3.  
  4.  
  5.  
  6. import java.util.Random;
  7.  
  8.  
  9.  
  10. import android.app.Activity;
  11.  
  12. import android.os.Bundle;
  13.  
  14. import android.view.Menu;
  15.  
  16. import android.view.MenuItem;
  17.  
  18. import android.view.View;
  19.  
  20. import android.widget.Button;
  21.  
  22. import android.widget.TextView;
  23.  
  24.  
  25.  
  26. public class TicTacToe extends Activity {
  27.  
  28.  
  29.  
  30.         int c[][];
  31.  
  32.         int i, j, k = 0;
  33.  
  34.         Button b[][];
  35.  
  36.         TextView textView;
  37.  
  38.         AI ai;
  39.  
  40.  
  41.  
  42.         /** Called when the activity is first created. */
  43.  
  44.         @Override
  45.  
  46.         public void onCreate(Bundle savedInstanceState) {
  47.  
  48.                 super.onCreate(savedInstanceState);
  49.  
  50.                 setContentView(R.layout.main);         
  51.  
  52.  
  53.  
  54.                 setBoard();
  55.  
  56.         }
  57.  
  58.        
  59.  
  60.         @Override
  61.  
  62.         public boolean onCreateOptionsMenu(Menu menu) {
  63.  
  64.                 super.onCreateOptionsMenu(menu);
  65.  
  66.                 MenuItem item = menu.add("New Game");
  67.  
  68.                 return true;
  69.  
  70.         }
  71.  
  72.        
  73.  
  74.         public boolean onOptionsItemSelected(MenuItem item) {
  75.  
  76.                 setBoard();
  77.  
  78.                 return true;
  79.  
  80.         }
  81.  
  82.  
  83.  
  84.         // Set up the game board.
  85.  
  86.         private void setBoard() {
  87.  
  88.                 ai = new AI();
  89.  
  90.                 b = new Button[4][4];
  91.  
  92.                 c = new int[4][4];
  93.  
  94.  
  95.  
  96.                 textView = (TextView) findViewById(R.id.dialogue);
  97.  
  98.  
  99.  
  100.                 b[1][3] = (Button) findViewById(R.id.one);
  101.  
  102.                 b[1][2] = (Button) findViewById(R.id.two);
  103.  
  104.                 b[1][1] = (Button) findViewById(R.id.three);
  105.  
  106.  
  107.  
  108.                 b[2][3] = (Button) findViewById(R.id.four);
  109.  
  110.                 b[2][2] = (Button) findViewById(R.id.five);
  111.  
  112.                 b[2][1] = (Button) findViewById(R.id.six);
  113.  
  114.  
  115.  
  116.                 b[3][3] = (Button) findViewById(R.id.seven);
  117.  
  118.                 b[3][2] = (Button) findViewById(R.id.eight);
  119.  
  120.                 b[3][1] = (Button) findViewById(R.id.nine);
  121.  
  122.                
  123.  
  124.                 for (i = 1; i <= 3; i++) {
  125.  
  126.                         for (j = 1; j <= 3; j++)
  127.  
  128.                                 c[i][j] = 2;
  129.  
  130.                 }
  131.  
  132.  
  133.  
  134.                 textView.setText("Click a button to start.");
  135.  
  136.  
  137.  
  138.                 // add the click listeners for each button
  139.  
  140.                 for (i = 1; i <= 3; i++) {
  141.  
  142.                         for (j = 1; j <= 3; j++) {
  143.  
  144.                                 b[i][j].setOnClickListener(new MyClickListener(i, j));
  145.  
  146.                                 if(!b[i][j].isEnabled()) {
  147.  
  148.                                         b[i][j].setText(" ");
  149.  
  150.                                         b[i][j].setEnabled(true);
  151.  
  152.                                 }
  153.  
  154.                         }
  155.  
  156.                 }
  157.  
  158.         }
  159.  
  160.  
  161.  
  162.         class MyClickListener implements View.OnClickListener {
  163.  
  164.                 int x;
  165.  
  166.                 int y;
  167.  
  168.  
  169.  
  170.                 public MyClickListener(int x, int y) {
  171.  
  172.                         this.x = x;
  173.  
  174.                         this.y = y;
  175.  
  176.                 }
  177.  
  178.  
  179.  
  180.                 public void onClick(View view) {
  181.  
  182.                         if (b[x][y].isEnabled()) {
  183.  
  184.                                 b[x][y].setEnabled(false);
  185.  
  186.                                 b[x][y].setText("O");
  187.  
  188.                                 c[x][y] = 0;
  189.  
  190.                                 textView.setText("");
  191.  
  192.                                 if (!checkBoard()) {
  193.  
  194.                                         ai.takeTurn();
  195.  
  196.                                 }
  197.  
  198.                         }
  199.  
  200.                 }
  201.  
  202.         }
  203.  
  204.  
  205.  
  206.         private class AI {
  207.  
  208.                 public void takeTurn() {
  209.  
  210.                 if(c[1][1]==2 &&
  211.  
  212.                                 ((c[1][2]==0 && c[1][3]==0) ||
  213.  
  214.                                  (c[2][2]==0 && c[3][3]==0) ||
  215.  
  216.                                  (c[2][1]==0 && c[3][1]==0))) {
  217.  
  218.                         markSquare(1,1);
  219.  
  220.                 } else if (c[1][2]==2 &&
  221.  
  222.                                 ((c[2][2]==0 && c[3][2]==0) ||
  223.  
  224.                                  (c[1][1]==0 && c[1][3]==0))) {
  225.  
  226.                         markSquare(1,2);
  227.  
  228.                 } else if(c[1][3]==2 &&
  229.  
  230.                                 ((c[1][1]==0 && c[1][2]==0) ||
  231.  
  232.                                  (c[3][1]==0 && c[2][2]==0) ||
  233.  
  234.                                  (c[2][3]==0 && c[3][3]==0))) {
  235.  
  236.                         markSquare(1,3);
  237.  
  238.                 } else if(c[2][1]==2 &&
  239.  
  240.                                 ((c[2][2]==0 && c[2][3]==0) ||
  241.  
  242.                                  (c[1][1]==0 && c[3][1]==0))){
  243.  
  244.                         markSquare(2,1);
  245.  
  246.                 } else if(c[2][2]==2 &&
  247.  
  248.                                 ((c[1][1]==0 && c[3][3]==0) ||
  249.  
  250.                                  (c[1][2]==0 && c[3][2]==0) ||
  251.  
  252.                                  (c[3][1]==0 && c[1][3]==0) ||
  253.  
  254.                                  (c[2][1]==0 && c[2][3]==0))) {
  255.  
  256.                         markSquare(2,2);
  257.  
  258.                 } else if(c[2][3]==2 &&
  259.  
  260.                                 ((c[2][1]==0 && c[2][2]==0) ||
  261.  
  262.                                  (c[1][3]==0 && c[3][3]==0))) {
  263.  
  264.                         markSquare(2,3);
  265.  
  266.                 } else if(c[3][1]==2 &&
  267.  
  268.                                 ((c[1][1]==0 && c[2][1]==0) ||
  269.  
  270.                                  (c[3][2]==0 && c[3][3]==0) ||
  271.  
  272.                                  (c[2][2]==0 && c[1][3]==0))){
  273.  
  274.                         markSquare(3,1);
  275.  
  276.                 } else if(c[3][2]==2 &&
  277.  
  278.                                 ((c[1][2]==0 && c[2][2]==0) ||
  279.  
  280.                                  (c[3][1]==0 && c[3][3]==0))) {
  281.  
  282.                         markSquare(3,2);
  283.  
  284.                 }else if( c[3][3]==2 &&
  285.  
  286.                                 ((c[1][1]==0 && c[2][2]==0) ||
  287.  
  288.                                  (c[1][3]==0 && c[2][3]==0) ||
  289.  
  290.                                  (c[3][1]==0 && c[3][2]==0))) {
  291.  
  292.                         markSquare(3,3);
  293.  
  294.                 } else {
  295.  
  296.                         Random rand = new Random();
  297.  
  298.                        
  299.  
  300.                         int a = rand.nextInt(4);
  301.  
  302.                         int b = rand.nextInt(4);
  303.  
  304.                         while(a==0 || b==0 || c[a][b]!=2) {
  305.  
  306.                                 a = rand.nextInt(4);
  307.  
  308.                                 b = rand.nextInt(4);
  309.  
  310.                         }
  311.  
  312.                         markSquare(a,b);
  313.  
  314.                 }
  315.  
  316.         }
  317.  
  318.  
  319.  
  320.                 private void markSquare(int x, int y) {
  321.  
  322.                         b[x][y].setEnabled(false);
  323.  
  324.                         b[x][y].setText("X");
  325.  
  326.                         c[x][y] = 1;
  327.  
  328.                         checkBoard();
  329.  
  330.                 }
  331.  
  332.         }
  333.  
  334.  
  335.  
  336.         // check the board to see if someone has won
  337.  
  338.         private boolean checkBoard() {
  339.  
  340.                 boolean gameOver = false;
  341.  
  342.                 if ((c[1][1] == 0 && c[2][2] == 0 && c[3][3] == 0)
  343.  
  344.                                 || (c[1][3] == 0 && c[2][2] == 0 && c[3][1] == 0)
  345.  
  346.                                 || (c[1][2] == 0 && c[2][2] == 0 && c[3][2] == 0)
  347.  
  348.                                 || (c[1][3] == 0 && c[2][3] == 0 && c[3][3] == 0)
  349.  
  350.                                 || (c[1][1] == 0 && c[1][2] == 0 && c[1][3] == 0)
  351.  
  352.                                 || (c[2][1] == 0 && c[2][2] == 0 && c[2][3] == 0)
  353.  
  354.                                 || (c[3][1] == 0 && c[3][2] == 0 && c[3][3] == 0)
  355.  
  356.                                 || (c[1][1] == 0 && c[2][1] == 0 && c[3][1] == 0)) {
  357.  
  358.                         textView.setText("Game over. You win!");
  359.  
  360.                         gameOver = true;
  361.  
  362.                 } else if ((c[1][1] == 1 && c[2][2] == 1 && c[3][3] == 1)
  363.  
  364.                                 || (c[1][3] == 1 && c[2][2] == 1 && c[3][1] == 1)
  365.  
  366.                                 || (c[1][2] == 1 && c[2][2] == 1 && c[3][2] == 1)
  367.  
  368.                                 || (c[1][3] == 1 && c[2][3] == 1 && c[3][3] == 1)
  369.  
  370.                                 || (c[1][1] == 1 && c[1][2] == 1 && c[1][3] == 1)
  371.  
  372.                                 || (c[2][1] == 1 && c[2][2] == 1 && c[2][3] == 1)
  373.  
  374.                                 || (c[3][1] == 1 && c[3][2] == 1 && c[3][3] == 1)
  375.  
  376.                                 || (c[1][1] == 1 && c[2][1] == 1 && c[3][1] == 1)) {
  377.  
  378.                         textView.setText("Game over. You lost!");
  379.  
  380.                         gameOver = true;
  381.  
  382.                 } else {
  383.  
  384.                         boolean empty = false;
  385.  
  386.                         for(i=1; i<=3; i++) {
  387.  
  388.                                 for(j=1; j<=3; j++) {
  389.  
  390.                                         if(c[i][j]==2) {
  391.  
  392.                                                 empty = true;
  393.  
  394.                                                 break;
  395.  
  396.                                         }
  397.  
  398.                                 }
  399.  
  400.                         }
  401.  
  402.                         if(!empty) {
  403.  
  404.                                 gameOver = true;
  405.  
  406.                                 textView.setText("Game over. It's a draw!");
  407.  
  408.                         }
  409.  
  410.                 }
  411.  
  412.                 return gameOver;
  413.  
  414.         }
  415.  
  416. }
  417.  
  418.  
Parsed in 0.061 seconds, using GeSHi 1.0.8.4


Here is the layout file
Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3.  
  4. <!-- Demonstrates using a relative layout to create a form -->
  5.  
  6. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  7.  
  8.                android:layout_width="fill_parent"
  9.  
  10.                android:layout_height="wrap_content">
  11.  
  12.                  
  13.  
  14.     <Button android:id="@+id/one"
  15.  
  16.            android:layout_width="100px"
  17.  
  18.            android:layout_height="100px"
  19.  
  20.            android:layout_alignParentRight="true"
  21.  
  22.            android:layout_marginLeft="5px"
  23.  
  24.            android:text=" "
  25.  
  26.            android:textSize="70px" />
  27.  
  28.            
  29.  
  30.     <Button android:id="@+id/two"
  31.  
  32.          android:layout_width="100px"
  33.  
  34.            android:layout_height="100px"
  35.  
  36.            android:layout_toLeftOf="@id/one"
  37.  
  38.            android:layout_alignTop="@id/one"
  39.  
  40.            android:layout_marginLeft="5px"
  41.  
  42.            android:text=" "
  43.  
  44.            android:textSize="70px" />
  45.  
  46.            
  47.  
  48.     <Button android:id="@+id/three"
  49.  
  50.          android:layout_width="100px"
  51.  
  52.            android:layout_height="100px"
  53.  
  54.            android:layout_toLeftOf="@id/two"
  55.  
  56.            android:layout_alignTop="@id/two"
  57.  
  58.            android:layout_marginLeft="5px"
  59.  
  60.            android:text=" "
  61.  
  62.            android:textSize="70px"
  63.  
  64.            android:padding="0px"/>
  65.  
  66.                        
  67.  
  68.     <Button android:id="@+id/four"
  69.  
  70.            android:layout_width="100px"
  71.  
  72.            android:layout_height="100px"
  73.  
  74.            android:layout_alignParentRight="true"
  75.  
  76.            android:layout_marginLeft="5px"
  77.  
  78.            android:layout_below="@id/one"
  79.  
  80.            android:text=" "
  81.  
  82.            android:textSize="70px" />
  83.  
  84.            
  85.  
  86.      <Button android:id="@+id/five"
  87.  
  88.          android:layout_width="100px"
  89.  
  90.            android:layout_height="100px"
  91.  
  92.            android:layout_toLeftOf="@id/four"
  93.  
  94.            android:layout_alignTop="@id/four"
  95.  
  96.            android:layout_marginLeft="5px"
  97.  
  98.            android:text=" "
  99.  
  100.            android:textSize="70px" />
  101.  
  102.            
  103.  
  104.     <Button android:id="@+id/six"
  105.  
  106.          android:layout_width="100px"
  107.  
  108.            android:layout_height="100px"
  109.  
  110.            android:layout_toLeftOf="@id/five"
  111.  
  112.            android:layout_alignTop="@id/five"
  113.  
  114.            android:layout_marginLeft="5px"
  115.  
  116.            android:text=" "
  117.  
  118.            android:textSize="70px" />
  119.  
  120.            
  121.  
  122.     <Button android:id="@+id/seven"
  123.  
  124.            android:layout_width="100px"
  125.  
  126.            android:layout_height="100px"
  127.  
  128.            android:layout_alignParentRight="true"
  129.  
  130.            android:layout_marginLeft="5px"
  131.  
  132.            android:layout_below="@id/four"
  133.  
  134.            android:text=" "
  135.  
  136.            android:textSize="70px" />
  137.  
  138.            
  139.  
  140.      <Button android:id="@+id/eight"
  141.  
  142.          android:layout_width="100px"
  143.  
  144.            android:layout_height="100px"
  145.  
  146.            android:layout_toLeftOf="@id/seven"
  147.  
  148.            android:layout_alignTop="@id/seven"
  149.  
  150.            android:layout_marginLeft="5px"
  151.  
  152.            android:text=" "
  153.  
  154.            android:textSize="70px" />
  155.  
  156.            
  157.  
  158.     <Button android:id="@+id/nine"
  159.  
  160.          android:layout_width="100px"
  161.  
  162.            android:layout_height="100px"
  163.  
  164.            android:layout_toLeftOf="@id/eight"
  165.  
  166.            android:layout_alignTop="@id/eight"
  167.  
  168.            android:layout_marginLeft="5px"
  169.  
  170.            android:text=" "
  171.  
  172.            android:textSize="70px" />
  173.  
  174.        
  175.  
  176.         <TextView android:id="@+id/dialogue"
  177.  
  178.                 android:layout_width="fill_parent"
  179.  
  180.                 android:layout_below="@id/nine"
  181.  
  182.                 android:layout_height="wrap_content"
  183.  
  184.                 android:text="Click a button to start"
  185.  
  186.                 android:gravity="center_horizontal"
  187.  
  188.                 android:layout_marginTop="20px"
  189.  
  190.                 android:textSize="20px"/>
  191.  
  192.        
  193.  
  194. </RelativeLayout>
  195.  
  196.  
Parsed in 0.012 seconds, using GeSHi 1.0.8.4
jasonahoule
Freshman
Freshman
 
Posts: 2
Joined: Mon Feb 16, 2009 3:41 am
Location: Springfield, MA

Top

More of a tutorial

Postby jasonahoule » Tue Feb 17, 2009 3:46 pm

If you want something that is more like a tutorial rather than just a post of the source code then you can get that here.
jasonahoule
Freshman
Freshman
 
Posts: 2
Joined: Mon Feb 16, 2009 3:41 am
Location: Springfield, MA

Top

Return to Novice Tutorials

Who is online

Users browsing this forum: Majestic-12 [Bot] and 2 guests