第286話 石取りゲームと、改良点と、思考
「あー、賭場のホッケーゲームが飽きられてよ。代わりの物を考えてみたんだが。石取りゲームに、ちょこっと手を加えるってのは、どうかな」
納品やらもろもろの手続きで、元締めの所に顔を出した時に、そう言われた。
商品の感想を得る為、前に暫定版のサンプルを渡しておいたのだ。
「どんな手を加えるの?」
「まずよ。魔道具が常に先手だとすると、最善手を打っても勝つ確率は4分の1だな」
「まあね。魔道具がわざと失敗しなければそうなる」
「それを2分の1程度にする」
「出来ると思うよ」
わざと間違える確率を調整すれば良い。
「それと数字入力はやめて1から3の3つのボタンにしろよ。コンロの魔道具でボタンは作っただろ」
「うん、作れるね」
「制限時間は1秒で良い」
「滅茶苦茶、焦るね」
「カモにする魔道具とカモになる魔道具を作る」
「わざと負けたりの物から、最善手しか打たない物まで、設定を何段階か作るわけだ」
「で何回かプレーすると設定が変わる」
元締めは博打を良く分かっている。
「とりあえず魔法を組んでみたよ」
「すまないな」
元締めが石取りゲームをプレーする。
「なかなか良いんじゃないか。後は音と派手な表示だな」
「難易度も含めてそういうのは徐々にバージョンアップしていこう」
俺は石取りゲームをおも研のお土産にした。
ゲームを遊んでベークがげんなりとした顔で一言。
「これは悪夢の石取りゲーム」
「馬鹿は勝てないゲーム」
煽るマイラ。
「ムッキー」
「ベーク様」
ラチェッタがベークに耳打ちする。
ベークは紙に何か書き始めた。
「どんなもんだ。レベル3ぐらいだとほとんど負けない」
見ると必勝法の石の数をかき込んであった。
この数を残せば必ず勝つという奴だ。
でも、レベル5になると勝率は2割5分になるんだよな。
必勝法の表を使われないように、元締めに言っておかないと。
表を隠すのは難しいだろうな。
視線がそちらにいくと、ばれてしまう。
俺だったら、魔法でカンニングするけどな。
みんな何だかんだで石取りゲームに夢中になった。
色々と意見を聞きながらサウンドとか付け加えていく。
魔道具が負けていた時にハッタリを言ったり、勝っていても弱音を吐いたり、色々と喋らせた。
中々、面白く出来たと思う。
「4人ぐらい同時でやってみたら」
リニアのアイデア。
魔道具は時間管理を含めた審判をするのか。
「ありだけど、プレイヤー同士が組まれると厄介だな」
「そっかあ」
麻雀だとコンビ打ちとか言うんだっけな。
「トーナメント表を作ってやれば」
マイラも話に乗って来た。
「多数の仲間を参加させれば、関係ない」
「元締めの所に持っていくんでしょ。元締めの手下は多いから同じ事をすると思う」
「だよな。やってみて不味ければ、元締めがなんとかするだろう」
「わたくしと致しましては多面打ちを提案致しますわ」
それが出来るのはレクティぐらいだろう。
だけど、ギャンブラーは豪の者がいるから案外こなすかもな。
提案としては面白い。
攻略の表を見てもパニックになること間違いなしだな。
「最初の数を数億とかも増やして、始めのうちは1千万単位で取るのはどう。段々と単位を小さくしていけば」
セレンは豪快だな。
たしかに億となったら、かなり計算が難しいだろう。
「レパートリーとしては良しだ。作ってみよう」
「たまに魔道具のチャチャが入るのはどうかな」
コネクタの提案だ。
不確定要素が、両方に入るのか。
「人間同士の対戦だったら、良いかもな」
「前回の手と同じのは駄目というのはどうですか」
ベスのアイデア。
「なるほど必勝パターンにもっていかせないのか」
「他ですとパス権とか」
パス権は同数持っていると同じ結果になるな。
4人なんかの場合はゲーム性になるのか。
これはこれで面白い。
一つのゲームでも色々と縛りやルールを追加するといけるものだな。
よし、元締めに提案してみよう。
たぶん全部やってくれというに違いない。
賭場で試してみて、客の反応と上がりで採用するか考えると思う。
「みんな凄いな」
「これを魔法に出来るタイトが一番凄いよ」
「ルールを守らせるのは簡単だ。難しいのは思考を再現することかも」
「たしかに。魔法の流れなら見えるけど、思考は見えない」
思考は学習でなんとかなるけど、それにはAIが組めるようなプログラム言語でないと。
俺はそういうプログラム言語は使えない。
さわりぐらいはやったけど、本格的にはやってない。
やっとけば良かったかな。
――――――――――――――――――――――――
おも研に持ち帰った魔道具のプログラム。
書いてみたら長くなったので、文末に載せておきます。
ボツにするのもしのびないのでおいときます。
読む必要は特にありません。
#include <stdio.h>
#include <stdlib.h>
extern MAGIC *obj_make(long obj_size_mm,int image,int attri);
extern int touch(MAGIC *mp);
extern int mclose(MAGIC *mp);
extern void time_wait(long time_ms);
int go_easy_on_player(int level,int easy)
{
if(level>=5) return(0); /*レベル5は手加減無し*/
if(level==4){
if(easy==0){
if(rand()%20==13){
return(1); /*レベル4の1回目の手加減*/
}
}
if(easy==1){
if(rand()%40==29){
return(1); /*レベル4の2回目の手加減*/
}
}
}
if(level==3){ /*レベル3の手加減*/
if(easy==0){
if(rand()%10==7){
return(1);
}
}
if(easy==1){
if(rand()%20==15){
return(1);
}
}
if(easy==2){
if(rand()%30==24){
return(1);
}
}
}
if(level==2){ /*レベル2の手加減*/
if(easy==0){
if(rand()%5==2){
return(1);
}
}
if(easy==1){
if(rand()%10==8){
return(1);
}
}
if(easy==2){
if(rand()%20==17){
return(1);
}
}
if(easy==3){
if(rand()%30==21){
return(1);
}
}
}
if(level==1){ /*レベル1の手加減*/
if(easy==0){
if(rand()%5==2){
return(1);
}
}
if(easy==1){
if(rand()%5==4){
return(1);
}
}
if(easy==2){
if(rand()%10==8){
return(1);
}
}
if(easy==3){
if(rand()%10==9){
return(1);
}
}
if(easy==4){
if(rand()%10==4){
return(1);
}
}
}
if(level==0){ /*レベル0は常に手加減*/
return(1);
}
return(0); /*今回は手加減なし*/
}
void main(void)
{
MAGIC *mp1,*mp2,*mp3; /*魔法の定義*/
int x,answer,player,time,level,easy; /*『x』は石の数。『answer』は取る石の数。『player』は0は魔道具、1は人間*/
scanf("%d",&level); /*レベル設定。賭場の従業員が設定する*/
if(level<0 || level >5) level=5; /*範囲外ならレベル5*/
mp1=obj_make(10,IMAGEBUTTON1,HOLOGRAPHY); /*1と書かれたボタンをホログラフィで生成*/
mp2=obj_make(10,IMAGEBUTTON2,HOLOGRAPHY); /*2と書かれたボタンをホログラフィで生成*/
mp3=obj_make(10,IMAGEBUTTON3,HOLOGRAPHY); /*3と書かれたボタンをホログラフィで生成*/
while(1){
printf("ボタンを押すとゲームが始まります\n");
while(1){
if(touch(mp1)==1 || touch(mp2)==1 || touch(mp3)==1) break; /*入力ありなら始める*/
}
printf("新しいゲームを始めます\n");
easy=0; /*手加減した回数。最初は0*/
x=rand()%20+20; /*石の数は20個から39個*/
player=0; /*最初は魔道具*/
printf("石の数は%d\n",x);
while(x>0){ /*ループと終了判定*/
if(player==0){ /*魔道具サイド*/
printf("魔道具の番です\n");
answer=(x%4+3)%4; /*数決定*/
if(answer==0){
answer=rand()%3+1; /*負けパターンならランダム*/
if(x==1){
answer=1; /*負けなので最後の石を取る*/
}
}
else{
if(go_easy_on_player(level,easy)==1){
answer=rand()%3+1; /*手加減ならランダム*/
easy++; /*手加減した回数を一つ増やす*/
}
}
}
else{
printf("あなたの番です\n");
time=1000; /*残り時間1秒*/
answer=0; /*答え*/
while(time>0){ /*制限時間でループ*/
if(touch(mp1)==1) answer=1; /*答え1*/
if(touch(mp2)==1) answer=2; /*答え2*/
if(touch(mp3)==1) answer=3; /*答え3*/
if(answer!=0) break; /*入力があった*/
time_wait(1); /*0.01秒待つ*/
time--; /*残り時間が減る*/
}
if(answer==0){ /*反則判定*/
x=0; /*反則処理*/
printf("反則負けです\n");
}
}
x=x-answer; /*石を取る*/
printf("石を%d個取りました。残り%d個です\n",answer,x);
player=(player+1)%2; /*プレイヤーチェンジ*/
}
if(player==0){ /*勝ちメッセージ*/
printf("魔道具の勝ちです\n");
}
else{
printf("あなたの勝ちです\n");
}
}
mclose(mp1); /*魔法終わり処理*/
mclose(mp2); /*魔法終わり処理*/
mclose(mp3); /*魔法終わり処理*/
}
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます