コンピュータと対戦する簡単なすごろくゲームです。
「Pythonでつくる ゲーム開発 入門講座」という分かりやすくゲーム作りについて書かれた本があるのですが、その中にCUIで作るすごろくとして載っていたものをC言語に直してみました。変更点として書籍の中では無かった穴に落ちてスタートに戻る処理を追加しました。
画面イメージ
文字ベースなので殺風景ですが、Pがプレイヤー、Cがコンピュータで右端のゴールを目指します。「〇」はトラップとしての穴です。止まるとスタートに戻ってしまいます。
P・・・・・・・・・・・・・・・・〇・・ C・・・・・・・・・・・・・・〇・・・・ Playerの番です。サイコロを振ってください… 6が出ました。 ・・・・・・P・・・・・・・・・・〇・・ C・・・・・・・・・・・・・・〇・・・・ Computerの番です。 3が出ました。 ・・・・・・P・・・・・・・・・・〇・・ ・・・C・・・・・・・・・・・〇・・・・ Playerの番です。サイコロを振ってください… 6が出ました。 ・・・・・・・・・・・・P・・・・〇・・ ・・・C・・・・・・・・・・・〇・・・・ Computerの番です。 2が出ました。 ・・・・・・・・・・・・P・・・・〇・・ ・・・・・C・・・・・・・・・〇・・・・ Playerの番です。サイコロを振ってください… 4が出ました。 ・・・・・・・・・・・・・・・・P〇・・ ・・・・・C・・・・・・・・・〇・・・・ Computerの番です。 6が出ました。 ・・・・・・・・・・・・・・・・P〇・・ ・・・・・・・・・・・C・・・〇・・・・ Playerの番です。サイコロを振ってください… 1が出ました。 うゎっ、穴に落ちた… P・・・・・・・・・〇・・・・・・・・・ ・・・・・・・・・・・C・・・〇・・・・ Computerの番です。 2が出ました。 P・・・・・・・・・〇・・・・・・・・・ ・・・・・・・・・・・・・C・〇・・・・ Playerの番です。サイコロを振ってください… 4が出ました。 ・・・・P・・・・・〇・・・・・・・・・ ・・・・・・・・・・・・・C・〇・・・・ Computerの番です。 1が出ました。 ・・・・P・・・・・〇・・・・・・・・・ ・・・・・・・・・・・・・・C〇・・・・ Playerの番です。サイコロを振ってください… 5が出ました。 ・・・・・・・・・P〇・・・・・・・・・ ・・・・・・・・・・・・・・C〇・・・・ Computerの番です。 4が出ました。 ・・・・・・・・・P〇・・・・・・・・・ ・・・・・・・・・・・・・・・〇・・C・ Playerの番です。サイコロを振ってください… 5が出ました。 ・・・・・・・・・・〇・・・P・・・・・ ・・・・・・・・・・・・・・・〇・・C・ Computerの番です。 5が出ました。 ・・・・・・・・・・〇・・・P・・・・・ ・・・・・・・・・・・・・・・〇・・・・C Computerの勝ち!!
ソースコード(C言語)
10行目のWIDTHの数値を変更するとフィールドの長さを変更できます。適当に変えてみてください。
/* sugoroku.c CUIでコンピュータとすごろくする */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define WIDTH 20 /* フィールドの幅 */ int player_pos = 0; /* プレイヤーの位置 */ int com_pos = 0; /* コンピュータの位置 */ int player_trap; /* プレイヤー側のトラップの位置 */ int com_trap; /* コンピュータ側のトラップの位置 */ /* サイコロを投げる関数 */ int throw(void){ return(rand() % 6 + 1); /* 1~6 */ } /* フィールドを表示する関数 */ void field(void){ int i; /* プレイヤー側の表示 */ printf("\n"); for(i=0; i<WIDTH; i++){ if(i == player_pos) /* プレイヤー */ printf("P"); else if(i == player_trap) /* トラップマス */ printf("〇"); else /* 通常のマス */ printf("・"); } if(player_pos == WIDTH) printf("P"); /* ゴール時 */ /* コンピュータ側の表示 */ printf("\n"); for(i=0; i<WIDTH; i++){ if(i == com_pos) /* コンピュータ */ printf("C"); else if(i == com_trap) /* トラップマス */ printf("〇"); else /* 通常のマス */ printf("・"); } if(com_pos == WIDTH) printf("C"); /* ゴール時 */ printf("\n"); } int main(void) { int sai; /* サイコロの出目 */ srand((unsigned)time(NULL)); /* 乱数系列初期化 */ /* トラップ位置の設定 */ player_trap = WIDTH/2 + (rand() % (WIDTH/2)); /* フィールド幅の半分よりゴール側 */ com_trap = WIDTH/2 + (rand() % (WIDTH/2)); field(); /* フィールドの初期状態表示 */ /* ゲームループ:どちらかがゴールするまで繰り返す */ while(1){ /* プレイヤーのターン */ printf("Playerの番です。サイコロを振ってください..."); getchar(); sai = throw(); printf("%dが出ました。", sai); getchar(); player_pos += sai; /* 駒を進める */ if(player_pos >= WIDTH){ /* ゴールチェック */ player_pos = WIDTH; break; } else if(player_pos == player_trap){ /* トラップチェック */ printf("うゎっ、穴に落ちた..."); player_trap = WIDTH/2 + (rand() % (WIDTH/2)); getchar(); player_pos = 0; } field(); /* コンピュータのターン */ printf("Computerの番です。"); getchar(); sai = throw(); printf("%dが出ました。", sai); getchar(); com_pos += sai; /* 駒を進める */ if(com_pos >= WIDTH){ /* ゴールチェック */ com_pos = WIDTH; break; } else if(com_pos == com_trap){ /* トラップチェック */ printf("うゎっ、穴に落ちた..."); com_trap = WIDTH/2 + (rand() % (WIDTH/2)); getchar(); com_pos = 0; } field(); } field(); /* 勝敗の判定表示 */ if(player_pos == WIDTH) printf("Playerの勝ち!!\n"); else printf("Computerの勝ち!!\n"); return 0; }
コメント