2015-06-01から1ヶ月間の記事一覧
昨日はプレイヤーの実装。 今日はランダムAIを実装していく。 乱数の取得 さて、ランダムAIを実装するのだけど、やはりRubyのArray#sampleのような気の利いたメソッドはないわけで。 ということで、まずは乱数の取得から。 乱数の話 乱数といえば、srand()で…
昨日の記事は以下。 残すは実際のプレイヤーの実装。 プレイヤーの実装をするためのTips 標準入力、標準出力の扱い さて、プレイヤーを実装しようとするとまず必要となるのが、標準入力から文字列を受け取るという処理。 ただ、なんということか・・・そんな…
ボードの表示まで出来るようになった。 次は、人同士が対戦できるようにする。 Playerプロトコル Rubyの場合、ダック・タイピングが出来るので、プレイヤーに共通のインタフェースをコード上に定義する必要はないのだけど、Swiftはそうではないので、プレイ…
ボードの実装が終わったので、次はボードの表示の実装。 ボードの表示 さっそくコードを。 /* BoardViewer.swift */ import Foundation public struct BoardViewer { private static let COL_INDEX = " 1 2 3 4 5 6 7 8 9" private static let LINE = " +---…
あともうちょい。 ボードの実装(続き) 走査メソッド まずは走査メソッドから。 // 続き private func traverseFrom(row: Int, _ col: Int, to direction: (Int, Int), _ block: (Int, Int, Int, Color) -> Bool) { var traverseRow = row + direction.0 va…
さらに続く。 ボードの実装(続き) 合法手の実行 // 続き public func play(row: Int, _ col: Int) -> Board { assert( self.isPlayable(row, col), "not playable. [row: \(row), col: \(col)]") let newBoard = Board(self) newBoard.putPiece(row, col) …
まだまだ続くよー。 ボードの実装(続き) ボードの情報へのアクセス ざくっと。 // 続き public func color(row: Int, _ col: Int) -> Color { assert( (Board.ROW_MIN <= row) && (row <= Board.ROW_MAX), "invalid row. [row: \(row)]") assert( (Board.C…
まだまだ続くよ。 ボードの実装(続き) 初期化 プロパティを定義したので、次は初期化。 // 続き public init() { self.board = [ [.WALL, .WALL , .WALL , .WALL , .WALL , .WALL , .WALL , .WALL , .WALL , .WALL , .WALL], [.WALL, .EMPTY, .EMPTY, .EMP…
昨日の続き。 ボードの実装(続き) アクションの定義 色に続いて、アクションも列挙型として定義。 // 続き public enum Action { case Pass case Play(Int, Int) case Change(Int, Int) } // 続く Swiftの列挙型の面白い機能として、パラメータを取ること…
変種オセロ「良い子悪い子普通の子」については、以下を参照。 これをSwiftで書き直してみた。 なお、Swiftのバージョンは1.2なので、2.0とはちょっと違うところもある。 ボードの実装 まずは、ボードの実装から。 次のように、ボードをクラスとして定義した…
昨日はコマンドラインからSwiftを使う方法について書いてみた。 今日は、プレイグラウンドでSwiftを使う方法について。 プレイグラウンドとは? プレイグランドとは、XcodeでSwiftを対話的に使える環境。 ちょっとしたコードを試したり、簡単なデバッグを行…
現在、Swiftについて勉強中・・・ とりあえず、Swiftをコマンドラインから使ってみた。 なお、Xcodeのバージョンは、6.3.2。 swiftコマンド まず、swiftコマンド。 このコマンドを使うと、Swiftを対話的に使ったり、スクリプトを実行させたりすることが出来…
これまでの各記事は、以下から。 Gitによる歴史改変。(その1) - いものやま。 Gitによる歴史改変。(その2) - いものやま。 リベースの考え方 リベースとは、パッチを順番に当てていく操作。 なので、次の3つをおさえておく必要がある。 パッチを当てる対…
昨日は、リベースの基本的な使い方まで。 今日は、さらに強力なコミットの細かい指定と、リベース中のコントロールについて。 コミットの細かい指定 リベースの基本的な考え方として、リベースとはパッチを順番に当てていく操作だということを書いたけど、な…
バージョン管理システムとして一般的になった(と信じたい)Git。 チームで開発するときに限らず、個人で何か作業するときにもすごく便利なので、よくお世話になってる。 (実際、変種オセロのコードを書いてるときに使ってた) Gitの基本的な考え方、使い方…
自分はiMacを使っているんだけど、最近、Safariがやたらとメモリをくって、すごく困ってた。 そこで、iMacのメモリを増設してみた。 マシンスペックとか 自分の使っているiMacは、2013年Lateモデルの27-inch。 デフォルトでは4GBのメモリを2枚積んでいるので…
たろいもさんが抽象化に関して興味深い記事を書いていた。 なので、抽象化に関する自分の考えを書いてみたいと思う。 抽象化と体系化 引用元のブログでキーワードとなっているのが、「抽象化」と「体系化」という言葉。 この2つは非常に関係が深い言葉だけれ…
これまでの各記事は、以下から。 変種オセロの思考ルーチンを作ってみた。(その1) - いものやま。 変種オセロの思考ルーチンを作ってみた。(その2) - いものやま。 変種オセロの思考ルーチンを作ってみた。(その3) - いものやま。 変種オセロの思考ル…
昨日の記事は、以下から。 今日は、ミニマックスAIのさらなる高速化を目指す。 アルファベータ法 アルファベータ法の基本的な考え方は、ミニマックス法と同様、「相手が自分にとって一番都合の悪い手を打ってくる前提で、その中で一番マシな局面になる手を選…
昨日は、パフォーマンスを改善して、ミニマックスAIがそれなりのスピードで動くようにした。 今日はちょっと話題を変えて、千日手の話。 千日手 将棋の場合、何度も同じ局面になってしまって、手が進まなくなってしまうことがある。 これを「千日手」といっ…
昨日はミニマックス法を実装したけど、処理が遅いという問題が。 そこで、今日はパフォーマンスの改善を行っていく。 プロファイル パフォーマンスの改善を考えるときに、まず最初にやらないといけないことが、プロファイル。 ボトルネックを勘違いして修正…
昨日は貪欲法のAIを作成。 今日はミニマックス法のAIを作成する。 ミニマックス法 昨日の貪欲法は、「1手読んで、その中で一番いいと思われる手を選ぶ」というもの。 ただ、実際には1手読むだけだと、簡単に取り返されてしまうということがよく起こる。 そこ…
昨日はランダムAIを作った。 今日はもうちょいマシな思考ルーチンを作る。 貪欲AI すぐに思いつくのは、可能な手をそれぞれ実行してみて、その中で一番よさそうな手を選ぶというもの。 「選択肢の中からとりあえず一番いいものを選ぶ」というのを「貪欲法」…
変種オセロ「良い子悪い子普通の子」については、以下を参照。 今回は、この変種オセロの思考ルーチンを作っていく。 ランラムAI もっとも簡単なAIは、これ。 実行可能な手からランダムに返すだけのもの。 #!/usr/bin/env ruby require_relative "board" req…
とりあえず、まとめ。 これまでの各記事は、以下から。 変種オセロを考えてみた。(その1) - いものやま。 変種オセロを考えてみた。(その2) - いものやま。 変種オセロを考えてみた。(その3) - いものやま。 変種オセロを考えてみた。(その4) - いも…
ボードの実装が出来たので、今日は人同士が実際にこのゲームを遊べるようにしてみる。 CUIだけどw ボードの表示 まずは、ボードを表示するためのモジュールを実装。 module YWF module BoardViewer COL_INDEX = " 1 2 3 4 5 6 7 8 9" LINE = " +---+---+---+…
昨日の続き。 今日は残りの詳細な処理について。 ボードの実装(続き) 走査メソッド まずおさえておきたいのが、走査メソッド。 # 続き private def traverse_to(row, col, direction, &block) # NOTE: # 'traverse_to' accesses to 'WALL', # so 'color' c…
ルールは昨日書いた通り。 さっそくSwiftで書き始めてもいいんだけど、いきなり書き始めるのも大変なので、まずは書き慣れたRubyで書いてみて、感触を確かめてみようかなと。 ボードの実装 まずはボードの実装から。 データ構造と初期化 module YWF class Bo…
最近、Swiftを勉強しようと考えてるんだけど、ただ勉強するだけだとツマラナイ。 どうせならゲームとかでも作りながら勉強した方が面白いかなと思って、ちょっとゲームを考えてみた。 変種オセロ「良い子悪い子普通の子」 考えたのは、オセロの変種。 オセロ…
今、話題の紐といったら、アレだよね。 本の紐。 (例の紐じゃないよ、ゴメンね) スピンとも言うらしく、本の上部についていて、しおりとして使える便利なやつ。 自分はこの紐が大好きで、本にこの紐がついてると無性に嬉しくなったりする。 なぜって、すご…