###前提・実現したいこと
こんちには。私は現在パックマンのようなドットイートゲームを作成しています。
まだプログラミングを始めたばかりで、ものすごく簡単ではございますが、基本となるコードはなんとか自分で書くことができました。
しかし、次の問題点がどうしても改善できません。
###発生している問題・エラーメッセージ
敵が壁に当たると全く動かなくなってしまう。
###該当のソースコード
C++
1/////////////////////////////////////////////////////////////// 2// 3// パックマンプログラム pacman2.c 4// 5// 平成29年2月9日 6/////////////////////////////////////////////////////////////// 7#pragma warning(disable:4996) 8#include <stdio.h> 9#include <stdlib.h> // system() 10#include <windows.h> // Sleep() 11#include <conio.h> // kbhit() 12 13#define SIZE 15 // 一辺の長さ 14#define EMPTY 0 // 何もない場所は0 15#define WALL 1 // 壁 16#define FOOD 2 // えさ(ドット) 17#define POWER_FOOD 4 //パワーエサ 18#define PACMAN 3// 主人公 19 20int main() 21{ 22 int wait_time = 300; 23 int x, y, j; 24 int food_count = 0;//エサの個数 25 int power_food_count = 0;//パワーエサの個数 26 int cx, cy;//パックマン 27 int ex, ey;//敵 28 int key; 29 int point = 0; 30 int kx, ky;//自機の座標を保存するための変数 31 int mx, my;//敵の座標を保存するための変数 32 int life = 3;//ライフ 33 34 int field[SIZE][SIZE] = 35 { 36 { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, 37 { 1,2,2,2,2,2,2,2,2,2,2,4,2,2,1 }, 38 { 1,2,1,1,1,2,1,1,1,2,1,2,1,2,1 }, 39 { 1,2,1,0,1,2,1,0,1,2,1,2,2,2,1 }, 40 { 1,2,1,1,1,2,1,1,1,2,1,2,1,2,1 }, 41 { 1,2,2,2,2,2,2,2,2,2,2,2,2,2,1 }, 42 { 1,1,1,1,1,0,1,0,1,1,1,0,1,1,1 }, 43 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, 44 { 1,1,1,1,1,2,1,2,2,1,1,2,1,1,1 }, 45 { 1,4,2,2,2,2,1,2,1,1,1,2,2,2,1 }, 46 { 1,2,1,1,1,1,0,0,0,0,2,2,1,2,1 }, 47 { 1,2,2,2,0,2,2,1,2,1,2,0,1,2,1 }, 48 { 1,2,1,1,1,0,1,1,2,2,2,1,1,2,1 }, 49 { 1,2,2,2,2,2,2,2,2,1,2,2,2,4,1 }, 50 { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, 51 }; 52 53 cx = 7, cy = 7; //パックマンの初期位置 54 ex = 1, ey = 1; //敵の初期位置 55 56 //エサの個数を数える 57 for (y = 0; y < SIZE; y++) 58 { 59 for (x = 0; x < SIZE; x++) 60 { 61 if (field[y][x] == FOOD) 62 food_count++; 63 else if (field[y][x] == POWER_FOOD) 64 power_food_count++; 65 } 66 67 } 68 69 while (1) 70 { 71 // まずはPACMANの動き 72 // キーが押されていたら、キーコードを取得する 73 // 4なら左、6なら右、8なら上、2なら下 74 if (kbhit()) // キーが入力されていれば真 75 { 76 key = getch();//一文字入力、エコーバックなし 77 kx = cx, ky = cy;//パックマンの座標を保存する 78 switch (key) 79 { 80 case '4': 81 cx--; 82 break; 83 case '6': 84 cx++; 85 break; 86 case '2': 87 cy++; 88 break; 89 case '8': 90 cy--; 91 break; 92 } 93 94 cx = (cx + SIZE) % SIZE; //ワープ 95 switch (field[cy][cx]) 96 { 97 case WALL://壁 98 cx = kx, cy = ky; //動けないので cx, cy を元に戻す 99 //壁に当たると自機の座標に元の座標を代入する 100 break; 101 case FOOD: 102 field[cy][cx] = 0;//餌を食べると餌が消える 103 point += 10; //得点加算 104 food_count--; //餌の数を減らしていく 105 break; 106 case POWER_FOOD: 107 field[cy][cx] = 0; //パワーエサを食べると消える 108 life += 1; //LIFE加算 109 power_food_count--;//パワーエサの数を減らしていく 110 break; 111 112 113 } 114 115 } 116 117 118 //ここから敵の動き 119 120 mx = ex; my = ey; //敵の座標を保存する 121 122 if (ex > cx) //敵のx座標 > パックマンのx座標 なら 敵のx座標を減らしてパックマンに近づく。 123 ex--; 124 else if (ex < cx) //敵のx座標 < パックマンのx座標 なら 敵のx座標を増やしてパックマンに近づく。 125 ex++; 126 else if (ey < cy) //敵のy座標 > パックマンのy座標 なら 敵のy座標を減らしてパックマンに近づく。 127 ey++; 128 else if (ey > cy) //敵のy座標 < パックマンのy座標 なら 敵のy座標を増やしてパックマンに近づく。 129 ey--; 130 131 if (field[ey][ex] == WALL) //もし敵が壁に当たったらもとの座標に戻す。 132 { 133 ex = mx; ey = my; 134 135 } 136 137 138 ex = (ex + SIZE) % SIZE; //ワープ 139 140 if (cx == ex && cy == ey) { //もしパックマンと衝突したら マップの真ん中に移動し少し待つ。 141 life--; // そしてLIFE-1 142 ex = 7, ey = 7; 143 Sleep(wait_time); 144 } 145 146 147 // 画面表示 148 for (y = 0; y < SIZE; y++) { 149 for (x = 0; x < SIZE; x++) { 150 if (x == cx && y == cy) 151 printf("C "); 152 else if (x == ex && y == ey) 153 printf("◇"); 154 else if (field[y][x] == FOOD) 155 printf(". "); 156 else if (field[y][x] == WALL) 157 printf("■"); 158 else if (field[y][x] == POWER_FOOD) 159 printf("P "); 160 else 161 printf(" "); 162 } 163 printf("\n"); 164 } 165 166 // すべての場所で field[y][x] の値を元に表示 167 168 169 printf("\n"); 170 printf(" (cx,cy) = (%d, %d)\n", cx, cy); 171 printf(" (ex,ey) = (%d, %d)\n", ex, ey); 172 printf(" point: %d\n", point); 173 printf(" LIFE: %d\n", life); 174 175 if (life == 0) 176 { 177 printf("┏ ┏━┓┏━┓┏┳┓┳━┓ ┏━┓┳ ┳┳━┓┳━┓ ┓\n"); 178 printf("┃ ┃ ┓┣━┫┃┃┃┣┫ ┃ ┃┃ ┃┣┫ ┣┳┛ ┃\n"); 179 printf("┗ ┗━┛┻ ┻┻ ┻┻━┛ ┗━┛┗━┛┻━┛┻┗┛ ┛\n"); 180 Sleep(wait_time); 181 break; 182 } 183 184 if (food_count == 0) //餌を食べきったとき(=CRER)の画面表示 185 { 186 printf("┏ ┏━┓┏━┓┏┳┓┳━┓ ┏━┓ ┳━┓ ┳━┓ ┳━┓ ┓\n"); 187 printf("┃ ┃ ┓┣━┫┃┃┃┣┫ ┃ ┣┳┛ ┣┫ ┣┳┛ ┃\n"); 188 printf("┗ ┗━┛┻ ┻┻ ┻┻━┛ ┗━┛ ┻┗┛ ┻━┛ ┻┗┛ ┛\n"); 189 Sleep(wait_time); 190 break; 191 192 } 193 Sleep(wait_time);// 1秒間(wait_timeミリ秒)何もしない 194 system("cls");// 画面消去 195 } 196 197 return 0; 198} 199
###試したこと
敵が壁に当たった時に、一度ランダムに動かそうと思い、
if (field[ey][ex] == WALL) //もし敵が壁に当たったらもとの座標に戻す。
{
ex = mx; ey = my;
j = rand() % 4;
switch (j)
{
case '0':
ex--;
break;
case '1':
ex++;
break;
case '2':
ey++;
break;
case '3':
ey--;
break;
}
}
にしましたが、やはり敵が壁に当たると全く動きません。
###補足情報(言語/FW/ツール等のバージョンなど)
C++
Visual Studio 2015
回答2件
あなたの回答
tips
プレビュー