Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
CROSS 2014
言語CROSS

Smalltalkによる

じゃんけんお題別解解説

2014 SoftUmeYa, LLC
Masashi Umezawa
じゃんけん課題
* プレイヤーは二人。片方はコンピューター。
* 手は「グー、チョキ、パー」。あとは一般的なじゃんけ
んの規則にのっとります
* 少なくとも、プレイヤーかコンピューターが勝ったかを
判定できること
* 入力・出力は自由。ゲーム用...
どう解く?
関数型の言語ではパターンマッチとか
使ってくるであろう
Smalltalk的にはオブジェクト指向っぽく
解くのが礼儀というもの
ガチなOOで
でもコードはシンプルに
さて...
街で見かけたじゃんけん
ポケモンのおみくじバトル
マクドのハッピーセットのおまけ

あ、これだ!
勝ち負けの関係

素直にクラス間の関係として表してみる
クラス間の関係
良くあるのは
スーパークラス・サブクラスの関係
「勝つクラス・負けるクラス」というの
を導入する
クラス間の関係の実装
Goo,Choki,PaaのスーパークラスTeを定義
クラスインスタンス変数 wins, losesを定義
Te class
instanceVariableNames: 'wins loses'
Te class >>...
勝ち負け判定
相手のクラスがどちら側か調べるだけ
Te >> pong: other を実装
pong: other
self class wins = other class ifTrue: [^#win].
self class lose...
ワークスペースで実行
goo := Goo new.
paa := Paa new.
choki := Choki new.
goo pong: paa. "=> #lose"
choki pong: paa. "=> #win"
choki ...
待てよ...
* じゃんけんのルールをどう実装するかは、各種の言語
で差が出ることを期待
(関数型、オブジェクト型の違い)
* 余力でリッチなGUIを実装してくれる人がいる
* ライブラリ自慢

期待に応え切れていない?
SmalltalkでのUI
 MorphicかMVC
 Webアプリでやります
Seaside
•
•

継続ベースのWebアプリフレームワーク
http://seaside.st/

「SeasideへGO!!」
•

http://ww...
継続によるフロー制御
 ゲームの流れを「普通の」アプリっぽく書ける
JankenGameTask >> go
howManyRounds := self call: JankenTitleView new.

何回先取か聞く

[self s...
Webブラウザから実行
http://localhost:8080/jankenにアクセス
ライブなデバッグもしてみる
CSSスタイルの動的変更
コードの変更
Upcoming SlideShare
Loading in …5
×

Smalltalkでじゃんけん

3,047 views

Published on

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

Published in: Technology
  • Be the first to comment

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スタイルの動的変更 コードの変更

×