コンピュータと対戦する簡単なすごろくゲームです。
「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;
}
コメント