Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Colorful 2-player Tic Tac Toe with replay, player choice, and winner starts next round
- # Define colors
- RED='\033[0;31m'
- BLUE='\033[0;34m'
- RESET='\033[0m'
- # Global variables for player symbols
- player1=""
- player2=""
- starter=""
- play_game() {
- # Initialize board
- board=(1 2 3 4 5 6 7 8 9)
- player="$starter" # The player who starts this round
- winner=""
- print_board() {
- echo ""
- for i in {0..8}; do
- symbol="${board[$i]}"
- # Colorize X and O
- if [[ "$symbol" == "X" ]]; then
- symbol="${RED}X${RESET}"
- elif [[ "$symbol" == "O" ]]; then
- symbol="${BLUE}O${RESET}"
- fi
- # Print rows
- printf " %b " "$symbol"
- if (( (i + 1) % 3 == 0 )); then
- echo ""
- if (( i < 6 )); then
- echo "-----------"
- fi
- else
- printf "|"
- fi
- done
- echo ""
- }
- check_winner() {
- local wins=(
- "0 1 2" "3 4 5" "6 7 8"
- "0 3 6" "1 4 7" "2 5 8"
- "0 4 8" "2 4 6"
- )
- for combo in "${wins[@]}"; do
- set -- $combo
- if [[ "${board[$1]}" == "$player" && "${board[$2]}" == "$player" && "${board[$3]}" == "$player" ]]; then
- return 0
- fi
- done
- return 1
- }
- is_full() {
- for i in "${board[@]}"; do
- if [[ "$i" =~ ^[1-9]$ ]]; then
- return 1
- fi
- done
- return 0
- }
- # --- Game loop ---
- while true; do
- clear
- print_board
- echo "Player $player, choose a position (1-9):"
- read -r move
- # Validate input
- if ! [[ "$move" =~ ^[1-9]$ ]]; then
- echo "Invalid input! Choose 1–9."
- sleep 1
- continue
- fi
- idx=$((move - 1))
- if [[ "${board[$idx]}" == "X" || "${board[$idx]}" == "O" ]]; then
- echo "Cell already taken!"
- sleep 1
- continue
- fi
- # Make the move
- board[$idx]=$player
- # Check for a win
- if check_winner; then
- clear
- print_board
- if [[ "$player" == "X" ]]; then
- echo -e "🎉 Player ${RED}$player${RESET} wins!"
- else
- echo -e "🎉 Player ${BLUE}$player${RESET} wins!"
- fi
- winner="$player"
- break
- fi
- # Check for a draw
- if is_full; then
- clear
- print_board
- echo "🤝 It's a draw!"
- winner="draw"
- break
- fi
- # Switch player
- if [[ "$player" == "X" ]]; then
- player="O"
- else
- player="X"
- fi
- done
- }
- # ---- Game Start ----
- while true; do
- clear
- echo "🎾 Welcome to Tic Tac Toe!"
- echo ""
- echo "Player 1, choose your symbol (X or O):"
- read -r choice
- choice=$(echo "$choice" | tr '[:lower:]' '[:upper:]')
- if [[ "$choice" == "X" ]]; then
- player1="X"
- player2="O"
- starter="$player1"
- break
- elif [[ "$choice" == "O" || "$choice" == "0" ]]; then
- player1="O"
- player2="X"
- starter="$player1"
- break
- else
- echo "Invalid choice! Please type X or O."
- sleep 1
- fi
- done
- # ---- Main Replay Loop ----
- while true; do
- play_game
- echo ""
- echo "Play again? (y/n)"
- read -r again
- if [[ "$again" =~ ^[Yy]$ ]]; then
- # Determine who starts next
- if [[ "$winner" == "X" || "$winner" == "O" ]]; then
- starter="$winner"
- else
- # Alternate starter if draw
- [[ "$starter" == "X" ]] && starter="O" || starter="X"
- fi
- else
- echo "👋 Thanks for playing!"
- break
- fi
- done
Advertisement
Add Comment
Please, Sign In to add comment