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 25    Yday 68    Tot 71,746
Juwan Park
Juwan Park's blog is powered by Daum and TISTORY.
Contemporary Blue for TISTORY.
Designed by Juwan Park. Creative Commons License
▲ TOP