質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

0回答

518閲覧

3次元配列の画面の切り替え

misamaru

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/04/02 17:07

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/04/03 00:10

知恵袋の方は削除したわけね。 そりゃ、あっちではそういう操作も可能になってはいるけれど、既に回答のついた質問を削除するってのは回答してくれた人に対してとても「失礼なこと」だと思うよ。(teratailでは回答がつくと簡単には削除出来ない)
fana

2020/04/03 01:14

> 例えば1階から2階に上がるとき、1階の1の場所にXの文字が来たら2階の1の場所に移動、2階の0の場所から3階の0の場所 処理ルールがわかりません. コードの配列データを見ると3階(と思しきところ)にも'1'が存在しているので,'0'とか'1'とかいうのが必ずデータ内に「一意な対」として存在しているわけでもなさそうですし???
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問