3次元配列で通路をマップを作成し、その中を文字が移動するプログラムを作成中です。
マップは階数がわかりやすいように各階の数字にしています。(1~9)
●や○の箇所に文字を移動させたいのですが記号のある箇所の1つ手前で止まってしまい悩んでます。
C
1#include<stdio.h> 2#include<conio.h> 3#include <stdlib.h> 4 5#define XMAX 10 6#define YMAX 15 7#define ZMAX 9 8#define XMIN 0 9#define YMIN 0 10#define ZMIN 0 11#define KEYPUSH 0x00 12#define KEYUP 0x48 13#define KEYDOWN 0x50 14#define KEYRIGHT 0x4d 15#define KEYLEFT 0x4b 16#define KEYESC 0x1b 17 18char xi = 5;/*Xのx座標*/ 19char yi = 13;/*Xのy座標*/ 20char zi = 0;/*Xのz座標*/ 21char yj,xj,zj; 22char si;/*○のx座標*/ 23char ti;/*○のy座標*/ 24char ui;/*○のz座標*/ 25char ai;/*●のx座標*/ 26char bi;/*●のy座標*/ 27char ci;/*●のz座標*/ 28char map[ZMAX][YMAX][XMAX]= 29{ 30 { 31 {'#','#','#','#','#','#','#','#','#','#'}, 32 {'#','#','#','#','○','#','#','#','#','#'}, 33 {'#','#',' ',' ',' ','#','#','#','#','#'}, 34 {'#','#','#','#',' ','#','#','#','#','#'}, 35 {'#','#','#','#',' ','#','#','#','#','#'}, 36 {'#','#','#','#',' ','#','#','#','#','#'}, 37 {'#','#','#','#',' ','#','#','#','#','#'}, 38 {'#','#','#','#',' ','#','#','#','#','#'}, 39 {'#','#','#','#',' ','#','#','#','#','#'}, 40 {'#','#','#','#',' ','#','#','#','#','#'}, 41 {'#','#','#','#',' ','#','#','#','#','#'}, 42 {'#','#','#','#',' ','#','#','#','#','#'}, 43 {'#','#','#','#',' ','#','#','#','#','#'}, 44 {'#','#',' ',' ',' ',' ',' ','#','#','#'}, 45 {'#','#','#','#','#','#','#','#','#','#'} 46 }, 47 48 { 49 {'#','#','#','#','#','#','#','#','#','#'}, 50 {'#','#','#',' ',' ','●',' ',' ',' ','#'}, 51 {'#','#','#',' ','#','#','#',' ',' ','#'}, 52 {'#','#','#','#','#','#','#','#',' ','#'}, 53 {'#','#','#','#','#','#','#','#',' ','#'}, 54 {'#','#','#','#','#','#','#','#',' ','#'}, 55 {'#','#','#','#','#','#','#',' ','#','#'}, 56 {'#','#','#','#','#','#',' ','#','#','#'}, 57 {'#','#','#','#','#',' ','#','#','#','#'}, 58 {'#','#','#','#',' ','#','#','#','#','#'}, 59 {'#','#','#',' ','#','#','#','#','#','#'}, 60 {'#','#',' ','#','#','#','#','#','#','#'}, 61 {'#','#',' ','#','#','#','#','#','#','#'}, 62 {'#','#',' ',' ','○',' ',' ',' ','#','#'}, 63 {'#','#','#','#','#','#','#','#','#','#'} 64 }, 65 66 { 67 {'#','#','#','#','#','#','#','#','#','#'}, 68 {'#','#',' ',' ',' ','○',' ',' ',' ','#'}, 69 {'#','#','#','#','#','#','#','#',' ','#'}, 70 {'#','#','#','#','#','#','#','#',' ','#'}, 71 {'#','#','#','#','#','#','#','#',' ','#'}, 72 {'#','#','#','#','#','#','#','#',' ','#'}, 73 {'#','#','#','#','#','#','#','#',' ','#'}, 74 {'#','#',' ',' ',' ',' ',' ',' ',' ','#'}, 75 {'#','#','#','#','#','#','#','#',' ','#'}, 76 {'#','#','#','#','#','#','#','#',' ','#'}, 77 {'#','#','#','#','#','#','#','#',' ','#'}, 78 {'#','#','#','#','#','#','#','#',' ','#'}, 79 {'#','#','#','#','#','#','#','#',' ','#'}, 80 {'#','#',' ',' ',' ','●',' ',' ',' ','#'}, 81 {'#','#','#','#','#','#','#','#','#','#'} 82 }, 83 84 { 85 {'#','#','#','#','#','#','#','#','#','#'}, 86 {'#','#','#','#','#','#','#','●',' ','#'}, 87 {'#','#','#','#','#','#',' ','#',' ','#'}, 88 {'#','#','#','#','#',' ','#','#',' ','#'}, 89 {'#','#','#','#',' ','#','#','#',' ','#'}, 90 {'#','#','#',' ','#','#','#','#',' ','#'}, 91 {'#','#',' ','#','#','#','#','#',' ','#'}, 92 {'#',' ','#','#','#','#','#','#',' ','#'}, 93 {'#',' ','#','#','#','#','#','#',' ','#'}, 94 {'#',' ',' ',' ',' ','○',' ',' ',' ',' '}, 95 {'#','#','#','#','#','#','#','#',' ','#'}, 96 {'#','#','#','#','#','#','#','#',' ','#'}, 97 {'#','#','#','#','#','#','#','#',' ','#'}, 98 {'#','#','#','#','#','#','#','#',' ','#'}, 99 {'#','#','#','#','#','#','#','#','#','#'} 100 }, 101 102 { 103 {'#','#','#','#','#','#','#','#','#','#'}, 104 {'#',' ',' ',' ',' ','○',' ',' ','#','#'}, 105 {'#',' ','#','#','#','#','#','#','#','#'}, 106 {'#',' ','#','#','#','#','#','#','#','#'}, 107 {'#',' ','#','#','#','#','#','#','#','#'}, 108 {'#',' ','#','#','#','#','#','#','#','#'}, 109 {'#',' ','#','#','#','#','#','#','#','#'}, 110 {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'}, 111 {'#','#','#','#','#','#','#','#',' ','#'}, 112 {'#','#','#','#','#','#','#','#',' ','#'}, 113 {'#','#','#','#','#','#','#','#',' ','#'}, 114 {'#','#','#','#','#','#','#','#',' ','#'}, 115 {'#','#','#','#','#','#','#','#',' ','#'}, 116 {'#','#',' ',' ',' ',' ',' ','●',' ','#'}, 117 {'#','#','#','#','#','#','#','#','#','#'} 118 }, 119 120 { 121 {'#','#','#','#','#','#','#','#','#','#'}, 122 {'#',' ',' ',' ',' ',' ',' ',' ','●','#'}, 123 {'#',' ','#','#','#','#','#','#','#','#'}, 124 {'#',' ','#','#','#','#','#','#','#','#'}, 125 {'#',' ','#','#','#','#','#','#','#','#'}, 126 {'#',' ','#','#','#','#','#','#','#','#'}, 127 {'#',' ','#','#','#','#','#','#','#','#'}, 128 {'#',' ',' ',' ',' ',' ',' ',' ',' ','#'}, 129 {'#',' ','#','#','#','#','#','#',' ','#'}, 130 {'#',' ','#','#','#','#','#','#',' ','#'}, 131 {'#',' ','#','#','#','#','#','#',' ','#'}, 132 {'#',' ','#','#','#','#','#','#',' ','#'}, 133 {'#',' ','#','#','#','#','#','#',' ','#'}, 134 {'#',' ',' ',' ',' ',' ',' ','○',' ','#'}, 135 {'#','#','#','#','#','#','#','#','#','#'} 136 } 137}; 138short key(void); 139void disp(void); 140 141void main(void) 142{ 143 for(yj = 0; yj < YMAX; yj++) 144 { 145 for (xj = 0; xj < XMAX; xj++) 146 { 147 for (zj = 0; zj < ZMAX; zj++) 148 { 149 if((zj == zi) && (yj == yi) && (xj == xi)) 150 { 151 printf("X"); 152 } 153 else 154 { 155 printf("%c", map[zi][yi][xi]); 156 } 157 } 158 } 159 printf("\n"); 160 } 161 162 while(1) 163 { 164 if(key() == 1) 165 { 166 break; 167 } 168 else 169 { 170 disp(); 171 } 172 } 173} 174 175short key() 176{ 177 short kn; 178 179 kn = getch(); 180 181 if(kn == KEYESC) 182 { 183 return 1; 184 } 185 else if(kn == KEYPUSH) 186 { 187 kn = getch(); 188//printf("kn = %x",kn); 189 switch(kn) 190 { 191 case KEYUP: 192 if(yi > YMIN) 193 { 194 if((map[zi][yi-1][xi] == ' ') || (map[zi][yi-1][xi] == '○') || (map[zi][yi-1][xi] == '●')) 195 { 196 yi--; 197 } 198 } 199 break; 200 case KEYDOWN: 201 if(yi < YMAX-1) 202 { 203 if(map[zi][yi+1][xi] == ' ') 204 { 205 yi++; 206 } 207 } 208 break; 209 case KEYRIGHT: 210 if(xi < XMAX-1) 211 { 212 if(map[zi][yi][xi+1] == ' ') 213 { 214 xi++; 215 } 216 } 217 break; 218 case KEYLEFT: 219 if(xi > XMIN) 220 { 221 if(map[zi][yi][xi-1] == ' ') 222 { 223 xi--; 224 } 225 } 226 break; 227 default: 228 break; 229 } 230 } 231 return 0; 232} 233 234void disp() 235{ 236 system("cls"); 237 if(zi == 0)/*Xが1階にある*/ 238 { 239 if((yi == si) && (xi == ti))/*(Xのy座標が〇のy座標) && (Xのx座標が〇のx座標)*/ 240 { 241 for(yj = 0; yj < YMAX; yj++) 242 { 243 for (xj = 0; xj < XMAX; xj++) 244 { 245 if((zj == zi+1) && (yj == yi) && (xj == xi))/*Xを上段の〇の位置に表示*/ 246 { 247 printf("X"); 248 } 249 else 250 { 251 printf("%c", map[zi][yi][xi]); 252 } 253 } 254 printf("\n"); 255 } 256 } 257 else 258 { 259 /*キー処理後の位置にXを表示*/ 260 for(yj = 0; yj < YMAX; yj++) 261 { 262 for (xj = 0; xj < XMAX; xj++) 263 { 264 if((yj == yi) && (xj == xi)) 265 { 266 printf("X"); 267 } 268 else 269 { 270 printf("%c", map[zi][yj][xj]); 271 } 272 } 273 printf("\n"); 274 } 275 } 276 } 277 278 279 if(zi == 1 || zi == 3 || zi == 5 || zi == 7) 280 { 281 if((yi == si) && (xi == ti)) 282 { 283 for(yj = 0; yj < YMAX; yj++) 284 { 285 for (xj = 0; xj < XMAX; xj++) 286 { 287 if((zj == (zi-1)) && (yj == yi) && (xj == xi)) 288 { 289 printf("X"); 290 } 291 else 292 { 293 printf("%c", map[zi][yj][xj]); 294 } 295 } 296 printf("\n"); 297 } 298 } 299 else if((yi == bi) && (xi == ai)) 300 { 301 for(yj = 0; yj < YMAX; yj++) 302 { 303 for (xj = 0; xj < XMAX; xj++) 304 { 305 if((zj == ci) && (yj == bi) && (xj == ai)) 306 { 307 printf("X"); 308 } 309 else 310 { 311 printf("%c", map[zi][yj][xj]); 312 } 313 } 314 printf("\n"); 315 } 316 } 317 else 318 { 319 for(yj = 0; yj < YMAX; yj++) 320 { 321 for (xj = 0; xj < XMAX; xj++) 322 { 323 if((yj == yi) && (xj == xi)) 324 { 325 printf("X"); 326 } 327 else 328 { 329 printf("%c", map[zi][yj][xj]); 330 } 331 } 332 printf("\n"); 333 } 334 } 335 } 336 337 if(zi == 2 ||zi == 4 ||zi == 6) 338 { 339 if((yi == si) && (xi == ti)) { 340 for(yj = 0; yj < YMAX; yj++) 341 { 342 for (xj = 0; xj < XMAX; xj++) 343 { 344 if((zj == (zi+1)) && (yj == yi) && (xj == xi)) 345 { 346 printf("X"); 347 } 348 else 349 { 350 printf("%c", map[zj][yj][xj]); 351 } 352 } 353 printf("\n"); 354 } 355 } 356 else if((yi == bi) && (xi == ai)) 357 { 358 for(yj = 0; yj < YMAX; yj++) 359 { 360 for (xj = 0; xj < XMAX; xj++) 361 { 362 if((zj == (zi-1)) && (yj == yi) && (xj == xi)) 363 { 364 printf("X"); 365 } 366 else 367 { 368 printf("%c", map[zj][yj][xj]); 369 } 370 } 371 printf("\n"); 372 } 373 } 374 else 375 { 376 for(yj = 0; yj < YMAX; yj++) 377 { 378 for (xj = 0; xj < XMAX; xj++) 379 { 380 if((yj == yi) && (xj == xi)) 381 { 382 printf("X"); 383 } 384 else 385 { 386 printf("%c", map[zi][yj][xj]); 387 } 388 } 389 printf("\n"); 390 } 391 } 392 } 393 394 if(zi == 8) 395 { 396 if((yi == bi) && (xi == ai)) 397 { 398 for(yj = 0; yj < YMAX; yj++) 399 { 400 for (xj = 0; xj < XMAX; xj++) 401 { 402 if((zj == (zi-1)) && (yj == yi) && (xj == xi)) 403 { 404 printf("X"); 405 } 406 else 407 { 408 printf("%c", map[zj][yj][xj]); 409 } 410 } 411 printf("\n"); 412 } 413 } 414 else 415 { 416 for(yj = 0; yj < YMAX; yj++) 417 { 418 for (xj = 0; xj < XMAX; xj++) 419 { 420 if((yj == yi) && (xj == xi)) 421 { 422 printf("X"); 423 } 424 else 425 { 426 printf("%c", map[zi][yj][xj]); 427 } 428 } 429 printf("\n"); 430 } 431 } 432 } 433}
もう少し具体的に, どう操作されてどういう表示になって止まってしまうのでしょう.
また, 悩んで何か調べたり試したりはされたのでしょうか. されてましたら, その結果分かった事なども含めてご質問に追記して頂けますか.