13
じゃんけんお題別解解説 2014 SoftUmeYa, LLC Masashi Umezawa CROSS 2014 言語CROSS Smalltalkによる

Smalltalkでじゃんけん

Embed Size (px)

DESCRIPTION

CROSS 2014 「言語CROSS」でのじゃんけんゲーム課題の解答です

Citation preview

Page 1: Smalltalkでじゃんけん

じゃんけんお題別解解説

2014 SoftUmeYa, LLC

Masashi Umezawa

CROSS 2014

言語CROSS

Smalltalkによる

Page 2: Smalltalkでじゃんけん

じゃんけん課題 * プレイヤーは二人。片方はコンピューター。

* 手は「グー、チョキ、パー」。あとは一般的なじゃんけんの規則にのっとります

* 少なくとも、プレイヤーかコンピューターが勝ったかを判定できること

* 入力・出力は自由。ゲーム用の関数が定義されて、対話コンソールから入力で

きれば十分とします

* じゃんけんのルールをどう実装するかは、各種の言語で差が出ることを期待

(関数型、オブジェクト型の違い)

* 余力でリッチなGUIを実装してくれる人がいる

* ライブラリ自慢

Page 3: Smalltalkでじゃんけん

どう解く?

関数型の言語ではパターンマッチとか

使ってくるであろう

Smalltalk的にはオブジェクト指向っぽく

解くのが礼儀というもの

ガチなOOで

でもコードはシンプルに

さて...

Page 4: Smalltalkでじゃんけん

街で見かけたじゃんけん

ポケモンのおみくじバトル

マクドのハッピーセットのおまけ

あ、これだ!

Page 5: Smalltalkでじゃんけん

勝ち負けの関係

素直にクラス間の関係として表してみる

Page 6: Smalltalkでじゃんけん

クラス間の関係

良くあるのは

スーパークラス・サブクラスの関係

「勝つクラス・負けるクラス」というの

を導入する

Page 7: Smalltalkでじゃんけん

クラス間の関係の実装

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.

Page 8: Smalltalkでじゃんけん

勝ち負け判定

相手のクラスがどちら側か調べるだけ

Te >> pong: other を実装

以上で終わり! 動かしてみる

pong: other self class wins = other class ifTrue: [^#win]. self class loses = other class ifTrue: [^#lose]. ^#draw

Page 9: Smalltalkでじゃんけん

ワークスペースで実行

goo := Goo new. paa := Paa new. choki := Choki new. goo pong: paa. "=> #lose" choki pong: paa. "=> #win" choki pong: choki. "=> #draw"

Page 10: Smalltalkでじゃんけん

待てよ...

* じゃんけんのルールをどう実装するかは、各種の言語で差が出ることを期待

(関数型、オブジェクト型の違い)

* 余力でリッチなGUIを実装してくれる人がいる

* ライブラリ自慢

期待に応え切れていない?

Page 11: Smalltalkでじゃんけん

SmalltalkでのUI

MorphicかMVC

Webアプリでやります

Seaside

• 継続ベースのWebアプリフレームワーク

• http://seaside.st/

「SeasideへGO!!」

• http://www.ogis-ri.co.jp/otc/hiroba/technical/seaside/

Page 12: Smalltalkでじゃんけん

継続によるフロー制御 ゲームの流れを「普通の」アプリっぽく書ける

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

何回先取か聞く

誰かが先取する

までループ

あいこの場合は続けてポン

成績表示して最初に戻る

Page 13: Smalltalkでじゃんけん

Webブラウザから実行

http://localhost:8080/jankenにアクセス

ライブなデバッグもしてみる

CSSスタイルの動的変更

コードの変更