
この記事は伺か Advent Calendar 2014に投稿したものです。
里々のちょっとしたロジックを提供するコーナー。
全て、里々wikiとukadocの情報の組み合わせで作ります。
里々のサンプルゴースト「Rポストと狛犬」を書き換えて自ゴーストを作るくらいの知識が必要です。
今回は、単語群でカードゲームの山札を表現する。
里々が持つ重複回避機能を使って、山札のシャッフル機能、一度引いたカードが出ない機能を作ります。
詳細は続きに。
里々のちょっとしたロジックを提供するコーナー。
全て、里々wikiとukadocの情報の組み合わせで作ります。
里々のサンプルゴースト「Rポストと狛犬」を書き換えて自ゴーストを作るくらいの知識が必要です。
今回は、単語群でカードゲームの山札を表現する。
里々が持つ重複回避機能を使って、山札のシャッフル機能、一度引いたカードが出ない機能を作ります。
詳細は続きに。
以下サンプルは、preタグを使っていますが、場合によってはタブや改行がコピーできないかもしれません。
里々の重複回避はとても優秀です。
シャッフルしてくれる、全て引くまで同じ項目を引かない、という点から、カードゲームなどに向いています。
今回は単語群を使ったトランプを作ってみることにします。
まずは、重複回避のルールを決めます。単語群は、1つのトーク中でのみ重複しないように設定されています。
しかし、カードゲームは何度もカードを引いたりするため、それではゲームが成立しません。
以下を辞書で実行すると、ゴースト起動中はずっと重複しないようになります。
$単語群「トランプのカード」の重複回避=有効、起動中
一旦別のルールを指定してから、再度実行すると、初期化されます。
つまり捨て札を全部戻して山札を切り直したのと同じ効果が得られます。
トランプはジョーカーを抜くと全部で52枚です。
単語群で数字だけのものを作り、表示するときに絵柄や数字を当てることにしましょう。
トランプは、0~12をスペード、13~25をハート、26~38をダイヤ、残りをクラブにすれば良さそうです。
マークはどうやって計算しましょうか。23を引いたら、それが何のマークで数字がいくつか、一発で分かる方法はないでしょうか。
こういう場合、割り算の商と余りを使います。23を13で割ると、商1余り10。
商が0ならスペード、1ならハート、2ならダイヤ、3ならクラブとします。
数字は余りから出すので、0~12。0をエース、12をキングとすれば、割り算の商と余りできっちり計算できます。
しかしちょっと待って下さい。大抵のゲームで、エースは一番強いカードです。
もしもゲームを作って数字比べをする場合、計算がややこしいのは困ります。
そこで、12をエースとして、他は繰り下げることにしましょう。余り0なら、数字の2。余りが11ならキングで、12ならエースです。
里々の辞書に、ランダムトークとして記述した例が以下です。
実行結果

これだけでは何が出来るか分かりにくいので、簡単なゲームを作ってみました。
自分と相手が3枚カードを引き、お互いに1枚ずつ出します。
そのカードの数字が、等しいかこちらが大きければこちらの勝ち。小さければこちらの負けです。
それを3回繰り返し、勝ち数の多いほうが勝者となります。
これだけだとシンプルで面白みがありませんが、一応ゲームとして機能します。
単純なカードゲーム(Eカード等)や、くじ引き等、トランプ以外にも応用出来ます。
里々の重複回避はとても優秀です。
シャッフルしてくれる、全て引くまで同じ項目を引かない、という点から、カードゲームなどに向いています。
今回は単語群を使ったトランプを作ってみることにします。
まずは、重複回避のルールを決めます。単語群は、1つのトーク中でのみ重複しないように設定されています。
しかし、カードゲームは何度もカードを引いたりするため、それではゲームが成立しません。
以下を辞書で実行すると、ゴースト起動中はずっと重複しないようになります。
$単語群「トランプのカード」の重複回避=有効、起動中
一旦別のルールを指定してから、再度実行すると、初期化されます。
つまり捨て札を全部戻して山札を切り直したのと同じ効果が得られます。
トランプはジョーカーを抜くと全部で52枚です。
単語群で数字だけのものを作り、表示するときに絵柄や数字を当てることにしましょう。
トランプは、0~12をスペード、13~25をハート、26~38をダイヤ、残りをクラブにすれば良さそうです。
マークはどうやって計算しましょうか。23を引いたら、それが何のマークで数字がいくつか、一発で分かる方法はないでしょうか。
こういう場合、割り算の商と余りを使います。23を13で割ると、商1余り10。
商が0ならスペード、1ならハート、2ならダイヤ、3ならクラブとします。
数字は余りから出すので、0~12。0をエース、12をキングとすれば、割り算の商と余りできっちり計算できます。
しかしちょっと待って下さい。大抵のゲームで、エースは一番強いカードです。
もしもゲームを作って数字比べをする場合、計算がややこしいのは困ります。
そこで、12をエースとして、他は繰り下げることにしましょう。余り0なら、数字の2。余りが11ならキングで、12ならエースです。
里々の辞書に、ランダムトークとして記述した例が以下です。
#0→スペードの2、1→スペードの3、11→スペードのK、12→スペードのA
#13→ハートの2、25→ハートのA
#26→ダイヤの2、38→ダイヤのA
#39→クラブの2、51→クラブのA
@トランプのカード
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#0~51の数字を渡すと、スートとナンバーを表示する
#使い方は、(call,カードの表示,23)など
#(nop,処理)は何も表示されない
#(トランプスート)を呼ぶと「\1」が出てきてしまうため、nopで捨てている
@カードの表示
(nop,(call,トランプスート,(A0)))(トランプの絵柄)(nop,(call,トランプナンバー,(A0)))(トランプの数字)
#トランプの数字を渡すと、スートの絵柄を変数に入れる
#これは「@カードの表示」から呼び出すので、積極的に使うことはない
#0→スペード、1→ハート、2→ダイヤ、3→クラブ
#Unicode2660~2667はトランプのマークと定義されてる
#ただ、SSPデフォルトの「MS ゴシック」だと半角サイズで見づらいため、マークだけ「メイリオ」で表示する
#半角円記号で始まる、さくらスクリプトは基本全て半角で書く(フォント名「メイリオ」指定のみ全角)
*トランプスート
$トランプの絵柄=\_u[0x2660]
$トランプの絵柄=(when,(A0)/13==1,\_u[0x2661],(トランプの絵柄))
$トランプの絵柄=(when,(A0)/13==2,\_u[0x2662],(トランプの絵柄))
$トランプの絵柄=(when,(A0)/13==3,\_u[0x2663],(トランプの絵柄))
$トランプの絵柄=\f[name,メイリオ](トランプの絵柄)\f[name,default]
#トランプの数字を渡すと、ナンバーか絵札を変数に入れる
#これは「@カードの表示」から呼び出すので、積極的に使うことはない
#13で割った余りが、0→2、1→3・・・8→10、9→J、10→Q、11→K、12→A
*トランプナンバー
$トランプの数字=(A0)%13+2
$トランプの数字=(when,(トランプの数字)==11,J,(トランプの数字))
$トランプの数字=(when,(トランプの数字)==12,Q,(トランプの数字))
$トランプの数字=(when,(トランプの数字)==13,K,(トランプの数字))
$トランプの数字=(when,(トランプの数字)==14,A,(トランプの数字))
#重複回避のルールを別のものにしてから再度設定することで、リセットされる
#ついでにゲームを作る時用に、残りカード枚数もリセットしておく
*◯トランプシャッフル
$単語群「トランプのカード」の重複回避=有効、トーク中
$単語群「トランプのカード」の重複回避=有効、起動中
$残りカード=52
:全カードを山札に戻してシャッフルしたよ。
#試しにカードを引いてみる
*
:カードを引いてみるね。
(call,カードの表示,(トランプのカード))
実行結果

これだけでは何が出来るか分かりにくいので、簡単なゲームを作ってみました。
自分と相手が3枚カードを引き、お互いに1枚ずつ出します。
そのカードの数字が、等しいかこちらが大きければこちらの勝ち。小さければこちらの負けです。
それを3回繰り返し、勝ち数の多いほうが勝者となります。
*0つつかれ
:めにゅー
_◯トランプシャッフル
_◯トランプ勝負開始
*◯トランプ勝負開始
>カードが足りない (残りカード)<6
$自分の手札1=(トランプのカード)
$自分の手札1出した=0
$自分の手札2=(トランプのカード)
$自分の手札2出した=0
$自分の手札3=(トランプのカード)
$自分の手札3出した=0
$相手の手札1=(トランプのカード)
$相手の手札2=(トランプのカード)
$相手の手札3=(トランプのカード)
$相手が出す順番=(乱数1~3)
$残りカード=(残りカード)-6
$勝負した回数=0
$自分が勝った回数=0
$相手が勝った回数=0
>トランプ勝負選択
*カードが足りない
:あと(残りカード)枚しかないから引けないよ!
*トランプ勝負選択
>トランプ勝負おしまい (勝負した回数)==3
:\_q自分の手札1→(call,カードの表示,(自分の手札1)) 手札2→(call,カードの表示,(自分の手札2)) 手札3→(call,カードの表示,(自分の手札3))
相手の手札1→(call,カードの表示,(相手の手札1)) 手札2→(call,カードの表示,(相手の手札2)) 手札3→(call,カードの表示,(相手の手札3))
どのカードをだそうか\_q
_◯手札1枚目を出す
_◯手札2枚目を出す
_◯手札3枚目を出す
*◯手札1枚目を出す
>カードもう無い (自分の手札1出した)==1
$自分の手札1出した=1
$勝負手札=(自分の手札1)
>トランプ勝負実行
*◯手札2枚目を出す
>カードもう無い (自分の手札2出した)==1
$自分の手札2出した=1
$勝負手札=(自分の手札2)
>トランプ勝負実行
*◯手札3枚目を出す
>カードもう無い (自分の手札3出した)==1
$自分の手札3出した=1
$勝負手札=(自分の手札3)
>トランプ勝負実行
*カードもう無い
:もう出しちゃったから無いよ。\x
>トランプ勝負選択
*トランプ勝負実行
$勝負した回数=(勝負した回数)+1
$相手が出す順番=(相手が出す順番)%3+1
:\_qこちらのカード → (call,カードの表示,(勝負手札))
あいてのカード → (call,カードの表示,(相手の手札(相手が出す順番)))\_q
>トランプ勝負実行勝利 (勝負手札)%13>=(相手の手札(相手が出す順番))%13
>トランプ勝負実行敗北
*トランプ勝負実行勝利
$自分が勝った回数=(自分が勝った回数)+1
:
(勝負した回数)戦目、勝利!\x
>トランプ勝負選択
*トランプ勝負実行敗北
$相手が勝った回数=(相手が勝った回数)+1
:
(勝負した回数)戦目、敗北……。\x
>トランプ勝負選択
*トランプ勝負おしまい
:えーと勝敗は。
(自分が勝った回数)勝、(相手が勝った回数)敗。
>トランプ勝負に勝った (自分が勝った回数)>(相手が勝った回数)
>トランプ勝負に負けた
*トランプ勝負に勝った
:わーい、ばっちり勝利!
*トランプ勝負に負けた
:負けちゃったー。
これだけだとシンプルで面白みがありませんが、一応ゲームとして機能します。
単純なカードゲーム(Eカード等)や、くじ引き等、トランプ以外にも応用出来ます。


