OS XおよびiOSの新しい開発言語Swiftが発表されました。今後はSwiftが主流になるだろうからボチボチと勉強を始めました。とりあえず、慣れる事が必要だろうとiBooksで配布されているリファレンスを読み始め、載っているコードを順番に実際に入力して(コピペせずに)進めて来たけど、なかなかはかどりません。
なので、簡単なゲーム「Master Mind」を作ってみる事にしました。Master Mindは任意の桁数(3や4)の0~9までの数字を1回だけ使ったものを当てるというものです。
コンピュータ側が指定した桁数の数字を考え、プレーヤーが「これだ」と入力した物と比較して、同じ数字で同じ位置の場合Hit、同じ数字だけど位置が違う場合はBlowでその個数をヒントとして表示します。
例えば、答えが「1234」の場合、プレーヤーが「0134」と入力した場合、Hit: 2 (3と4), Blow: 1(1)となります。
まず必要になるのは、コンピュータが指定した桁数でランダムな数字を作成する処理。
func createRandomNumber (length: Int) -> String
{
var seed: String = "0123456789"
var number: String = ""
for _ in 0..length {
var index = Int (arc4random_uniform (10)) % seed.length ()
number = number + seed.substringAt (index: index)
seed = seed.remove (from: index, length: 1)
}
return number
}
0から9までの乱数を発生させて、seed文字列から任意の場所の文字を1つずつ取り出してnumber文字列に足して行く処理をしています。
for文の書き方も最初はvar i: Int = 0;とか書いてたけど、サンプルで見つけた書き方をまねてみました。この場合length未満になるのがちょっとしっくりこない。length以下の方がいいな(^^;
ここでの疑問。StringはObjective-CでいうMutalbleなのか?Stringのリファレンスを調べても、任意の位置の文字を削除する処理が見つかりません。そこで、任意の範囲の文字を削除するための関数remove()と任意の位置の文字を調べる関数substringAt()をStringクラスに拡張する事に。また、文字数を返す関数も無い(countElements(“abc”)を使うらしい)のでlength ()を追加。
extension String {
func length () -> Int {
return (countElements (self))
}
func substring (#from: Int, length: Int) -> String {
let intermediate = self.substringFromIndex (from)
return intermediate.substringToIndex(length)
}
func substringAt (#index: Int) -> String {
return self.substring(from: index, length: 1)
}
func remove (#from: Int, length: Int) -> String {
let left = self.substringToIndex(from)
let right = self.substringFromIndex(from + length)
return (left + right)
}
func removeCharAt (index: Int) -> String {
return self.remove (from: index, length: 1)
}
}
とりあえずここまで。