Advertisement
obernardovieira

Tic-Tac-Toe against arduino (usign serial monitor)

Feb 15th, 2016
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.54 KB | None | 0 0
  1.  
  2. #define PLAYER_MOVE     1
  3. #define COMPUTER_MOVE   2
  4.  
  5. void setup()
  6. {
  7.     Serial.begin(9600);
  8.     Serial.print("Write you chooses using the format ");
  9.     Serial.println("'line column' (in numbers) without \" ' \" ");
  10. }
  11.  
  12. void loop()
  13. {
  14.     while(Serial.available() > 0)
  15.     {
  16.         char ch = Serial.read();
  17.         receiveChoose(ch);
  18.     }
  19. }
  20.  
  21. void receiveChoose(char ch)
  22. {
  23.     static int line = 0;
  24.     static int column = 0;
  25.     static int param = 0;
  26.  
  27.     int n;
  28.  
  29.     if(ch == ' ')
  30.     {
  31.         return;
  32.     }
  33.  
  34.     param ++;
  35.     if(param == 3)
  36.     {
  37.         param = 1;
  38.     }
  39.     n = (int)(ch - '0');
  40.     if(n < 1 || n > 3)
  41.     {
  42.         line = 0;
  43.         column = 0;
  44.         Serial.println("Index out of bounds!");
  45.         return;
  46.     }
  47.  
  48.     if(!line && param == 1)
  49.     {
  50.         line = n;
  51.     }
  52.     else if(line != 0 && param == 2)
  53.     {
  54.         column = n;
  55.  
  56.         playPlayer(line - 1, column - 1);
  57.  
  58.         line = 0;
  59.         column = 0;
  60.     }
  61. }
  62.  
  63. void playPlayer(int line, int column)
  64. {
  65.     static int board[3][3] = {
  66.         {0, 0, 0},
  67.         {0, 0, 0},
  68.         {0, 0, 0}
  69.     };
  70.  
  71.     if(board[line][column] != 0)
  72.     {
  73.         Serial.println("Already used!");
  74.         return;
  75.     }
  76.  
  77.     board[line][column] = PLAYER_MOVE;
  78.  
  79.     if(findWinner(board))
  80.     {
  81.         Serial.println("Player is the winner!");
  82.     }
  83.  
  84.     printBoard(board);
  85.  
  86.     playComputer(board);
  87. }
  88.  
  89. void playComputer(int board[3][3])
  90. {
  91.     if(!chooseNextMove(board))
  92.     {
  93.         computerStrategicMove(board);
  94.     }
  95.  
  96.     if(findWinner(board))
  97.     {
  98.         Serial.println("Computer is the winner!");
  99.     }
  100.  
  101.     printBoard(board);
  102. }
  103.  
  104. bool chooseNextMove(int board[3][3])
  105. {
  106.     int x, y;
  107.  
  108.     for(x = 0; x < 3; x++)
  109.     {
  110.         for(y = 0; y < 3; y++)
  111.         {
  112.             if(!board[x][y])
  113.             {
  114.                 board[x][y] = COMPUTER_MOVE;
  115.                 if(findWinner(board))
  116.                 {
  117.                     return true;
  118.                 }
  119.                 board[x][y] = PLAYER_MOVE;
  120.                 if(findWinner(board))
  121.                 {
  122.                     board[x][y] = COMPUTER_MOVE;
  123.                     return true;
  124.                 }
  125.                 board[x][y] = 0;
  126.             }
  127.         }
  128.     }
  129.     return false;
  130. }
  131.  
  132. void computerStrategicMove(int board[3][3])
  133. {
  134.     bool found;
  135.     int x, y;
  136.  
  137.     //center
  138.  
  139.     if(!board[1][1])
  140.     {
  141.         board[1][1] = COMPUTER_MOVE;
  142.         return;
  143.     }
  144.  
  145.     //diagonal
  146.  
  147.     found = false;
  148.  
  149.     for(x = 0; x < 3; x+=2)
  150.     {
  151.         for(y = 0; y < 3; y+=2)
  152.         {
  153.             if(!board[x][y])
  154.             {
  155.                 found = true;
  156.                 break;
  157.             }
  158.         }
  159.         if(found)
  160.         {
  161.             break;
  162.         }
  163.     }
  164.     if(found)
  165.     {
  166.         board[x][y] = COMPUTER_MOVE;
  167.         return;
  168.     }
  169.  
  170.     //mid lines
  171.  
  172.     for(y = 0; y < 3; y+=2)
  173.     {
  174.         if(!board[1][y])
  175.         {
  176.             x = 1;
  177.             found = true;
  178.             break;
  179.         }
  180.     }
  181.     if(!found)
  182.     {
  183.         for(x = 0; x < 3; x+=2)
  184.         {
  185.             if(!board[x][1])
  186.             {
  187.                 y = 1;
  188.                 found = true;
  189.                 break;
  190.             }
  191.         }
  192.     }
  193.     if(found)
  194.     {
  195.         board[x][y] = COMPUTER_MOVE;
  196.         return;
  197.     }
  198. }
  199.  
  200. bool findWinner(const int board[3][3])
  201. {
  202.     int a;
  203.  
  204.     for(a = 0; a < 3; a++)
  205.     {
  206.         if(!board[a][0])
  207.         {
  208.             continue;
  209.         }
  210.         if( board[a][0] == board[a][1] &&
  211.             board[a][0] == board[a][2])
  212.         {
  213.             return true;
  214.         }
  215.     }
  216.  
  217.     //
  218.  
  219.     for(a = 0; a < 3; a++)
  220.     {
  221.         if(!board[0][a])
  222.         {
  223.             continue;
  224.         }
  225.         if( board[0][a] == board[1][a] &&
  226.             board[0][a] == board[2][a])
  227.         {
  228.             return true;
  229.         }
  230.     }
  231.  
  232.     //
  233.  
  234.     if( board[0][0] == board[1][1] &&
  235.         board[0][0] == board[2][2] && board[0][0] != 0)
  236.     {
  237.         return true;
  238.     }
  239.     if( board[0][2] == board[1][1] &&
  240.         board[0][2] == board[2][0] && board[0][2] != 0)
  241.     {
  242.         return true;
  243.     }
  244.     return false;
  245. }
  246.  
  247. void printBoard(const int board[3][3])
  248. {
  249.     int x, y;
  250.  
  251.     Serial.println(" ");
  252.     Serial.println(" ");
  253.  
  254.     for(x = 0; x < 3; x++)
  255.     {
  256.         for(y = 0; y < 3; y++)
  257.         {
  258.             Serial.print(board[x][y]);
  259.             if(y < 2)
  260.             {
  261.                 Serial.print(" | ");
  262.             }
  263.         }
  264.         Serial.println(" ");
  265.     }
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement