vasil_k_k

Tic Tac Toe

Nov 12th, 2025
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.42 KB | None | 0 0
  1. #!/bin/bash
  2. # Colorful 2-player Tic Tac Toe with replay, player choice, and winner starts next round
  3.  
  4. # Define colors
  5. RED='\033[0;31m'
  6. BLUE='\033[0;34m'
  7. RESET='\033[0m'
  8.  
  9. # Global variables for player symbols
  10. player1=""
  11. player2=""
  12. starter=""
  13.  
  14. play_game() {
  15.   # Initialize board
  16.   board=(1 2 3 4 5 6 7 8 9)
  17.   player="$starter"  # The player who starts this round
  18.   winner=""
  19.  
  20.   print_board() {
  21.     echo ""
  22.     for i in {0..8}; do
  23.       symbol="${board[$i]}"
  24.       # Colorize X and O
  25.       if [[ "$symbol" == "X" ]]; then
  26.         symbol="${RED}X${RESET}"
  27.       elif [[ "$symbol" == "O" ]]; then
  28.         symbol="${BLUE}O${RESET}"
  29.       fi
  30.  
  31.       # Print rows
  32.       printf " %b " "$symbol"
  33.       if (( (i + 1) % 3 == 0 )); then
  34.         echo ""
  35.         if (( i < 6 )); then
  36.           echo "-----------"
  37.         fi
  38.       else
  39.         printf "|"
  40.       fi
  41.     done
  42.     echo ""
  43.   }
  44.  
  45.   check_winner() {
  46.     local wins=(
  47.       "0 1 2" "3 4 5" "6 7 8"
  48.       "0 3 6" "1 4 7" "2 5 8"
  49.       "0 4 8" "2 4 6"
  50.     )
  51.  
  52.     for combo in "${wins[@]}"; do
  53.       set -- $combo
  54.       if [[ "${board[$1]}" == "$player" && "${board[$2]}" == "$player" && "${board[$3]}" == "$player" ]]; then
  55.         return 0
  56.       fi
  57.     done
  58.     return 1
  59.   }
  60.  
  61.   is_full() {
  62.     for i in "${board[@]}"; do
  63.       if [[ "$i" =~ ^[1-9]$ ]]; then
  64.         return 1
  65.       fi
  66.     done
  67.     return 0
  68.   }
  69.  
  70.   # --- Game loop ---
  71.   while true; do
  72.     clear
  73.     print_board
  74.     echo "Player $player, choose a position (1-9):"
  75.     read -r move
  76.  
  77.     # Validate input
  78.     if ! [[ "$move" =~ ^[1-9]$ ]]; then
  79.       echo "Invalid input! Choose 1–9."
  80.       sleep 1
  81.       continue
  82.     fi
  83.  
  84.     idx=$((move - 1))
  85.     if [[ "${board[$idx]}" == "X" || "${board[$idx]}" == "O" ]]; then
  86.       echo "Cell already taken!"
  87.       sleep 1
  88.       continue
  89.     fi
  90.  
  91.     # Make the move
  92.     board[$idx]=$player
  93.  
  94.     # Check for a win
  95.     if check_winner; then
  96.       clear
  97.       print_board
  98.       if [[ "$player" == "X" ]]; then
  99.         echo -e "🎉 Player ${RED}$player${RESET} wins!"
  100.       else
  101.         echo -e "🎉 Player ${BLUE}$player${RESET} wins!"
  102.       fi
  103.       winner="$player"
  104.       break
  105.     fi
  106.  
  107.     # Check for a draw
  108.     if is_full; then
  109.       clear
  110.       print_board
  111.       echo "🤝 It's a draw!"
  112.       winner="draw"
  113.       break
  114.     fi
  115.  
  116.     # Switch player
  117.     if [[ "$player" == "X" ]]; then
  118.       player="O"
  119.     else
  120.       player="X"
  121.     fi
  122.   done
  123. }
  124.  
  125. # ---- Game Start ----
  126. while true; do
  127.   clear
  128.   echo "🎾 Welcome to Tic Tac Toe!"
  129.   echo ""
  130.   echo "Player 1, choose your symbol (X or O):"
  131.   read -r choice
  132.   choice=$(echo "$choice" | tr '[:lower:]' '[:upper:]')
  133.  
  134.   if [[ "$choice" == "X" ]]; then
  135.     player1="X"
  136.     player2="O"
  137.     starter="$player1"
  138.     break
  139.   elif [[ "$choice" == "O" || "$choice" == "0" ]]; then
  140.     player1="O"
  141.     player2="X"
  142.     starter="$player1"
  143.     break
  144.   else
  145.     echo "Invalid choice! Please type X or O."
  146.     sleep 1
  147.   fi
  148. done
  149.  
  150. # ---- Main Replay Loop ----
  151. while true; do
  152.   play_game
  153.  
  154.   echo ""
  155.   echo "Play again? (y/n)"
  156.   read -r again
  157.  
  158.   if [[ "$again" =~ ^[Yy]$ ]]; then
  159.     # Determine who starts next
  160.     if [[ "$winner" == "X" || "$winner" == "O" ]]; then
  161.       starter="$winner"
  162.     else
  163.       # Alternate starter if draw
  164.       [[ "$starter" == "X" ]] && starter="O" || starter="X"
  165.     fi
  166.   else
  167.     echo "👋 Thanks for playing!"
  168.     break
  169.   fi
  170. done
  171.  
Advertisement
Add Comment
Please, Sign In to add comment