コンピュータと対戦する簡単なすごろくゲームです。
「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 |
12 | int player_pos = 0; /* プレイヤーの位置 */ |
13 | int com_pos = 0; /* コンピュータの位置 */ |
14 |
15 | int player_trap; /* プレイヤー側のトラップの位置 */ |
16 | int com_trap; /* コンピュータ側のトラップの位置 */ |
17 |
18 | /* |
19 | サイコロを投げる関数 |
20 | */ |
21 | int throw ( void ){ |
22 | return ( rand () % 6 + 1); /* 1~6 */ |
23 | } |
24 |
25 | /* |
26 | フィールドを表示する関数 |
27 | */ |
28 | void 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 |
57 | int 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 | } |
コメント