質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2133閲覧

二次元配列を用いて複数人でのじゃんけんプログラムを実現したい。

nori0519

総合スコア16

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/11/23 08:30

前提・実現したいこと

 Rubyで複数人によるジャンケンプログラムを作っています。
実現したい機能としては、
・三人以上のプレイヤー(最大100人まで)でじゃんけんを行う。
・人数は自由に決めることができる。(可変長)
・その人数でじゃんけんを100回行いその結果(何で何回勝ったのかあるいは何回ひきわけたのか)を出力する。
、 
そこで、二つ目の機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

janken.rb:22:in `block (2 levels) in <main>': undefined method `[]' for nil:NilClass (NoMethodError)

該当のソースコード

Ruby

1 2puts "ジャンケンを開始します。" 3count_rock = 0 4count_scissors =0 5count_paper =0 6 7count_r_w =0 8count_s_w =0 9count_p_w =0 10count_draw =0 11 12player =[][3..100] 13 14 15for i in 0..99 do 16 puts "対戦する人数を教えてください。" 17 num = gets.to_i 18 19 for j in 1..num do 20 21 player[i][j] = rand(0..999)%3 22 if player[i][j]==0 23 count_rock+=1 24 elsif player[i][j]==1 25 count_scissors+=1 26 else 27 count_paper+=1 28 end 29 30 #puts "#{plyer[i][j]}" 31 32 if j==num 33 if count_rock==num 34 count_draw+=1 35 elsif count_scissors==num 36 count_draw+=1 37 elsif count_paper==num 38 count_draw+=1 39 elsif count_rock==0&&count_scissors !=num 40 count_s_w+=1 41 elsif count_scissors==0&&count_paper !=num 42 count_p_w+=1 43 elsif count_paper==0&&count_rock !=num 44 count_r_w+=1 45 else 46 count_draw+=1 47 end 48 49 count_rock =0 50 count_scissors =0 51 count_paper =0 52 53 puts("#{j}人 グー チョキ パー 引き分け") 54 puts("勝数 #{count_rock}#{count_scissors}#{count_paper}#{count_draw}回") 55 puts("________________________________________________________________________") 56 end 57 end 58end

試したこと

二次元配列の宣言があまりよくわからずいろいろ調べましたが、結果わからないままです。

補足情報(FW/ツールのバージョンなど)

Ruby

1ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

20行目がわかりにくいですが多分player[i][j] = rand(0..999)%3ですね?playerの初期化が不十分でplayer[i]がnilにな所に差し掛かってそのエラーになります。
1..num の範囲で、player[i]=Ary.new しておけば通るかと

投稿2019/11/23 09:04

winterboum

総合スコア23360

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nori0519

2019/11/23 09:09

ご回答ありがとうございます。 はい、おっしゃる通りです。 なるほど、 ``` for j in 1..num do player[i]=Ary.new player[i][j] = rand(0..999)%3 ``` ということでしょうか。
winterboum

2019/11/23 09:51

いつ初期化するかはいろいろありますが、そのcodeでもエラーにはならないです。
nori0519

2019/11/23 10:19

返信ありがとうございます。 ``` for i in 0..99 do player = Array.new(i) for j in 1..num do player[i]=Array.new(j) player[i][j] = rand(0..999)%3 ``` このようにするとうまくいきました。 非常に参考になるご回答をしていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問