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