Home

Archivos

Buscar

Categorías

Feeds:

RSS / Atom

Programación: Ahorcado· 1. June 2008, 20:44

Esta es una versión de ahorcado que hice el mes pasado mientras esperaba que Z terminara de trabajar en su cierre. Hasta eso esta entretenido. Lo más tardado fué encontrar un diccionario decente y usable en formato de texto

require 'Win32API'
def getkey
  (Win32API.new("crtdll", "_getch", [], "L").Call)
end
DEBUG=nil
INTERACTIVE=1
SHOW_ON_LOSE=1
class Ahorcado
  ETAPAS=['','O','O+','O+-','O+-/','O+-<']
  LETRAS=('a'..'z').to_a
  def initialize
    @etapa=0
    @dicc=genera_diccionario
    @palabra=elegir_palabra
    @preguntadas=[]
    @estatus=0
    p @palabra if DEBUG
  end
  def juega
    puts self
    while @estatus==0
      letra=obtener_letra
      turno(letra)
    end
    puts "\nLa palabra era #{@palabra.join().upcase}" if (@estatus==-1 and SHOW_ON_LOSE)
    return @estatus
  end  
  private
  def genera_diccionario
    File.open("diccionario.txt","r").read.split(' ')
  end
  def obtener_letra
    if INTERACTIVE
      print "Siguiente letra: "
      x=getkey.chr
      puts x
      puts
      x
    else
      LETRAS[rand(LETRAS.length)]
    end
  end  
  def turno(letra)
    @preguntadas.push(letra)
    @etapa+=1 unless @palabra.include?(letra)
    puts self
    @estatus=evaluar_posicion
  end
  def to_s
    st=""
    @palabra.each do |a| 
      st+= @preguntadas.include?(a) ? "#{a} " : "_ "
    end
    st+="  "+ETAPAS[@etapa]+"\nPreguntadas: "+@preguntadas.uniq.sort.join(" ")+"\nFaltan: "+(LETRAS-@preguntadas).join(" ")+"\n"
  end
  def elegir_palabra
    return @dicc[rand(@dicc.length)].downcase.split("")
  end
  def evaluar_posicion
    return 1 if (@palabra-@preguntadas).empty?
    return -1 if @etapa==ETAPAS.length-1
    return 0
  end
end
if __FILE__ == $0
  while true
    puts "Juguemos a.... Ahorcados"
    x=Ahorcado.new
    r=x.juega
    puts "Ganaste!" if r==1
    puts "Perdiste!" if r==-1
    puts "\nJugar de nuevo? (s/n)"
    break unless getkey.chr.downcase == "s"
  end
end