Android Open Source - Tic-Tac-Toe A I Draw View






From Project

Back to project page Tic-Tac-Toe.

License

The source code is released under:

MIT License

If you think the Android project Tic-Tac-Toe listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.comp1008.AmmanVedi.TicTacToe;
/*from ww w.jav  a  2  s .c  om*/

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import java.lang.Math;



public class AIDrawView extends View implements OnTouchListener
{

  private Paint text = new Paint();
  private Paint board = new Paint();
  private Paint blueX = new Paint();
  private Paint redO = new Paint();
  private Paint bgPaint = new Paint();
  private Rect[] sectors = new Rect[9]; 
  private float sectorsize;
  private GameState State = new GameState();
  private int touchx;
  private int touchy;
  private AIPlayer ai = new AIPlayer(3);


  public AIDrawView(Context context, int difficulty)
  {
    super(context);
    
    this.ai.setDifficulty(difficulty);
    
    bgPaint.setColor(Color.rgb(255, 243, 71));
    text.setColor(Color.BLACK);
    text.setTextAlign(Align.CENTER);
    text.setTextSize(20);
    text.setAntiAlias(true);
    board.setColor(Color.BLACK);
    board.setStyle(Style.STROKE);
    redO.setColor(Color.RED);
    redO.setTextAlign(Align.CENTER);
    redO.setAntiAlias(true);
    blueX.setTextAlign(Align.CENTER);
    blueX.setColor(Color.BLUE);
    blueX.setAntiAlias(true);


    setFocusable(true);
    setFocusableInTouchMode(true);

    this.setOnTouchListener(this);
  }

  @Override
  public void onDraw(Canvas canvas)
  {
    
    canvas.drawRect(this.getLeft(), this.getTop(), this.getRight(), this.getBottom(), bgPaint);
    this.drawBoard(canvas);
    this.drawState(canvas, State);
    

    if(State.checkForWinner() == 1)
    {
      System.out.println("theres a winner, and its player : ");
      State.resetGameState();
      //invalidate();
    }else
    {
      System.out.println("theres no winner check full :(");
      if(State.checkFull())
      {
        System.out.println("theres no winner :(");
        State.resetGameState();
      }
    }


  }

  public boolean onTouch(View v, MotionEvent event)
  {   

    //NEEDED TO ALLOW RE DRAWING OF CANVAS  

    touchx = (int) event.getX();
    touchy = (int) event.getY();



    if(event.getAction() == MotionEvent.ACTION_DOWN){

      //check where the user clicked and then update the state accordingly

      for(int i = 0; i < 9; i++)
      {
        if(this.testContainment(sectors[i], touchx, touchy)){
          
          if(State.Update(new Tuple(1, i)) == false){
            System.out.println("Failed to update due to invalid move");
          }else
          {
            //succeeded
            //ai can move
            System.out.println("calling ai move");
            if(State.checkFull() == false)
            {
              State.Update(ai.aiMove(State));
            }
            
          }

          //System.out.println("Sector Selected: " + i + " By : Player " + playernum);

          break;
        }
      }


    }
    invalidate();
    return true;
  }


  public void drawX(Canvas cvs, int AtSector)
  {
    blueX.setTextSize(sectorsize);
    cvs.drawText("X", sectors[AtSector].centerX(), sectors[AtSector].centerY() + (int)((float)blueX.getTextSize() / 2.5), blueX);


  }

  public void drawO(Canvas cvs, int AtSector)
  {

    redO.setTextSize(sectorsize);
    cvs.drawText("O", sectors[AtSector].centerX(), sectors[AtSector].centerY() + (int)((float)redO.getTextSize() / 2.5), redO);



  }

  public void drawBoard(Canvas cvs)
  {


    //if the array is empty then generate rects and fill it
    if(sectors[1] == null){

      float thirdofheight = (this.getHeight() / 3);
      sectorsize = (thirdofheight / 3);
      int origin_x = 0, origin_y = 0;
      
      int offset_x = (int)((this.getWidth()/2) - ((sectorsize * 3) /2));
      //80 is the size of the scorebox
      int offset_y = (int)((this.getHeight()/2) - ((sectorsize * 3) /2) - 80);

      //create the bounds of the board
      @SuppressWarnings("unused")
      Rect bounds = new Rect(origin_x, (int)thirdofheight, (int)thirdofheight, origin_y);
      //cvs.drawRect(bounds, text);

      //fill the board with its sectors
      Rect sector1 = new Rect(origin_x, (int)(origin_y + sectorsize), (int)(origin_x + sectorsize), origin_y);
      Rect sector2 = new Rect((int)(origin_x + sectorsize), (int)(origin_y + sectorsize), (int)((origin_x + sectorsize)*2), origin_y);
      Rect sector3 = new Rect((int)((origin_x + sectorsize)*2), (int)(origin_y + sectorsize),  (int)((origin_x + sectorsize)*3), origin_y);

      Rect sector4 = new Rect(origin_x, (int)((origin_y + sectorsize)*2), (int)(origin_x + sectorsize), (int)((origin_y + sectorsize)));
      Rect sector5 = new Rect((int)(origin_x + sectorsize), (int)((origin_y + sectorsize)*2), (int)((origin_x + sectorsize)*2), (int)((origin_y + sectorsize)));
      Rect sector6 = new Rect((int)((origin_x + sectorsize)*2), (int)((origin_y + sectorsize)*2), (int)((origin_x + sectorsize)*3), (int)((origin_y + sectorsize)));

      Rect sector7 = new Rect(origin_x, (int)((origin_y + sectorsize)*3), (int)(origin_x + sectorsize), (int)((origin_y + sectorsize)*2));
      Rect sector8 = new Rect((int)(origin_x + sectorsize), (int)((origin_y + sectorsize)*3), (int)((origin_x + sectorsize)*2), (int)((origin_y + sectorsize)*2));
      Rect sector9 = new Rect((int)((origin_x + sectorsize)*2), (int)((origin_y + sectorsize)*3), (int)((origin_x + sectorsize)*3), (int)((origin_y + sectorsize)*2));

      sectors[0] = sector1;
      sectors[1] = sector2;
      sectors[2] = sector3;
      sectors[3] = sector4;
      sectors[4] = sector5;
      sectors[5] = sector6;
      sectors[6] = sector7;
      sectors[7] = sector8;
      sectors[8] = sector9;

      for(int x = 0; x < 9; x++)
      {
        sectors[x].offset(offset_x, offset_y);
      }

    }
    
    this.drawScore(cvs, sectors[1]);

    cvs.drawRect(sectors[0], board);
    cvs.drawRect(sectors[1], board);
    cvs.drawRect(sectors[2], board);
    cvs.drawRect(sectors[3], board);
    cvs.drawRect(sectors[4], board);
    cvs.drawRect(sectors[5], board);
    cvs.drawRect(sectors[6], board);
    cvs.drawRect(sectors[7], board);
    cvs.drawRect(sectors[8], board);



  }

  public void putText(Canvas cvs, int x, int y, String str)
  {
    cvs.drawText(str, x, y, text);
  }
  
  public void drawScore(Canvas cvs, Rect firstRect)
  {
    //passing the top left rect allows me to work out the co ordinates of where i want to put
    // the score display
    
    //offset from the bottom of the game board (adjustable)
    int off = 10;
    
    //calculate and draw the scorebox
    int bottom = (firstRect.bottom + (Math.abs(firstRect.height()) * 3) + off);
    int left = firstRect.left - Math.abs(firstRect.height());
    
    Rect scorebox = new Rect(left, (bottom + 80) , (firstRect.left +(firstRect.width() * 2)), bottom);
    cvs.drawRect(scorebox, board);
    
    //draw actual score values
    //putText(cvs, left + off , bottom + (int)text.getTextSize(), "Player 1 : " +  Integer.toString(State.getScore()[0]));
    //putText(cvs, left + off , bottom + (int)text.getTextSize() + 20, "Player 2 : " +  Integer.toString(State.getScore()[1]));
    
    putText(cvs, scorebox.centerX() , scorebox.centerY(), "Player 1 : " +  Integer.toString(State.getScore()[0]));
    putText(cvs, scorebox.centerX() , scorebox.centerY() + 25, "AI        : " +  Integer.toString(State.getScore()[1]));


    
  }

  public void drawState(Canvas cvs, GameState CurrentState)
  {
    //System.out.println("state: " + CurrentState.getRawState().toString());
    System.out.println("---------");
    System.out.println("| " + CurrentState.getRawState()[0][0] + " " + CurrentState.getRawState()[0][1] + " " + CurrentState.getRawState()[0][2] + " |");
    System.out.println("| " + CurrentState.getRawState()[1][0] + " " + CurrentState.getRawState()[1][1] + " " + CurrentState.getRawState()[1][2] + " |");
    System.out.println("| " + CurrentState.getRawState()[2][0] + " " + CurrentState.getRawState()[2][1] + " " + CurrentState.getRawState()[2][2] + " |");
    System.out.println("---------");
    //go through array drawing x's or o's

    for(int y = 0; y < 3; y++)
    {
      for(int z = 0; z < 3; z++)
      {
        if(CurrentState.getRawState()[y][z] == 1){
          //drawx
          this.drawX(cvs, CurrentState.indexToSector(y, z));
        }
        if(CurrentState.getRawState()[y][z] == 2){
          //draw o 
          this.drawO(cvs, CurrentState.indexToSector(y, z));
        }
      }
    }
    
    

  }

  public boolean testContainment(Rect r, int px, int py)
  {
    if(px > r.left && px < r.right)
    {
      if(py > r.bottom && py < r.top){
        return true;
      }
    }


    return false;
  }


}




Java Source Code List

com.comp1008.AmmanVedi.TicTacToe.AIDrawView.java
com.comp1008.AmmanVedi.TicTacToe.AIPlayer.java
com.comp1008.AmmanVedi.TicTacToe.DifficultySelect.java
com.comp1008.AmmanVedi.TicTacToe.DrawView.java
com.comp1008.AmmanVedi.TicTacToe.GameState.java
com.comp1008.AmmanVedi.TicTacToe.HighScores.java
com.comp1008.AmmanVedi.TicTacToe.SplashScreen.java
com.comp1008.AmmanVedi.TicTacToe.TicTacToeActivity.java
com.comp1008.AmmanVedi.TicTacToe.Tuple.java