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

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

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

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

Q&A

3回答

497閲覧

特定の記号がある場所まで文字を移動させたい

misamaru

総合スコア5

C

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

1グッド

1クリップ

投稿2020/04/01 17:21

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}
DrqYuto👍を押しています

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

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

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

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

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

jimbe

2020/04/01 18:35

もう少し具体的に, どう操作されてどういう表示になって止まってしまうのでしょう. また, 悩んで何か調べたり試したりはされたのでしょうか. されてましたら, その結果分かった事なども含めてご質問に追記して頂けますか.
guest

回答3

0

〇 や ● は2バイト文字です。
コンパイル時にワーニングかなんか出てないですかね?
map[zi][yi-1][xi] == '○'のような比較はできません。
マップを定義している配列も、おそらく文字コードの上位バイトのみに切り捨てられて登録されているものと思われます。
〇 や ● を別の1バイト文字に置き換えてみては。

投稿2020/04/02 01:08

ttyp03

総合スコア16998

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

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

jimbe

2020/04/02 11:52

確かに.
pepperleaf

2020/04/02 12:02

Visual studio 2019 でコンパイル(cl test.c ) したけど、エラー無し。 もっとも正しく動くとは思えないけど。 時間とれたら、見てみよう。
kaina

2020/04/02 13:44

普通こんな感じでエラーになりますよねw Main.c:31:26: error: character too large for enclosing character literal type {'#','#','#','#','○','#','#','#','#','#'},
thkana

2020/04/02 22:30

Cだと文字リテラルはint型(charじゃない)だというあたりが絡むんでしょうかね。複数バイトがどうintに落とされるかは処理系依存だったか。
guest

0

コードを見ていて気が付きましたが, KEYUP の時は if の条件内に 〇 や ● の記述があるのに, KEYDOWN/KEYRIGHT/KEYLEFT の時の if の条件内にはありません.
もしや, 上に移動時は 〇 や ● に行けるのに 下右左では行けないのではありませんか?

#追加
〇→O, ●→@ として, 階段にしてみました. ENTER で入ります.

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 6 8#define XMIN 0 9#define YMIN 0 10#define ZMIN 0 11 12#define KEYPUSH 0x00 13#define KEYENTER 0x0d 14#define KEYUP 0x48 15#define KEYDOWN 0x50 16#define KEYRIGHT 0x4d 17#define KEYLEFT 0x4b 18#define KEYESC 0x1b 19 20#define PLAYER 'X' 21#define WALL '#' 22#define STAIRSUP 'O' 23#define STAIRSDOWN '@' 24 25int xi = 5; /*Xのx座標*/ 26int yi = 13;/*Xのy座標*/ 27int zi = 0; /*Xのz座標*/ 28char *map[ZMAX][YMAX] = { 29 { 30 "##########", 31 "####O#####", 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 "## O ##", 60 "##########" 61 }, { 62 "##########", 63 "## O #", 64 "######## #", 65 "######## #", 66 "######## #", 67 "######## #", 68 "######## #", 69 "## #", 70 "######## #", 71 "######## #", 72 "######## #", 73 "######## #", 74 "######## #", 75 "## @ #", 76 "##########" 77 }, { 78 "##########", 79 "#######@ #", 80 "###### #", 81 "##### # #", 82 "#### ## #", 83 "### ### #", 84 "## #### #", 85 "# ##### #", 86 "# ###### #", 87 "# O ", 88 "######## #", 89 "######## #", 90 "######## #", 91 "######## #", 92 "##########" 93 }, { 94 "##########", 95 "# O ##", 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 128void stairs() { 129 int x, y, next; 130 char target, **floor; 131 132 next = zi + (map[zi][yi][xi] == STAIRSUP ? 1 : -1); 133 if(next < 0 || ZMAX <= next) return; 134 135 target = (map[zi][yi][xi] == STAIRSUP ? STAIRSDOWN : STAIRSUP); 136 floor = map[next]; 137 for (y = YMIN; y < YMAX; y++) { 138 for (x = XMIN; x < XMAX; x++) { 139 if (floor[y][x] == target) { 140 xi = x; 141 yi = y; 142 zi = next; 143 return; 144 } 145 } 146 } 147} 148 149int key() { 150 switch (getch()) { 151 case KEYESC: 152 return 1; 153 case KEYUP: 154 if (yi > YMIN && map[zi][yi - 1][xi] != WALL) yi--; 155 break; 156 case KEYDOWN: 157 if (yi < YMAX - 1 && map[zi][yi + 1][xi] != WALL) yi++; 158 break; 159 case KEYRIGHT: 160 if (xi < XMAX - 1 && map[zi][yi][xi + 1] != WALL) xi++; 161 break; 162 case KEYLEFT: 163 if (xi > XMIN && map[zi][yi][xi - 1] != WALL) xi--; 164 break; 165 case KEYENTER: 166 if (map[zi][yi][xi] == STAIRSUP || map[zi][yi][xi] == STAIRSDOWN) stairs(); 167 break; 168 } 169 return 0; 170} 171 172void disp() { 173 int x, y; 174 char **floor; 175 176 system("cls"); 177 floor = map[zi]; 178 for (y = YMIN; y < YMAX; y++) { 179 for (x = XMIN; x < XMAX; x++) { 180 printf("%c", (y == yi && x == xi ? PLAYER : floor[y][x])); 181 } 182 printf("\n"); 183 } 184} 185 186int main(void) { 187 do { 188 disp(); 189 } while (!key()); 190}

投稿2020/04/01 19:45

編集2020/04/02 17:38
jimbe

総合スコア12744

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

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

0

○を1,●を0にするとできました。

投稿2020/04/02 22:11

misamaru

総合スコア5

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

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

ttyp03

2020/04/03 01:47

ここに書かないで、私の回答にコメントをお願いします。 問題ないなら解決済みにしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問