C言語:for文,if文,乱数を組み合わせて簡単なすごろくを作る

Cプログラミング C言語

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

コメント

タイトルとURLをコピーしました