3次元配列を使って、通路を9階建ての建物に見立てて、移動するプログラムを作成中です。マップは階数がわかりやすいように各階の数字にしてます。
例えば1階から2階に上がるとき、1階の1の場所にXの文字が来たら2階の1の場所に移動、2階の0の場所から3階の0の場所というように表示するようにしたいのですが3次元配列の座標の取り方、画面の切り替え方がわからないです。
1階から2階で固定値でならなんとか行けましたが・・・。変数でどそ階でもできるようにアドバイスいただけたらと思います。
C
1#include<conio.h> 2#include <stdlib.h> 3 4#define XMAX 10 5#define YMAX 15 6#define ZMAX 9 7#define XMIN 0 8#define YMIN 0 9#define ZMIN 0 10#define KEYPUSH 0x00 11#define KEYUP 0x48 12#define KEYDOWN 0x50 13#define KEYRIGHT 0x4d 14#define KEYLEFT 0x4b 15#define KEYESC 0x1b 16 17char xi = 5;/*Xのx座標*/ 18char yi = 13;/*Xのy座標*/ 19char zi = 0;/*Xのz座標*/ 20char yj,xj,zj; 21char si = 5;/*1のx座標*/ 22char ti = 1;/*1のy座標*/ 23char ui = 0;/*1のz座標*/ 24char ai;/*0のx座標*/ 25char bi;/*0のy座標*/ 26char ci;/*0のz座標*/ 27char map[ZMAX][YMAX][XMAX]= 28{ 29 { 30 {'#','#','#','#','#','#','#','#','#','#'}, 31 {'#','#','#','#','1','#','#','#','#','#'}, 32 {'#','#',' ',' ',' ','#','#','#','#','#'}, 33 {'#','#','#','#',' ','#','#','#','#','#'}, 34 {'#','#','#','#',' ','#','#','#','#','#'}, 35 {'#','#','#','#',' ','#','#','#','#','#'}, 36 {'#','#','#','#',' ','#','#','#','#','#'}, 37 {'#','#','#','#',' ','#','#','#','#','#'}, 38 {'#','#','#','#',' ','#','#','#','#','#'}, 39 {'#','#','#','#',' ','#','#','#','#','#'}, 40 {'#','#','#','#',' ','#','#','#','#','#'}, 41 {'#','#','#','#',' ','#','#','#','#','#'}, 42 {'#','#','#','#',' ','#','#','#','#','#'}, 43 {'#','#',' ',' ',' ',' ',' ','#','#','#'}, 44 {'#','#','#','#','#','#','#','#','#','#'} 45 }, 46 47 { 48 {'#','#','#','#','#','#','#','#','#','#'}, 49 {'#','#','#',' ',' ','0',' ',' ',' ','#'}, 50 {'#','#','#',' ','#','#','#',' ',' ','#'}, 51 {'#','#','#','#','#','#','#','#',' ','#'}, 52 {'#','#','#','#','#','#','#','#',' ','#'}, 53 {'#','#','#','#','#','#','#','#',' ','#'}, 54 {'#','#','#','#','#','#','#',' ',' ','#'}, 55 {'#','#','#','#','#','#',' ',' ','#','#'}, 56 {'#','#','#','#','#',' ',' ','#','#','#'}, 57 {'#','#','#','#',' ',' ','#','#','#','#'}, 58 {'#','#','#',' ',' ','#','#','#','#','#'}, 59 {'#','#',' ',' ','#','#','#','#','#','#'}, 60 {'#','#',' ','#','#','#','#','#','#','#'}, 61 {'#','#',' ',' ','1',' ',' ',' ','#','#'}, 62 {'#','#','#','#','#','#','#','#','#','#'} 63 }, 64 65 { 66 {'#','#','#','#','#','#','#','#','#','#'}, 67 {'#','#',' ',' ',' ','1',' ',' ',' ','#'}, 68 {'#','#','#','#','#','#','#','#',' ','#'}, 69 {'#','#','#','#','#','#','#','#',' ','#'}, 70 {'#','#','#','#','#','#','#','#',' ','#'}, 71 {'#','#','#','#','#','#','#','#',' ','#'}, 72 {'#','#','#','#','#','#','#','#',' ','#'}, 73 {'#','#',' ',' ',' ',' ',' ',' ',' ','#'}, 74 {'#','#','#','#','#','#','#','#',' ','#'}, 75 {'#','#','#','#','#','#','#','#',' ','#'}, 76 {'#','#','#','#','#','#','#','#',' ','#'}, 77 {'#','#','#','#','#','#','#','#',' ','#'}, 78 {'#','#','#','#','#','#','#','#',' ','#'}, 79 {'#','#',' ',' ',' ','0',' ',' ',' ','#'}, 80 {'#','#','#','#','#','#','#','#','#','#'} 81 }, 82 83・・・9階分作成する。量が多いため割愛 84}; 85short key(void); 86void disp(void); 87 88void main(void) 89{ 90 for(yj = 0; yj < YMAX; yj++) 91 { 92 for (xj = 0; xj < XMAX; xj++) 93 { 94 for (zj = 0; zj < ZMAX; zj++) 95 { 96 if((zj == zi) && (yj == yi) && (xj == xi)) 97 { 98 printf("X"); 99 } 100 else 101 { 102 printf("%c", map[zi][yi][xi]); 103 } 104 } 105 } 106 printf("\n"); 107 } 108 109 while(1) 110 { 111 if(key() == 1) 112 { 113 break; 114 } 115 else 116 { 117 disp(); 118 } 119 } 120} 121 122short key() 123{ 124 short kn; 125 126 kn = getch(); 127 128 if(kn == KEYESC) 129 { 130 return 1; 131 } 132 else if(kn == KEYPUSH) 133 { 134 kn = getch(); 135//printf("kn = %x",kn); 136 switch(kn) 137 { 138 case KEYUP: 139 if(yi > YMIN) 140 { 141 if((map[zi][yi-1][xi] == ' ') || (map[zi][yi-1][xi] == '1') || (map[zi][yi-1][xi] == '0'))/*Xのy座標-1に#,0,1がない*/ 142 { 143 yi--; 144 } 145 } 146 break; 147 case KEYDOWN: 148 if(yi < YMAX-1) 149 { 150 if((map[zi][yi+1][xi] == ' ') || (map[zi][yi+1][xi] == '1') || (map[zi][yi+1][xi] == '0'))/*Xのy座標+1に#,0,1がない*/ 151 { 152 yi++; 153 } 154 } 155 break; 156 case KEYRIGHT: 157 if(xi < XMAX-1) 158 { 159 if((map[zi][yi][xi+1] == ' ') || (map[zi][yi][xi+1] == '1') || (map[zi][yi][xi+1] == '0'))/*Xのx座標+1に#,0,1がない*/ 160 { 161 xi++; 162 } 163 } 164 break; 165 case KEYLEFT: 166 if(xi > XMIN) 167 { 168 if((map[zi][yi][xi-1] == ' ') || (map[zi][yi][xi-1] == '1') || (map[zi][yi][xi-1] == '0'))/*Xのx座標-1に#,0,1がない*/ 169 { 170 xi--; 171 } 172 } 173 break; 174 default: 175 break; 176 } 177 } 178 return 0; 179} 180 181void disp() 182{ 183 system("cls");/*画面クリア*/ 184 if(zi == 0)/*Xが1階にある*/ 185 { 186 printf("zi = %d\n",zi); 187 if((yi == si) && (xi == ti))/*(Xのy座標が1のy座標) && (Xのx座標が1のx座標)*/ 188 { 189 printf("yi = %d,xi = %d\n",yi,xi); 190 for(yj = 0; yj < YMAX; yj++) 191 { 192 for (xj = 0; xj < XMAX; xj++) 193 { 194 if((zj == (zi+1)) && (yj == yi) && (xj == xi))/*Xを上段の1の位置に表示*/ 195 { 196 printf("X"); 197 } 198 else 199 { 200 printf("%c", map[(zi+1)][yi][xi]); 201 } 202 } 203 printf("\n"); 204 } 205 } 206 else 207 { 208 /*キー処理後の位置にXを表示*/ 209 for(yj = 0; yj < YMAX; yj++) 210 { 211 for (xj = 0; xj < XMAX; xj++) 212 { 213 if((yj == yi) && (xj == xi)) 214 { 215 printf("X"); 216 } 217 else 218 { 219 printf("%c", map[zi][yj][xj]); 220 } 221 } 222 printf("\n"); 223 } 224 } 225 } 226 227 228 if(zi == 1 || zi == 3 || zi == 5 || zi == 7)/*Xが2/4/6/8階にある*/ 229 { 230 if((yi == si) && (xi == ti))/*(Xのy座標が1のy座標) && (Xのx座標が1のx座標)*/ 231 { 232 /*Xを下段の1の位置を表示*/ 233 for(yj = 0; yj < YMAX; yj++) 234 { 235 for (xj = 0; xj < XMAX; xj++) 236 { 237 if((zj == (zi-1)) && (yj == yi) && (xj == xi)) 238 { 239 printf("X");/*Xを下段の1の位置に表示*/ 240 } 241 else 242 { 243 printf("%c", map[zi][yj][xj]); 244 } 245 } 246 printf("\n"); 247 } 248 } 249 else if((yi == bi) && (xi == ai))/*(Xのy座標が0のy座標) && (Xのx座標が0のx座標)*/ 250 { 251 /*Xを上段の0の位置を表示*/ 252 for(yj = 0; yj < YMAX; yj++) 253 { 254 for (xj = 0; xj < XMAX; xj++) 255 { 256 if((zj == ci) && (yj == bi) && (xj == ai)) 257 { 258 printf("X"); 259 } 260 else 261 { 262 printf("%c", map[zi][yj][xj]); 263 } 264 } 265 printf("\n"); 266 } 267 } 268 else 269 { 270 /*キー処理後の位置にXを表示*/ 271 for(yj = 0; yj < YMAX; yj++) 272 { 273 for (xj = 0; xj < XMAX; xj++) 274 { 275 if((yj == yi) && (xj == xi)) 276 { 277 printf("X"); 278 } 279 else 280 { 281 printf("%c", map[zi][yj][xj]); 282 } 283 } 284 printf("\n"); 285 } 286 } 287 } 288 289 if(zi == 2 ||zi == 4 ||zi == 6)/*Xが3/5/7階にある*/ 290 { 291 if((yi == si) && (xi == ti))/*(Xのy座標が1のy座標) && (Xのx座標が1のx座標)*/ 292 { 293 /*Xを上段の〇の位置を表示*/ 294 for(yj = 0; yj < YMAX; yj++) 295 { 296 for (xj = 0; xj < XMAX; xj++) 297 { 298 if((zj == (zi+1)) && (yj == yi) && (xj == xi)) 299 { 300 printf("X");/*Xを上段の〇の位置に表示*/ 301 } 302 else 303 { 304 printf("%c", map[zj][yj][xj]); 305 } 306 } 307 printf("\n"); 308 } 309 } 310 else if((yi == bi) && (xi == ai))/*(Xのy座標が0のy座標) && (Xのx座標が0のx座標)*/ 311 { 312 /*Xを下段の0の位置を表示*/ 313 for(yj = 0; yj < YMAX; yj++) 314 { 315 for (xj = 0; xj < XMAX; xj++) 316 { 317 if((zj == (zi-1)) && (yj == yi) && (xj == xi)) 318 { 319 printf("X"); 320 } 321 else 322 { 323 printf("%c", map[zj][yj][xj]); 324 } 325 } 326 printf("\n"); 327 } 328 } 329 else 330 { 331 /*キー処理後の位置にXを表示*/ 332 for(yj = 0; yj < YMAX; yj++) 333 { 334 for (xj = 0; xj < XMAX; xj++) 335 { 336 if((yj == yi) && (xj == xi)) 337 { 338 printf("X"); 339 } 340 else 341 { 342 printf("%c", map[zi][yj][xj]); 343 } 344 } 345 printf("\n"); 346 } 347 } 348 } 349 350 if(zi == 8)/*Xが9階にある*/ 351 { 352 if((yi == bi) && (xi == ai))/*(Xのy座標が0のy座標) && (Xのx座標が0のx座標)*/ 353 { 354 /*Xを下段の0の位置を表示*/ 355 for(yj = 0; yj < YMAX; yj++) 356 { 357 for (xj = 0; xj < XMAX; xj++) 358 { 359 if((zj == (zi-1)) && (yj == yi) && (xj == xi)) 360 { 361 printf("X"); 362 } 363 else 364 { 365 printf("%c", map[zj][yj][xj]); 366 } 367 } 368 printf("\n"); 369 } 370 } 371 else 372 { 373 /*キー処理後の位置にXを表示*/ 374 for(yj = 0; yj < YMAX; yj++) 375 { 376 for (xj = 0; xj < XMAX; xj++) 377 { 378 if((yj == yi) && (xj == xi)) 379 { 380 printf("X"); 381 } 382 else 383 { 384 printf("%c", map[zi][yj][xj]); 385 } 386 } 387 printf("\n"); 388 } 389 } 390 } 391}
先のご質問 [特定の記号がある場所まで文字を移動させたい]( https://teratail.com/questions/250823 )は放置でしょうか.
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11222506456
ばら撒き...じゃないマルチポストを行う場合ローカルルールがあります。
https://teratail.com/help#posted-otherservice を参照して適切に処置して下さい
知恵袋の方は削除したわけね。
そりゃ、あっちではそういう操作も可能になってはいるけれど、既に回答のついた質問を削除するってのは回答してくれた人に対してとても「失礼なこと」だと思うよ。(teratailでは回答がつくと簡単には削除出来ない)
> 例えば1階から2階に上がるとき、1階の1の場所にXの文字が来たら2階の1の場所に移動、2階の0の場所から3階の0の場所
処理ルールがわかりません.
コードの配列データを見ると3階(と思しきところ)にも'1'が存在しているので,'0'とか'1'とかいうのが必ずデータ内に「一意な対」として存在しているわけでもなさそうですし???
https://teratail.com/help/question-tips
とりあえず、↑を熟読して下さい。
あなたの回答
tips
プレビュー