Juwan Park :: 루비 행맨게임 코드 예제

루비 행맨게임 코드 예제

★프로그래밍/Ruby :: 2015.09.14 14:57

루비로 짠 행맨게임 코드 예제입니다.

필자가 중학교 때 영어수업시간에 했던 게임 중 하나로,
영어 단어를 한 글자씩 맞히고 틀리면 교수형 당하는 사람 그려지는 그 게임 맞습니다.

여기서는 루비의 문자열 값을 다루기 위한 예시로 행맨게임을 이용했습니다.

코드는 다음과 같습니다.

def init
  # 문제를 출제할 배열
  @q_list = ["KOREA", "ENGLAND", "FRANCE", "GERMANY", "ITALY", "SPAIN",
             "DENMARK", "SWEDEN", "PORTUGAL", "NORWAY", "FINLAND", "POLAND",
             "CZECH", "AUSTRIA", "ICELAND", "BELGUIM", "NETHERLANDS",
             "UNITED STATES", "CANADA", "MEXICO", "BRAZIL", "ARGENTINA",
             "COLOMBIA", "AUSTRALIA", "NEW ZEALAND", "SOUTH AFRICA", "EGYPT",
             "MOROCCO", "NIGERIA", "CAMEROON", "GHANA", "IVORY COAST", "KENYA",
             "TANZANIA", "UNITED ARAB EMIRATES", "SAUDI ARABIA"]
  @max_wrong = 10    #10번 틀리면 끝
end

def prompt(*args)
  print(*args)
  gets
end

def newgame
  @answer = @q_list.sample.upcase    # 문제 배열에서 랜덤추출+대문자화
  @viewans = ""                      # 화면에 표시할 문제 변수
  for i in 0..(@answer.size - 1)
    # 글자가 들어갈 자리를 밑줄로 표시
    if @answer[i] == " "
      @viewans += " "
    else
      @viewans += "_"
    end
  end
  
  # a부터 z까지 입력줄 저장
  aa = " a".upto(" z").to_a
  @a_list = ""
  for i in 0..(aa.count - 1)
    @a_list += aa[i]
  end
  
  @wrong = 0          #오답 횟수 초기화
  @success = false    #성공 여부 저장
  @w_list = ""        #오답들 저장
end

def ingame
  puts
  puts sprintf(" [ %s ]", @viewans)
  puts sprintf(" 보기: %s", @a_list)
  puts sprintf(" - 현재 오답 횟수: %d회 (%d회 오답시 실패)",
    @wrong, @max_wrong)
  @ch = prompt " - 글자를 고르세요. (A-Z): "

  cc = @ch[0].downcase
  if cc.strip == ""
    #아무것도 안 적은 경우
    puts " 고를 글자가 입력되지 않았습니다."
  elsif @a_list.include? cc
    #보기에서 적은 경우
    if @answer.include? cc.upcase
      #정답
      @a_list.gsub!(cc, cc.upcase)
      for i in 0..(@answer.size - 1)
        @viewans[i] = @answer[i] if @answer[i] == cc.upcase
      end
      @success = true if !@viewans.include? "_"
    else
      #오답
      @a_list.gsub!(cc, "-")
      @wrong += 1
      @w_list += cc
    end
  elsif (@a_list.include? cc.upcase) || (@w_list.include? cc)
    #이미 나온 답
    puts " 이미 선택된 답입니다."
  else
    puts " 잘못 입력하셨습니다."
  end
end

quit = false

init
begin
  newgame
  begin
    ingame
    #성공 혹은 일정 횟수 이상 오답까지 반복
  end while (@wrong < @max_wrong) && !@success
  
  puts
  if @success
    puts " 축하합니다! 성공하셨습니다!"
  else
    puts " 안타깝게도 실패하셨습니다!"
  end
  puts sprintf(" 정답은 %s입니다.", @answer)

  q = prompt " 다시 하시겠습니까? (Y/N): "
  quit = true if q[0].upcase != "Y"  #Y가 아니면 끝냄
end while !quit

여기서는 단지 예를 들기 위해 출제될 단어들을 코드 안에 넣었지만 실제로는 외부 파일에 저장해 놓고 불러오는 것도 가능합니다.

아래는 이 코드를 실행한 스크린샷입니다.

유용하게 활용하시기 바랍니다.

Today 5    Yday 37    Tot 65,556
Juwan Park
Juwan Park's blog is powered by Daum and TISTORY.
Contemporary Blue for TISTORY.
Designed by Juwan Park. Creative Commons License
▲ TOP