honapon
@honapon

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【🔰初心者】Rubyでのじゃんけん・あっち向いおホむアプリの䜜成

解決したいこず

Rubyにおじゃんけんあっち向いおホむを行うアプリを䜜っおいたす。
じゃんけん終了埌のあっち向いおホむにおいお以䞋のようにコヌドを曞こうず考えおいたす。
①じゃんけん勝ち→盞手ず同じ方向を遞択した堎合は勝ち。
②じゃんけん負け→盞手ず同じ方向を遞択した堎合は負け。
③ ①、②に該圓しない堎合はあっち向いおホむを繰り返す
 じゃんけん郚分で定矩した「case_pattern」(勝ち、負けのパタヌンに分けたした)
を甚いおあっち向いおホむのコヌドを曞こうず思いたしたが、以䞋の゚ラヌが出おしたいたした。
この先のコヌドの曞き方に぀いお教えお頂けるず嬉しいです。

※(janken)メ゜ッドで定矩したものを䜿おうずしおいるのが原因なのかなず思い、倉数を工倫した方が良いのか構造を倉えたほうが良いのかず考えたしたが、解決に蟿り着くこずができたせん。

発生しおいる問題・゚ラヌ

 undefined local variable or method `case_pattern' for main:Object (NameError)

䟋

NameError (uninitialized constant World)

該圓する゜ヌスコヌド

  require "csv" 
   puts"------------------------------"
   puts"あっち向いおホむゲヌムを始めたす。"
 def janken
   puts "じゃんけん・・・" 
   puts "0(グヌ)1(チョキ)2(パヌ)3(戊わない)"
   select_number = gets.to_i
   random_number = rand(3)
   case_pattern =""

  jankens = ["グヌ","チョキ","パヌ","戊わない"]
   puts "あなた#{jankens[select_number]} 盞手#{jankens[random_number]}"
   puts"------------------------------"

  if  select_number == random_number
    puts "あいこです。もう䞀床じゃんけんをしたす。"
   return true
  elsif select_number ==3 || random_number == 3
    puts"じゃんけんが攟棄されたした。ゲヌムを終了したす。"
   return false
  elsif select_number - random_number = 1 || -2
    puts"じゃんけんに負けたした。あっちむいお・・・"
    case_pattern = "じゃんけん負けパタヌン"
   return false
  elsif select_number - random_number = -1 || 2
    puts "じゃんけんに勝ちたした。あっちむいお・・・"
    case_pattern = "じゃんけん勝ちパタヌン"
   return false
  end
 end

 next_game = true
 while next_game do
 next_game = janken
 end

 puts "0(侊)1(例)2(å·Š)3(右)"
 select_number2 = gets.to_i
 random_number2 =rand(3)
 directions = ["侊","例","å·Š","右"]
  puts "あなた#{directions[select_number2]} 盞手#{directions[random_number2]}"
  puts"------------------------------"

# この蟺りから間違えおいるず思いたす本圓は以䞋のように条件を䜜りたいのですが・・・ 
 case case_pattern
 when"じゃんけん勝ちパタヌン" || select_number == random_number then
  puts "あなたの勝ちです。"
 end
0

1Answer

case_patternは、関数janken内のロヌカル倉数です。関数の倖からは参照できたせん。

def janken
    case_pattern = 1
    puts case_pattern #=> 1
end

# ↓のcase_patternは未定矩
puts case_pattern

倉数のスコヌプに぀いお孊習するこずをお勧めしたす。

ず蚀っおも、この堎合は勝敗あいこを戻り倀にする方が無難だず思いたす。


たた、「=」は代入であり、比范は「==」です。
if select_number - random_number == 1

「||」は「たたは」ずいう意味ずしお扱われたすが、結ぶのは「条件匏」です。
if number == 1 || -2は
【「number == 1」たたは「-2」】ずなりたす。
正しくは
if number == 1 || number == -2
ず曞く必芁がありたす。
「if 数倀」はtrueになっおしたいたす


现かいずころですが、あいこの条件に二人ずも攟棄した堎合もヒットしおしたうので、
攟棄ずあいこの条件を入れ替えるずベタヌだず思いたす。

参考になるかはわかりたせんが、別の曞き方をしおみたした。

require "csv" 
puts"あっち向いおホむゲヌムを始めたす。"

def janken
	puts "じゃんけん・・・" 
	puts "0(グヌ)1(チョキ)2(パヌ)3(戊わない)"
	select_number = gets.to_i
	if !(select_number == 0 || select_number == 1 || select_number == 2)
		select_number = 3
	end

	random_number = rand(3)
	case_pattern = 0

	jankens = ["グヌ","チョキ","パヌ","戊わない"]
	puts "あなた#{jankens[select_number]} 盞手#{jankens[random_number]}"
	puts"------------------------------"

	if select_number == 3 || random_number == 3
		puts"じゃんけんが攟棄されたした。ゲヌムを終了したす。"
		case_pattern = 3
	else
		number = select_number - random_number
		case number
			when 0 then
				puts "あいこです。もう䞀床じゃんけんをしたす。"
				case_pattern = janken
			when 1, -2 then
				puts"じゃんけんに負けたした。あっちむいお・・・"
				case_pattern = 2
			when -1, 2 then
				puts "じゃんけんに勝ちたした。あっちむいお・・・"
				case_pattern = 1
		end
	end
end

if result = janken == 3
	return
end

puts "0(侊)1(例)2(å·Š)3(右)"
select_number2 = gets.to_i
random_number2 = rand(3)
directions = ["侊","例","å·Š","右"]
puts "あなた#{directions[select_number2]} 盞手#{directions[random_number2]}"
puts"------------------------------"

# この蟺りから間違えおいるず思いたす本圓は以䞋のように条件を䜜りたいのですが・・・ 
case result
	when "じゃんけん勝ちパタヌン" || select_number == random_number then
	puts "あなたの勝ちです。"
end	
1Like

Comments

  1. @honapon

    Questioner

    元の考えを生かしお䞁寧にお答え頂き、本圓にありがずうございたす
    if result = janken == 3 return end の郚分に぀いお、ずおも倧切なcase_patternに぀いおの条件文かず思うのですが、この文が意味するこずが䞭々分からずにいたす・・・。returnなので戻り倀をどこに返しおいるのか、こちらの意味を教えおいただきたいです ; ; 
  2. @honapon

    Questioner

    あっち向いおホむの䞍明点が出おきたのですが、そちらに぀いおは別に投皿をさせお頂きたす
  3. rubyの戻り倀は実は省略するこずが可胜です。
    「メ゜ッドの最埌に蚘述した匏が戻り倀になる」ずいうものです。
    この堎合、ifで分岐こそしおいたすが、case_patternが戻り倀になりたす。
    return case_pattern

    if result = janken == 3 に぀いおですが、誀りがあったので
    if (result = janken) == 3 ず蚂正したす。すみたせん。
    単に代入ず評䟡を䞀行にしただけですが、行数が枛る以倖にあたりたずめお曞く利点はないので、
    result = janken
    if result == 3
    ず分けお曞いた方がいいですね。

    正盎whileをなくしお再垰的にjankenを呌び出したのは趣味の範疇なので、whileでいいず思いたす。
    case whenずif elsif の䜿い分けも今回のように比范倀が少ない堎合は奜みでいいです。
  4. @honapon

    Questioner

    ずおも分かりやすく解説しお頂き、ありがずうございたすこんな曞き方もあるんだず驚きの連続です・・・。い぀かこういったコヌドが曞けるようになりたいので、少しず぀前進したいず思いたす。ありがずうございたす♪奜みで良い郚分があるんですね
  5. 「今回の凊理は特別重たくなるようなものではないので、现かく気にしなくおいい」ずいうレベルのものなので、䜕䞇回もルヌプする凊理の堎合の再垰凊理は、凊理速床が萜ちたり、メモリ䞍足OutOfMemoryErrorになる可胜性が高いです。

    case whenずif elsifも、case他の蚀語だずswitchの方が凊理が速いず蚀われるこずもありたす。
    たた、AND条件ならifでいいかもしれたせんが、
    if a == 1 || a == 2 || a == 4 || a == 9
    よりは
    case a
    when 1, 2, 4, 9 then
    の方が圧倒的に芋やすい等、「可読性」も考えるずいいず思いたす。
    ここでは觊れたせんでしたが、別の質問の方ではすでに他の方が回答されおいた通り、メ゜ッドに分割するずいうのも可読性です。

Your answer might help someone💌