Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 16th, 2010 | Syntax: Bash | Size: 8.99 KB | Hits: 57 | Expires: Never
Copy text to clipboard
  1. #! /bin/bash
  2.  
  3. # -----------------------------------------------
  4. # Dibujado de tablero
  5. # -----------------------------------------------
  6.  
  7. dibujaFila1()
  8. {
  9.  
  10.         echo "| $1 | $2 | $3 |";
  11. }
  12. dibujaFila2()
  13. {
  14.         echo "|---+---+---|"
  15. }
  16.  
  17.  
  18. dibujaTablero()
  19. {
  20.         # Toda esta basura del IFS la he tenido que meter para poder leer el array
  21.         # desde dentro de la función, si no, no funciona.
  22.  
  23.         OLD_IFS=$IFS
  24.         IFS=''
  25.         tab2=$1
  26.         local array_string="$1[*]"
  27.         local tab=(${!array_string})
  28.         IFS=$OLD_IFS
  29.        
  30.        
  31.  
  32.         echo " ----------- "
  33.         dibujaFila1 ${tab[0]} ${tab[1]} ${tab[2]}
  34.         dibujaFila2
  35.         dibujaFila1 ${tab[3]} ${tab[4]} ${tab[5]}
  36.         dibujaFila2
  37.         dibujaFila1 ${tab[6]} ${tab[7]} ${tab[8]}
  38.         echo " ----------- "
  39.         echo
  40. }
  41.  
  42. # -----------------------------------------------
  43. # Elección de posición
  44. # -----------------------------------------------
  45.  
  46. # Ok
  47. eligePosMaquina()
  48. {
  49.         # Hacemos aleatorios:
  50.         fila=$(($RANDOM % 3))
  51.         columna=$(($RANDOM % 3))
  52.         return $((3*$fila+$columna))
  53. }
  54.  
  55. # Ok
  56. eligePosJugador()
  57. {
  58.  
  59.         fila=0
  60.         until test $fila -ge 1 && test $fila -le 3; do
  61.                 echo "Introduzca una fila [1-3]:"
  62.                 read fila
  63.         done
  64.         columna=0
  65.  
  66.         until test $columna -ge 1 && test $columna -le 3; do
  67.                 echo "Introduzca una columna [1-3]:"
  68.                 read columna
  69.         done
  70.        
  71.         fila=$(($fila-1))
  72.         columna=$(($columna-1))
  73.         return $((3*$fila+$columna))
  74. }
  75.  
  76.  
  77. #eval echo \${$array_name[$i]}
  78.  
  79. # -----------------------------------------------
  80. # Comprobaciones de 3 en raya
  81. # -----------------------------------------------
  82.  
  83. compruebaColumnas()
  84. {
  85.         OLD_IFS=$IFS
  86.         IFS=''
  87.         tab2=$1
  88.  
  89.         local array_string="$1[*]"
  90.         local tab=(${!array_string})
  91.  
  92.         IFS=$OLD_IFS
  93.  
  94.         local fila=0
  95.         local columna=0
  96.         local patron="."
  97.         local posicion=0
  98.         local encontrado=0 # 1 si 3 en raya, 0 si no.
  99.        
  100.         while test $encontrado -eq 0 && test $columna -lt 3; do
  101.  
  102.                 posicion=$((3*$fila+$columna))
  103.                
  104.  
  105.                 if test ${tab[$posicion]} = "."; then
  106.                         columna=$(($columna+1))
  107.                         fila=0
  108.                         posicion=$((3*$fila+$columna))
  109.                         #echo "Pasando a la siguiente columna."
  110.                 else
  111.                         #echo "El patrón a seguir es ${tab[$posicion]}"
  112.                         patron=${tab[$posicion]}
  113.                         fila=$(($fila+1))
  114.                         posicion=$((3*$fila+$columna))
  115.  
  116.                         if test ! ${tab[$posicion]} = $patron; then
  117.                                 columna=$(($columna+1))
  118.                                 fila=0
  119.                                 posicion=$((3*$fila+$columna))
  120.                                 #echo "Pasando a la siguiente columna."
  121.                         else
  122.                                 fila=$(($fila+1))
  123.                                 posicion=$((3*$fila+$columna))
  124.                                 if test ! ${tab[$posicion]} = $patron; then
  125.                                         columna=$(($columna+1))
  126.                                         fila=0
  127.                                         posicion=$((3*$fila+$columna))
  128.                                         #echo "Pasando a la siguiente columna."
  129.                                 else
  130.                                         #echo "Patrón encontrado"
  131.                                         encontrado=1                           
  132.                                 fi
  133.                         fi
  134.                 fi
  135.         done
  136.         return $encontrado
  137. }
  138.  
  139. compruebaFilas()
  140. {
  141.         OLD_IFS=$IFS
  142.         IFS=''
  143.         tab2=$1
  144.  
  145.         local array_string="$1[*]"
  146.         local tab=(${!array_string})
  147.  
  148.         IFS=$OLD_IFS
  149.  
  150.         local fila=0
  151.         local columna=0
  152.         local patron="."
  153.         local posicion=0
  154.         local encontrado=0 # 1 si 3 en raya, 0 si no.
  155.        
  156.         while test $encontrado -eq 0 && test $fila -lt 3; do
  157.  
  158.                 posicion=$((3*$fila+$columna))
  159.                
  160.  
  161.                 if test ${tab[$posicion]} = "."; then
  162.                         fila=$(($fila+1))
  163.                         columna=0
  164.                         posicion=$((3*$fila+$columna))
  165.                         #echo "Pasando a la siguiente fila."
  166.                 else
  167.                         #echo "El patrón a seguir es ${tab[$posicion]}"
  168.                         patron=${tab[$posicion]}
  169.                         columna=$(($columna+1))
  170.                         posicion=$((3*$fila+$columna))
  171.  
  172.                         if test ! ${tab[$posicion]} = $patron; then
  173.                                 fila=$(($fila+1))
  174.                                 columna=0
  175.                                 posicion=$((3*$fila+$columna))
  176.                                 #echo "Pasando a la siguiente fila."
  177.                         else
  178.                                 columna=$(($columna+1))
  179.                                 posicion=$((3*$fila+$columna))
  180.                                 if test ! ${tab[$posicion]} = $patron; then
  181.                                         fila=$(($fila+1))
  182.                                         columna=0
  183.                                         posicion=$((3*$fila+$columna))
  184.                                         #echo "Pasando a la siguiente fila."
  185.                                 else
  186.                                         #echo "Patrón encontrado"
  187.                                         encontrado=1                           
  188.                                 fi
  189.                         fi
  190.                 fi
  191.         done
  192.         return $encontrado
  193. }
  194.  
  195. compruebaDiagonales()
  196. {
  197.         OLD_IFS=$IFS
  198.         IFS=''
  199.         tab2=$1
  200.  
  201.         local array_string="$1[*]"
  202.         local tab=(${!array_string})
  203.  
  204.         IFS=$OLD_IFS
  205.  
  206.  
  207.  
  208.         if test ! ${tab[0]} = "." && test ${tab[0]} = ${tab[4]} && test ${tab[4]} = ${tab[8]}; then
  209.                 return 1
  210.         fi
  211.  
  212.         if test ! ${tab[2]} = "." && test ${tab[2]} = ${tab[4]} && test ${tab[4]} = ${tab[6]}; then
  213.                 return 1
  214.         fi     
  215.        
  216.         return 0
  217.        
  218.  
  219.        
  220. }
  221.  
  222. tresEnRaya()
  223. {
  224.         OLD_IFS=$IFS
  225.         IFS=''
  226.         tab2=$1
  227.  
  228.         local array_string="$1[*]"
  229.         local tab=(${!array_string})
  230.  
  231.         IFS=$OLD_IFS
  232.  
  233.         # Algoritmo:
  234.        
  235.         # - Miramos si hay 3 en raya en las filas
  236.         compruebaFilas tab
  237.         encontrado=$?
  238.  
  239.         if test $encontrado -eq 1; then
  240.                 return 1
  241.         fi
  242.  
  243.         # - Miramos si hay 3 en raya en las columnas
  244.         compruebaColumnas tab
  245.         encontrado=$?
  246.  
  247.         if test $encontrado -eq 1; then
  248.                 return 1
  249.         fi
  250.        
  251.         # - Miramos si hay 3 en raya en las diagonales
  252.  
  253.         compruebaDiagonales tab
  254.         encontrado=$?
  255.         return $encontrado
  256. }
  257.  
  258. # -----------------------------------------------
  259. # Tareas de principio de partida
  260. # -----------------------------------------------
  261.  
  262. eligeFicha()
  263. {
  264.         # Otro de los pocos métodos donde necesitamos usar variables globales
  265.         # La razón es por no ensuciar el código de fuera, ya que tenemos dos variables de retorno: fichaJugador y fichaMaquina, y bash no permite devolver cadenas, solo enteros, lo que implicaría tener que meter cases de conversión fuera etc....
  266.         seleccion=0
  267.         echo "Qué fichas desea manejar (cruz o círculo)?"
  268.         local ok2=0
  269.         while test $ok2 -eq 0; do
  270.                 read seleccion
  271.  
  272.                 # todos los trs de las ies para filtrar ies con tilde o sin tilde.
  273.                 case `echo $seleccion | tr -s 'í' 'I' | tr -s 'Í' 'I' | tr -s '[a-z]' '[A-Z]'` in
  274.                         CRUZ)
  275.                                 fichaJugador="x"
  276.                                 fichaMaquina="o"
  277.                                 ok2=1;;
  278.  
  279.                         CIRCULO)
  280.                                 fichaJugador="o"
  281.                                 fichaMaquina="x"
  282.                                 ok2=1;;
  283.                         *)      echo "Introduzca una opción válida";;
  284.                
  285.                 esac
  286.         done
  287. }
  288.  
  289. eligeTurno()
  290. {
  291.         local ok2=0
  292.         local turno2=0
  293.         echo "Desea colocar primero (si o no)?"
  294.         while test $ok2 -eq 0; do
  295.                 read seleccion
  296.                 case `echo $seleccion | tr -s 'í' 'I' | tr -s 'Í' 'I' | tr -s '[a-z]' '[A-Z]'` in
  297.                         SI)    
  298.                                 turno2=1
  299.                                 ok2=1;;
  300.                         NO)    
  301.                                 turno2=2
  302.                                 ok2=1;;
  303.                         *)      echo "Introduzca una opción válida";;
  304.                 esac
  305.         done
  306.         return $turno2
  307. }
  308.  
  309. # -----------------------------------------------
  310. # Tareas de fin de partida
  311. # -----------------------------------------------
  312.  
  313. ganador()
  314. {
  315.         local turno2=$1
  316.         if test $turno2 -eq 1; then
  317.                 echo "La máquina gana!!"
  318.         else
  319.                 echo "Usted gana!!"
  320.         fi
  321. }
  322.  
  323. reseteaTablero()
  324. {
  325.         # Este es el único método que tenemos que usar variables globales por huevos
  326.         # ya que no conseguimos encontrar la forma de que las modificaciones desde
  327.         # dentro se apliquen a un array externo.
  328.         tablero[0]="."
  329.         tablero[1]="."
  330.         tablero[2]="."
  331.         tablero[3]="."
  332.         tablero[4]="."
  333.         tablero[5]="."
  334.         tablero[6]="."
  335.         tablero[7]="."
  336.         tablero[8]="."
  337. }
  338.  
  339. nuevaPartida()
  340. {
  341.         OLD_IFS=$IFS
  342.         IFS=''
  343.         tab2=$1
  344.  
  345.         local array_string="$1[*]"
  346.         local tab=(${!array_string})
  347.      
  348.         IFS=$OLD_IFS
  349.        
  350.         local ok2=0
  351.         local final=1
  352.         local seleccion2=""
  353.         echo "¿Desea jugar de nuevo? (si o no)"
  354.         while test $ok2 -eq 0; do
  355.                 read seleccion2
  356.                 case `echo $seleccion2 | tr -s 'í' 'I' | tr -s 'Í' 'I' | tr -s '[a-z]' '[A-Z]'` in
  357.                         SI)    
  358.                                 final=0
  359.                                 ok2=1
  360.                                 reseteaTablero;;
  361.                         NO)
  362.                                 ok2=1
  363.                                 echo "Adios.";;
  364.                         *)      echo "Introduzca una opción válida";;
  365.                 esac
  366.         done
  367.         return $final
  368. }
  369.  
  370.  
  371. # Inicialización del tablero
  372.  
  373. # Indispensable inicializarlos con puntitos para que no desordene
  374. # el array ni reduzca los espacios en blanco.
  375. tablero[0]="."
  376. tablero[1]="."
  377. tablero[2]="."
  378. tablero[3]="."
  379. tablero[4]="."
  380. tablero[5]="."
  381. tablero[6]="."
  382. tablero[7]="."
  383. tablero[8]="."
  384.  
  385.  
  386. # ----------------------------------------------------------------
  387. # Programa principal
  388. # ----------------------------------------------------------------
  389.  
  390.  
  391. fichaJugador=""
  392. fichaMaquina=""
  393.  
  394. clear
  395. echo "Bienvenido a las tres en raya."
  396.  
  397. eligeFicha
  398. turno=0
  399. eligeTurno
  400. turno=$?
  401. clear
  402.  
  403. # ---------------------------------
  404. # Bloque principal del algoritmo
  405. # ---------------------------------
  406.  
  407. fin=0
  408. dibujaTablero tablero
  409. while test $fin -eq 0; do
  410.         libre=1
  411.         # libre: 0 si está ocupada, 1 si está vacía.
  412.         while test ! $libre -eq 0; do
  413.                
  414.  
  415.                 # Vemos de quien es el turno y ejecutamos un algoritmo
  416.                 # u otro.
  417.                 if test $turno = 1; then
  418.                         eligePosJugador
  419.                         posicion=$?
  420.                 else
  421.                         eligePosMaquina
  422.                         posicion=$?
  423.                 fi
  424.  
  425.                 # Si estuviese vacía, este test daría 0 y saldría del bucle
  426.                 test  ${tablero[posicion]} = "."
  427.                 libre=$?
  428.         done
  429.        
  430.         # Ponemos la ficha correspondiente en la casilla elegida.
  431.         if test $turno -eq 1; then
  432.                 tablero[posicion]=$fichaJugador
  433.         else
  434.                 tablero[posicion]=$fichaMaquina
  435.         fi
  436.  
  437.         # Cambiamos el turno
  438.         if test $turno -eq 1; then
  439.                 turno=2
  440.         else
  441.                 turno=1
  442.         fi
  443.  
  444.         # Estas son las 2 últimas sentencias para hacerlo parecido a
  445.         # un do...while
  446.         clear
  447.         dibujaTablero tablero
  448.         tresEnRaya tablero
  449.         fin=$?
  450.         if test $fin -eq 1; then
  451.                 ganador $turno
  452.                 nuevaPartida tablero
  453.                 fin=$?
  454.                 if test $fin -eq 0; then
  455.                         clear
  456.                         eligeFicha
  457.                         turno=0
  458.                         eligeTurno
  459.                         turno=$?
  460.                         clear  
  461.                 fi
  462.         fi
  463.        
  464.        
  465. done