
今回は複数の配列をループさせてDictionaryにkeyとvalueをセットで格納していく方法を試してみたいと思います。
トランプをイメージして作って見ました。
今回プレイヤーは2人です。
全てのカードを交互に配ったら、ランダムにハート、クラブ、ダイヤ、スペードのカードが配られると思います。
その結果をプレイヤー1とプレイヤー2で分けて下記のようにDictionaryに格納したいと思います。
プレイヤー1
[“heart”: [3, 7, 12, 4, 11, 13, 9], “club”: [11, 6, 4, 9, 8, 1, 12], ”diamond”: [8, 5, 10, 13, 12, 2], “spade”: [7, 5, 9, 6, 11, 2] ]
プレイヤー2
[ “heart”: [2, 5, 10, 1, 6, 8], “club”: [13, 7, 3, 10, 5, 2], “diamond”: [9, 6, 7, 4, 11, 3, 1] “spade”: [10, 4, 8, 3, 12, 13, 1] ]
var heart = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var club = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var diamond = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var spade = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
var player1: [String: [Int]] = [:]
var player2: [String: [Int]] = [:]
var n = 0
func start() {
shuffle(cards: heart, mark: "heart")
shuffle(cards: spade, mark: "spade")
shuffle(cards: club, mark: "club")
shuffle(cards: diamond, mark: "diamond")
print(player1)
print(player2)
}
func shuffle(cards: [Int], mark: String) {
let shuffleCards = cards.shuffled()
for value in shuffleCards {
if n % 2 == 0 {
player1[mark] = player1[mark] ?? []
player1[mark]!.append(value)
n += 1
} else {
player2[mark] = player2[mark] ?? []
player2[mark]!.append(value)
n += 1
}
}
}
start()
1〜4行目でマーク毎に4つの配列を作成しました。
5〜6行目でplayer1とplayer2分けてDictionaryを作成しました。
マーク毎に配列をループさせてplayer1とplayer2に格納していきます。
9行目〜16行目がそれに当たります。
ここではstart()と言う関数名にしています。
このstart()の中では後で出てくる、shuffle()と言う関数を実行するようになっています。
それぞれ実行された後にplayer1とplayer2の中身をプリントして表示させています。
18行目〜32行目では関数start()の中に出てくる関数shuffle()の中身を書いています。
順番に説明していきます。
18行目でまず宣言していて、shuffle()の引数cards:の部分に配列、mark:の部分にマーク名がくるように書きます。
10行目に書いてるshuffle(cards: heart, mark: “heart”)を例にすると、cards: heartとなっているのでcardsに配列heartが代入されて、mark: “heart”となっているのでmarkに”heart”が代入されています。
19行目ではcardsをシャッフルしてshuffleCardsに代入しています。
配列名.shuffled()で配列がシャッフルされます。
10行目を例にすると配列heartがランダムされてshuffleCardsに代入されました。
21行目で、for分を使いshuffleCardsをループさせます!
22行目でplayer1とplayer2に交互に配る為の条件分岐を書いています。
簡単に説明すると、変数nが2で割れる場合はplayer1へ、割れない場合はplayer2へ処理を分岐しています。
23行目と24行目で詰まりました、、、
最初は23行目は書かずに24行目のplayer1[mark]!.append(value)だけ書いていましたが、それだとエラーになりました。
色々調べると、player1[mark]がnilだからappendは無視されると言う事でした。
それで解決策が23行目です、player1[mark]が??(nil)の場合[]初期化してねって処理をしてあげると追加できました。
ここの処理はif文の方が理解しやすかったのでif文での書き方も載せておきます。
if文ではplayer1[mark]がnilの場合player1[mark] = [value]で一個だけ値を代入しておきます。
これで2回目以降のループはnilじゃなくなるのでplayer1[mark]!.append(value)が無視されなくなり、追加する事ができました!
if player1[mark] == nil {
player1[mark] = [value]
} else {
player1[mark]!.append(value)
}
まだまだ初心者なのでこれくらいの事で行き詰まってしまうけど、この格闘が無駄じゃない事を信じたい・・・
もっとスマートな方法があればご教授お願いします!
コメントを残す