Try to solve these problems yourself. Only come look
here if your code doesn't work, and you want to see what you did wrong.
 
  public static void main() {
    int doing, best, chose, score, sum;
    boolean Xwon = false, Owon = false, cats = false;
    int[] board = new int[10];
    for (int nx=1;nx<=9;nx++) board[nx] = 0;
    for (int max=0;max<9;max++) { // do one play
from each player..
      // 1. Display the board..
      doing = 0;
      for (int ro=1;ro<=3;ro++) { //
do three rows..
        // prepare to display
one row..
        System.out.println("");
        if (ro>1) System.out.println("---+---+---");
        for (int co=1;co<=3;co++)
{ // do 3 squares in that row..
          // display
one square...
          if (co>1)
System.out.print(" | ");
           
else System.out.print(" ");
          doing++;
          if (board[doing]>0)
System.out.print("X");
          else if
(board[doing]<0) System.out.print("O");
           
else System.out.print(doing);
        } // end of 3 squares
      } // end of 3 rows
      System.out.println("");
      System.out.println("");
      // 2. Is game over?
      if (Xwon) break;
      if (Owon) break;
      cats = true;
      for (int nx=1;nx<=9;nx++) if
(board[nx]==0) cats = false;
      if (cats) break;
      System.out.println(""); // blank
line for clarity
      // 3. Accept X play
      System.out.print("Your play: ");
      while (true) {
        doing = Zystem.ReadInt();
        if (doing>9) doing =
0; // so a single test catches all off-board plays
        if (doing<1) break;
// invalid input, user wants out
        if (board[doing] ==
0) { // valid play..
          board[doing]++;
// mark X as having played this square
          break;}
        System.out.print("Taken!
"); // ..then go back for another input
      } // end of input loop
      if (doing<1) break; // invalid
input
      if (board[1]>0) if (board[2]>0)
if (board[3]>0) Xwon = true; // top row
      if (board[4]>0) if (board[5]>0)
if (board[6]>0) Xwon = true; // middle row
      if (board[7]>0) if (board[8]>0)
if (board[9]>0) Xwon = true; // bottom row
      if (board[1]>0) if (board[4]>0)
if (board[7]>0) Xwon = true; // left column
      if (board[2]>0) if (board[5]>0)
if (board[8]>0) Xwon = true; // middle column
      if (board[3]>0) if (board[6]>0)
if (board[9]>0) Xwon = true; // right column
      if (board[1]>0) if (board[5]>0)
if (board[9]>0) Xwon = true; // down diagonal
      if (board[3]>0) if (board[5]>0)
if (board[7]>0) Xwon = true; // up diagonal
      if (Xwon) continue; // display final
board then exit
      if (max == 4) continue; // ditto
if cats
      // 4. Calculate O play
      best = -1;
      chose = 0;
      for (doing=1;doing<=9;doing++)
{ // try all available squares
        if (board[doing] !=0)
continue; // already played, go to next square
        score = 0;
        if (doing<4) { //
in the top row..
          sum = board[1]+board[2]+board[3];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of top row test
        else if (doing>6) {
// in the bottom row..
          sum = board[7]+board[8]+board[9];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of bottom row test
        else if (doing>3) if
(doing<7) { // in the middle row (last test)..
          sum = board[4]+board[5]+board[6];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of middle row test
        if (doing%3 == 0) {
// in the right column..
          sum = board[3]+board[6]+board[9];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of right column test
        else if (doing%3 ==
1) { // in the left column..
          sum = board[1]+board[4]+board[7];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of left column test
        else if (doing%3 ==
2) { // in the middle column..
          sum = board[2]+board[5]+board[8];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of middle column test
        if (doing%4 == 1) {
// in the down diagonal..
          sum = board[1]+board[5]+board[9];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of down diagonal test
        else if ((doing==3)||(doing==5)||(doing==7))
{ // in the up diagonal..
          sum = board[3]+board[5]+board[7];
          if (sum
== -4) score = 99;
          else if
(sum == 2) score = score+22;
          else if
(sum == 0) score++;
          else if
(sum == -2) score = score+4;
          else if
(sum == 1) score = score+2;
          } // end
of up diagonal test
        if (score>best) { //
best square so far..
          chose =
doing;
          best = score;}
// otherwise ignore this square, we already have better
      } // end of heuristic loop
      if (chose==0) { // huh? this shouldn't
happen..
        System.out.println("Something
went wrong");
        break;}
      board[chose] = -2; // mark O as
having played this square
      if (best >= 99) Owon = true; //
did O win?
      // if (board[1]<0) if (board[2]<0)
if (board[3]<0) Owon = true; // top row
      // if (board[4]<0) if (board[5]<0)
if (board[6]<0) Owon = true; // middle row
      // if (board[7]<0) if (board[8]<0)
if (board[9]<0) Owon = true; // bottom row
      // if (board[1]<0) if (board[4]<0)
if (board[7]<0) Owon = true; // left column
      // if (board[2]<0) if (board[5]<0)
if (board[8]<0) Owon = true; // middle column
      // if (board[3]<0) if (board[6]<0)
if (board[9]<0) Owon = true; // right column
      // if (board[1]<0) if (board[5]<0)
if (board[9]<0) Owon = true; // down diagonal
      // if (board[3]<0) if (board[5]<0)
if (board[7]<0) Owon = true; // up diagonal
    } // end of double-play for
    // congratulate winner
    if (Xwon) System.out.println("You won, oh well.");
    else if (Owon) System.out.println("I won, I
won, I won!");
      else System.out.println("Cat's game.");
  } // end of main
 
 
  public static int Add2score(int eX, int Oh, int both,
int aBit, int mask) {
    if ((mask&aBit) ==0) return 0; // the current
square is not in this row
    if (((both|aBit)&mask) == mask) return 0;
// this row has both X and O
    if ((both&mask)==0) return 1; // the row
is empty
    if ((Oh&mask)==0) return 2; // it has one
X only
    if ((eX&mask)==0) return 4; // it has one
O only
    return 0; // probably can't get here, but the
compiler requires a return
  } // end of Add2score
  public static boolean Winner(int playlist) { // <-- header
    if ((playlist&0xE)==0xE) return true; //
top row wins
    if ((playlist&0x70)==0x70) return true;
// middle row
    if ((playlist&0x380)==0x380) return true;
// bottom row
    if ((playlist&0x92)==0x92) return true;
// left column
    if ((playlist&0x124)==0x124) return true;
// middle col
    if ((playlist&0x248)==0x248) return true;
// right column
    if ((playlist&0x222)==0x222) return true;
// down diagonal
    if ((playlist&0xA8)==0xA8) return true;
// up diagonal
    return false; // there is no winning three
  } // end of Winner
  public static void main() {
    int eX = 0, Oh = 0, both = 0, doing, aBit, best,
chose, both, score, mask;
    boolean Xwon = false, Owon = false, logit =
false;
    String aLine = "";
    for (int max=0;max<9;max++) { // do one play
from each player..
      both = eX|Oh;
      // 1. Display the board..
      aBit = 1;
      doing = 0;
      for (int ro=1;ro<=3;ro++) { //
do three rows..
        // prepare to display
one row..
        System.out.println("");
        if (ro>1) System.out.println("---+---+---");
        for (int co=1;co<=3;co++)
{ // do 3 squares in that row..
          // display
one square...
          if (co>1)
System.out.print(" | ");
           
else System.out.print(" ");
          aBit = aBit<<1;
          doing++;
          if ((eX&aBit)
!= 0) System.out.print("X");
          else if
((Oh&aBit) != 0) System.out.print("O");
           
else System.out.print(doing);
        } // end of 3 squares
      } // end of 3 rows
      System.out.println("");
      System.out.println("");
      // 2. Is game over?
      if (Xwon) break;
      if (Owon) break;
      if (eX+Oh == 0x3FE) break;
      System.out.println(""); // blank
line for clarity
      // 3. Accept X play
      System.out.print("Your play: ");
      while (true) {
        doing = Zystem.ReadInt();
        if (doing>9) doing =
0; // so a single test catches all off-board plays
        if (doing<1) break;
// invalid input, user wants out
        aBit = 1<<doing;
        if (((eX|Oh)&aBit)
== 0) { // valid play..
          eX = eX|aBit;
// mark X as having played this square
          break;}
        System.out.print("Taken!
"); // ..then go back for another input
      } // end of input loop
      if (doing<1) break; // invalid
input
      aBit = 1<<doing;
      eX = eX|aBit;
      both = eX|Oh;
      if (Winner(eX)) Xwon = true;
      if (Xwon) continue; // display final
board then exit
      if (both == 0x3FE) continue; //
ditto if cats
      // 4. Calculate O play
      aBit = 1;
      best = -1;
      chose = 0;
      for (doing=1;doing<=9;doing++)
{ // try all available squares
        aBit = aBit<<1;
        if ((both&aBit)
!=0) continue; // already played, go to next square
        score = 0;
        if (Winner(Oh|aBit))
score = 99; // yay! (a winner)
        if (Winner(eX|aBit))
score = score+22; // prevent a lose, block this one
        // for each row/column/diagonal
doing is in, if doing does not fill it...
        score = Add2score(eX,Oh,both,aBit,0xE)+score;
// top row
        score = Add2score(eX,Oh,both,aBit,0x70)+score;
// 2nd row
        score = Add2score(eX,Oh,both,aBit,0x380)+score;
// bottom row
        score = Add2score(eX,Oh,both,aBit,0x92)+score;
// left column
        score = Add2score(eX,Oh,both,aBit,0x124)+score;
// middle col
        score = Add2score(eX,Oh,both,aBit,0x248)+score;
// right column
        score = Add2score(eX,Oh,both,aBit,0xA8)+score;
// up diagonal
        score = Add2score(eX,Oh,both,aBit,0x222)+score;
// down diagonal
        if (score>best) { //
best square so far..
          chose =
doing;
          best = score;}
// otherwise ignore this square, we already have better
      } // end of heuristic loop
      if (chose==0) { // huh? this shouldn't
happen..
        System.out.println("Something
went wrong");
        break;}
      aBit = 1<<chose;
      Oh = Oh|aBit; // mark O as having
played this square
      // did O win?
      if (Winner(Oh)) Owon = true;
    } // end of double-play while
    // congratulate winner
    if (Xwon) System.out.println("You won, oh well.");
    else if (Owon) System.out.println("I won, I
won, I won!");
      else if (both == 0x3FE) System.out.println("Cat's
game.");
  } // end of main
 
 
A = B-A;
B = B-A;
A = B+A;
Revised: 2020 July 22