Swift勉強中

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)
	}
}

とりあえずここまで。

 
カテゴリー: Off topic, Programming タグ: , , パーマリンク

コメントを残す