第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); /*魔法終わり処理*/

}

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る