Successfully reported this slideshow.
Your SlideShare is downloading. ×

Smalltalkでじゃんけん

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 13 Ad
Advertisement

More Related Content

Advertisement

Recently uploaded (20)

Smalltalkでじゃんけん

  1. 1. CROSS 2014 言語CROSS Smalltalkによる じゃんけんお題別解解説 2014 SoftUmeYa, LLC Masashi Umezawa
  2. 2. じゃんけん課題 * プレイヤーは二人。片方はコンピューター。 * 手は「グー、チョキ、パー」。あとは一般的なじゃんけ んの規則にのっとります * 少なくとも、プレイヤーかコンピューターが勝ったかを 判定できること * 入力・出力は自由。ゲーム用の関数が定義されて、 対話コンソールから入力で きれば十分とします * じゃんけんのルールをどう実装するかは、各種の言語 で差が出ることを期待 (関数型、オブジェクト型の違い) * 余力でリッチなGUIを実装してくれる人がいる * ライブラリ自慢
  3. 3. どう解く? 関数型の言語ではパターンマッチとか 使ってくるであろう Smalltalk的にはオブジェクト指向っぽく 解くのが礼儀というもの ガチなOOで でもコードはシンプルに さて...
  4. 4. 街で見かけたじゃんけん ポケモンのおみくじバトル マクドのハッピーセットのおまけ あ、これだ!
  5. 5. 勝ち負けの関係 素直にクラス間の関係として表してみる
  6. 6. クラス間の関係 良くあるのは スーパークラス・サブクラスの関係 「勝つクラス・負けるクラス」というの を導入する
  7. 7. クラス間の関係の実装 Goo,Choki,PaaのスーパークラスTeを定義 クラスインスタンス変数 wins, losesを定義 Te class instanceVariableNames: 'wins loses' Te class >> initializeで関係を設定する initialize Goo wins: Choki; loses: Paa. Paa wins: Goo; loses: Choki. Choki wins: Paa; loses: Goo. • 宣言的でいい感じ
  8. 8. 勝ち負け判定 相手のクラスがどちら側か調べるだけ Te >> pong: other を実装 pong: other self class wins = other class ifTrue: [^#win]. self class loses = other class ifTrue: [^#lose]. ^#draw 以上で終わり! 動かしてみる
  9. 9. ワークスペースで実行 goo := Goo new. paa := Paa new. choki := Choki new. goo pong: paa. "=> #lose" choki pong: paa. "=> #win" choki pong: choki. "=> #draw"
  10. 10. 待てよ... * じゃんけんのルールをどう実装するかは、各種の言語 で差が出ることを期待 (関数型、オブジェクト型の違い) * 余力でリッチなGUIを実装してくれる人がいる * ライブラリ自慢 期待に応え切れていない?
  11. 11. SmalltalkでのUI  MorphicかMVC  Webアプリでやります Seaside • • 継続ベースのWebアプリフレームワーク http://seaside.st/ 「SeasideへGO!!」 • http://www.ogis-ri.co.jp/otc/hiroba/technical/seaside/
  12. 12. 継続によるフロー制御  ゲームの流れを「普通の」アプリっぽく書ける JankenGameTask >> go howManyRounds := self call: JankenTitleView new. 何回先取か聞く [self someoneWins: howManyRounds] 誰かが先取する whileFalse: [ までループ [| playerTe comTe pongResult | playerTe := self call: (JankenPongInputView on: self). comTe := Te subclasses atRandom new. pongResult := self call: (JankenPongJudgeView playerTe: playerTe comTe: comTe). pongResults add: pongResult. あいこの場合は続 pongResult = #draw] whileTrue]. けてポン self call: (JankenEndView on: self). self initialize 成績表示して最初に戻る
  13. 13. Webブラウザから実行 http://localhost:8080/jankenにアクセス ライブなデバッグもしてみる CSSスタイルの動的変更 コードの変更

×