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の数値を変更するとフィールドの長さを変更できます。適当に変えてみてください。

1/*
2    sugoroku.c
3        CUIでコンピュータとすごろくする
4*/
5 
6#include <stdio.h>
7#include <stdlib.h>
8#include <time.h>
9 
10#define WIDTH 20    /* フィールドの幅 */
11 
12int player_pos = 0; /* プレイヤーの位置 */
13int com_pos = 0;        /* コンピュータの位置 */
14 
15int player_trap;        /* プレイヤー側のトラップの位置 */
16int com_trap;       /* コンピュータ側のトラップの位置 */
17 
18/*
19    サイコロを投げる関数
20*/
21int throw(void){
22    return(rand() % 6 + 1); /* 1~6 */
23}
24 
25/*
26    フィールドを表示する関数
27*/
28void field(void){
29    int i;
30 
31    /* プレイヤー側の表示 */
32    printf("\n");
33    for(i=0; i<WIDTH; i++){
34        if(i == player_pos)     /* プレイヤー */
35            printf("P");
36        else if(i == player_trap)   /* トラップマス */
37            printf("〇");
38        else                        /* 通常のマス */
39            printf("・");
40    }
41    if(player_pos == WIDTH) printf("P");    /* ゴール時 */
42     
43    /* コンピュータ側の表示 */
44    printf("\n");
45    for(i=0; i<WIDTH; i++){
46        if(i == com_pos)            /* コンピュータ */
47            printf("C");
48        else if(i == com_trap)      /* トラップマス */
49            printf("〇");
50        else                        /* 通常のマス */
51            printf("・");
52    }
53    if(com_pos == WIDTH) printf("C");   /* ゴール時 */
54    printf("\n");
55}
56 
57int main(void)
58{
59    int sai;    /* サイコロの出目 */
60     
61    srand((unsigned)time(NULL));    /* 乱数系列初期化 */
62     
63    /* トラップ位置の設定 */
64    player_trap = WIDTH/2 + (rand() % (WIDTH/2));   /* フィールド幅の半分よりゴール側 */
65    com_trap = WIDTH/2 + (rand() % (WIDTH/2));
66     
67    field();    /* フィールドの初期状態表示 */
68     
69    /* ゲームループ:どちらかがゴールするまで繰り返す */
70    while(1){
71        /* プレイヤーのターン */
72        printf("Playerの番です。サイコロを振ってください...");
73        getchar();
74        sai = throw();
75        printf("%dが出ました。", sai);
76        getchar();
77 
78        player_pos += sai;  /* 駒を進める */
79        if(player_pos >= WIDTH){         /* ゴールチェック */
80            player_pos = WIDTH;
81            break;
82        }
83        else if(player_pos == player_trap){ /* トラップチェック */
84            printf("うゎっ、穴に落ちた...");
85            player_trap = WIDTH/2 + (rand() % (WIDTH/2));
86            getchar();
87            player_pos = 0;
88        }
89        field();
90         
91        /* コンピュータのターン */
92        printf("Computerの番です。");
93        getchar();
94        sai = throw();
95        printf("%dが出ました。", sai);
96        getchar();
97 
98        com_pos += sai; /* 駒を進める */
99        if(com_pos >= WIDTH){            /* ゴールチェック */
100            com_pos = WIDTH;
101            break;
102        }
103        else if(com_pos == com_trap){   /* トラップチェック */
104            printf("うゎっ、穴に落ちた...");
105            com_trap = WIDTH/2 + (rand() % (WIDTH/2));
106            getchar();
107            com_pos = 0;
108        }
109        field();
110    }
111    field();
112     
113    /* 勝敗の判定表示 */
114    if(player_pos == WIDTH)
115        printf("Playerの勝ち!!\n");
116    else
117        printf("Computerの勝ち!!\n");
118 
119    return 0;
120}

コメント

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