前提・実現したいこと
プログラミングの授業の自由課題ですごろくゲームを作成しているのですが、なぜエラーがでてくるのかがわかりません。
全角になっているところがあるのかと思い一度初めから打ち直してみたのですが、依然として同じエラーが発生してしまっています。
原因がわかる方、よければ教えていただけると幸いです。
発生している問題・エラーメッセージ
300:5: warning: data definition has no type or storage class getchar(); ^~~~~~~ 300:5: warning: type defaults to 'int' in declaration of 'getchar' [-Wimplicit-int] 301:13: error: expected declaration specifiers or '...' before string constant printf("\n~今回の結果~\n"); ^~~~~~~~~~~~~~~~~~~~ 302:5: warning: data definition has no type or storage class getchar(); ^~~~~~~ 302:5: warning: type defaults to 'int' in declaration of 'getchar' [-Wimplicit-int] 303:5: error: expected identifier or '(' before 'if' if(p1->position == MAX){ ^~ 306:5: error: expected identifier or '(' before 'else' else if(p2->position == MAX){ ^~~~ 309:1: error: expected identifier or '(' before '}' token } ^
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <time.h> 5 6#define MAX 20 //マスの数 7 8typedef struct { 9 char *name; //Playerの名前 10 char *icon; //すごろくで表示するアイコン 11 int position; //Playerの位置 12 int value; //Playerの成功値 13}Player; 14 15void rule(void); //タイトル画面の表示 16void input(Player*,Player*); //入力 17void successValue(Player*,Player*); //成功値の決定 18void field(Player*); //すごろくの状態 19int turn(Player*,Player*); //すごろくを進める 20int success(Player*,Player*,int); //判定成功の処理 21int special(Player*,Player*); //特殊マスチェック 22void failure(Player*,Player*,int); //判定失敗の処理 23void damage(Player*,Player*); //相手をスタートに戻す処理 24void result(Player*,Player*); //結果発表 25 26int main(void){ 27 Player player1,player2; //Player 28 Player *p1,*p2; //Playerのポインタ 29 int g; //ゴールの判定(ゴールしたら-1) 30 srand(time(NULL)); 31 32 p1 = &player1; 33 p2 = &player2; 34 35 //位置の初期化 36 p1->position = 0; 37 p2->position = 0; 38 39 rule(); //タイトル画面の表示 40 system("cls"); //画面クリア 41 input(p1,p2); //入力 42 getchar(); 43 successValue(p1,p2); //成功値の決定 44 getchar(); 45 system("cls"); //画面クリア 46 47 //初期位置の表示 48 field(p1); 49 field(p2); 50 printf("\n"); 51 52 //ゲーム開始 53 while(1){ 54 g = turn(p1,p2); //player1のターン(-1が戻されるとゴールなのでbreak) 55 if(g == -1) break; 56 g = turn(p2,p1); //player2のターン(-1が戻されるとゴールなのでbreak) 57 if(g == -1) break; 58 } 59 60 //最終状態 61 result(p1,p2); 62 63 return 0; 64} 65 66//タイトル画面の表示 67void rule(void){ 68 printf("*すごろくゲーム*\n"); 69 printf("\n"); 70 printf(" ルール\n"); 71 printf(" 1.はじめに1d100のダイスを振り、成功値を決定する。\n"); 72 printf(" 成功値は必ず 31 以上 90 未満の数字になります。\n"); 73 printf(" 2.各々のターンの前に毎回1d100ダイスを振り、成功値以下の出目が出れば\n"); 74 printf(" すごろくを進めるための1d6ダイスを振ることができる。\n"); 75 printf(" 成功値よりも大きい出目だった場合は1回休み。\n"); 76 printf(" 1d100ダイスの出目で、1~5だった場合は1d6ダイスの分に加えて1マス進むことができる。\n"); 77 printf(" 逆に、96~100だった場合は1マス戻って一回休み。\n"); 78 printf(" 3.相手と同じマスに止まった場合、相手をスタート地点まで戻すことができる。\n"); 79 printf(" 特殊マスに止まった場合、マスの効果に応じてさらに進んだり戻ったりする。\n"); 80 printf(" 4.先に20マス進めたほうが勝ち。\n"); 81 printf("\n"); 82 printf(" 特殊マス\n"); 83 printf(" 5 :3マス進む\n"); 84 printf(" 10:スタートに戻る\n"); 85 printf(" 15:4マス戻る\n"); 86 printf("\nEnterを押してスタート"); 87 getchar(); //エンターが入力されるまで待機 88} 89 90//入力 91void input(Player *p1,Player *p2){ 92 char str[100]; 93 94 //Player1の入力 95 printf("Player1の名前を入力してください..."); 96 scanf("%s",str); 97 p1->name = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 98 strcpy(p1->name,str); 99 100 printf("%sのアイコンを入力してください(全角1文字推奨)...",p1->name); 101 scanf("%s",str); 102 p1->icon = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 103 strcpy(p1->icon,str); 104 105 106 //Player2の入力 107 printf("Player2の名前を入力してください..."); 108 scanf("%s",str); 109 p2->name = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 110 strcpy(p2->name,str); 111 112 printf("%sのアイコンを入力してください(全角1文字推奨)...",p2->name); 113 scanf("%s",str); 114 p2->icon = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 115 strcpy(p2->icon,str); 116 117 //入力の確認 118 printf("\nPlayer1...%s アイコン...%s\n",p1->name,p1->icon); 119 printf("Player2...%s アイコン...%s\n",p2->name,p2->icon); 120} 121 122//成功値の決定 123void successValue(Player *p1,Player *p2){ 124 printf("\n成功値を決定します。\n"); 125 getchar(); 126 while(1){ 127 p1->value = (rand()%100) + 1; //1~100 128 p2->value = (rand()%100) + 1; 129 if(p1->value > 30 && p1->value < 90 && p2->value > 30 && p2->value < 90){ 130 break; 131 } 132 } 133 printf("%sの成功値:%d\n",p1->name,p1->value); 134 printf("%sの成功値:%d\n",p2->name,p2->value); 135} 136 137//すごろくの状態 138void field(Player *p){ 139 int i; 140 141 printf("\n%s\n",p->name); 142 for(i = 0; i < MAX; i++){ 143 if(i == p->position) printf("%s",p->icon); 144 else if(i == 0) printf("[START]"); 145 else if(i == 5) printf("5"); 146 else if(i == 10) printf("10"); 147 else if(i == 15) printf("15"); 148 else printf("・"); 149 } 150 //ゴールの表示 151 if(p->position < MAX) printf("[GOAL]"); 152 else printf("%s",p->icon); 153 printf("\n"); 154} 155 156//すごろくを進める 157int turn(Player *p,Player *po){ 158 int dice; 159 int g = 2; 160 161 getchar(); 162 printf("\n%sのターン!成功値の判定をします。(成功値...%d)\n",p->name,p->value); 163 getchar(); 164 dice = (rand()%100) + 1; 165 166 if(dice <= p->value){ //成功 167 g = success(p,po,dice); 168 } 169 else if(dice > p->value){ //失敗 170 failure(p,po,dice); 171 } 172 173 system("cls"); 174 field(p); 175 field(po); 176 177 return g; 178} 179 180//判定成功の処理 181int success(Player *p,Player *po,int dice){ 182 int g = 2; 183 184 //大成功 or 成功 185 if(dice <= 5) { 186 printf("%d...大成功!1マスおまけで進めます。\n",dice); 187 p->position = p->position + 1; 188 } 189 else { 190 printf("%d...成功!サイコロを振ります。\n",dice); 191 } 192 193 //1d6 194 getchar(); 195 dice = (rand()%6) + 1; //1~6 196 printf("%dが出ました。",dice); 197 getchar(); 198 p->position = p->position + dice; 199 200 g = special(p,po); 201 202 return g; 203} 204 205//特殊マスチェック 206int special(Player *p,Player *po){ 207 int g = 2; 208 209 //ゴールしたとき 210 if(p->position >= MAX){ 211 p->position = MAX; 212 g = -1; 213 return g; 214 } 215 //5マス 216 else if (p->position == 5){ 217 system("cls"); 218 field(p); 219 field(po); 220 221 printf("\nラッキーマス!"); 222 getchar(); 223 printf("やったね!3マス進めます。\n"); 224 p->position = p->position + 3; 225 getchar(); 226 if(p->position == po->position){ 227 field(p); 228 field(po); 229 damage(p,po); 230 } 231 return g; 232 } 233 //10マス 234 else if (p->position == 10){ 235 system("cls"); 236 field(p); 237 field(po); 238 239 printf("\nトラップマス!"); 240 getchar(); 241 printf("残念!スタートに戻ります。"); 242 p->position = 0; 243 getchar(); 244 return g; 245 } 246 //15マス 247 else if (p->position == 15){ 248 system("cls"); 249 field(p); 250 field(po); 251 252 printf("\nトラップマス!"); 253 getchar(); 254 printf("残念!4マス戻ります。"); 255 p->position = p->position - 4; 256 getchar(); 257 if(p->position == po->position){ 258 field(p); 259 field(po); 260 damage(p,po); 261 } 262 return g; 263 } 264 265 return g; 266 267} 268 269//判定失敗の処理 270void failure(Player *p,Player *po,int dice){ 271 if(dice > 95){ 272 printf("%d...大失敗!1マス戻ります。",dice); 273 p->position = p->position - 1; 274 if(p->position < 0){ 275 p->position = 0; 276 } 277 if(p->position == po->position){ 278 field(p); 279 field(po); 280 damage(p,po); 281 } 282 } 283 else{ 284 printf("%d...失敗!1回休みです。",dice); 285 } 286 getchar(); 287} 288 289//相手をスタートに戻す処理 290void damage(Player *p,Player *po){ 291 printf("ハプニング発生!"); 292 getchar(); 293 printf("%sと同じマスに止まりました。%sはスタートに戻されます。",po->name,po->name); 294 po->position = 0; 295 getchar(); 296} 297 298//結果発表 299void result(Player *p1,Player *p2){ 300 getchar(); 301 printf ("\n~今回の結果~\n"); 302 getchar(); 303 if(p1->position == MAX){ 304 printf(" %sの勝利!\n\n",p1->name); 305 } 306 else if(p2->position == MAX){ 307 printf(" %sの勝利!\n\n",p2->name); 308 } 309}
試したこと
VScode以外にideoneでも試してみたのですが、そちらだとsystem("cls")の処理をしない状態で成功しました。なぜVScodeでだけエラーが出てくるのでしょうか?
「~今回の結果~」を表示している printf の行をコメントアウトしたら、どうなるでしょうか。
回答1件
あなたの回答
tips
プレビュー