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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1387閲覧

Dxlib 落ち物パズルゲームのプログラミングでアルゴリズムの作成に困っています。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/05/23 15:46

長文のソースコードになるのですが全部がロジックのように組んでいますので全部載せました。
ほかのヘッダーファイルはキー入力の関数をのせました。
コードコメント部の「/操作と枠からはみ出ないよう/」の部分にブロックを右に移動したときに右の枠からはみ出ないように処理を書きたいです。
また"ブロックが積みあがる"処理も書けるような柔軟なソースを書きたいのですがどうすればいいのでしょうか?
※のblock_spaceの二次元は配列は右枠からはみ出ないように各ブロックの各回転時の横の長さの情報が入っています。

Player.cpp

1#include "DxLib.h" 2#include <iostream> 3#include <time.h> 4#include <stdio.h> 5#include "Player.h" 6#include "Input_Key.h" 7using namespace std; 8 9static const int Color = GetColor(255, 255, 255);//文字カラー白 10 11 12 13static int stage[21][12] 14{ 15 //0,1,2,3,4,5,6,7,8,9,10,11, 16 //{1,0,0,0,0,0,0,0,0,0,0,1}, 17 18 {1,0,0,0,0,0,0,0,0,0,0,1}, 19 {1,0,0,0,0,0,0,0,0,0,0,1}, 20 {1,0,0,0,0,0,0,0,0,0,0,1}, 21 {1,0,0,0,0,0,0,0,0,0,0,1}, 22 {1,0,0,0,0,0,0,0,0,0,0,1}, 23 {1,0,0,0,0,0,0,0,0,0,0,1}, 24 {1,0,0,0,0,0,0,0,0,0,0,1}, 25 {1,0,0,0,0,0,0,0,0,0,0,1}, 26 {1,0,0,0,0,0,0,0,0,0,0,1}, 27 {1,0,0,0,0,0,0,0,0,0,0,1}, 28 {1,0,0,0,0,0,0,0,0,0,0,1}, 29 {1,0,0,0,0,0,0,0,0,0,0,1}, 30 {1,0,0,0,0,0,0,0,0,0,0,1}, 31 {1,0,0,0,0,0,0,0,0,0,0,1}, 32 {1,0,0,0,0,0,0,0,0,0,0,1}, 33 {1,0,0,0,0,0,0,0,0,0,0,1}, 34 {1,0,0,0,0,0,0,0,0,0,0,1}, 35 {1,0,0,0,0,0,0,0,0,0,0,1}, 36 {1,0,0,0,0,0,0,0,0,0,0,1}, 37 {1,0,0,0,0,0,0,0,0,0,0,1}, 38 {1,1,1,1,1,1,1,1,1,1,1,1}, 39 //{1,0,0,0,0,0,0,0,0,0,0,1}, 40 41 42}; 43 44 45/*ブロック 種類、回転 x、y*/ 46static const int gblock[8][4][4][4] 47{ 48 ///////////////////0 49 { 50 { 51 {1,1,1,1}, 52 {0,0,0,0}, 53 {0,0,0,0}, 54 {0,0,0,0}, 55 }, 56 57 { 58 {0,0,1,0}, 59 {0,0,1,0}, 60 {0,0,1,0}, 61 {0,0,1,0}, 62 }, 63 64 { 65 66 {1,1,1,1}, 67 {0,0,0,0}, 68 {0,0,0,0}, 69 {0,0,0,0}, 70 }, 71 72 { 73 {0,0,1,0}, 74 {0,0,1,0}, 75 {0,0,1,0}, 76 {0,0,1,0}, 77 }, 78 }, 79//////////////////////////1 80 { 81 { 82 {1,1,0,0}, 83 {1,1,0,0}, 84 {0,0,0,0}, 85 {0,0,0,0}, 86 }, 87 88 { 89 {1,1,0,0}, 90 {1,1,0,0}, 91 {0,0,0,0}, 92 {0,0,0,0}, 93 }, 94 95 { 96 97 {1,1,0,0}, 98 {1,1,0,0}, 99 {1,1,0,0}, 100 {0,0,0,0}, 101 }, 102 103 { 104 {1,1,0,0}, 105 {1,1,0,0}, 106 {0,0,0,0}, 107 {0,0,0,0}, 108 }, 109 }, 110/////////////////////////2 111 { 112 { 113 {0,1,1,0}, 114 {1,1,0,0}, 115 {0,0,0,0}, 116 {0,0,0,0}, 117 }, 118 119 { 120 {1,0,0,0}, 121 {1,1,0,0}, 122 {0,1,0,0}, 123 {0,0,0,0}, 124 }, 125 126 { 127 128 {0,1,1,0}, 129 {1,1,0,0}, 130 {0,0,0,0}, 131 {0,0,0,0}, 132 }, 133 134 { 135 {1,0,0,0}, 136 {1,1,0,0}, 137 {0,1,0,0}, 138 {0,0,0,0}, 139 }, 140 }, 141 /////////////////////////3 142 { 143 { 144 {1,1,0,0}, 145 {0,1,1,0}, 146 {0,0,0,0}, 147 {0,0,0,0}, 148 }, 149 150 { 151 {0,1,0,0}, 152 {1,1,0,0}, 153 {1,0,0,0}, 154 {0,0,0,0}, 155 }, 156 157 { 158 159 {1,1,0,0}, 160 {0,1,1,0}, 161 {0,0,0,0}, 162 {0,0,0,0}, 163 }, 164 165 { 166 {0,1,0,0}, 167 {1,1,0,0}, 168 {1,0,0,0}, 169 {0,0,0,0}, 170 }, 171 }, 172 /////////////////////////4 173 { 174 { 175 {1,0,0,0}, 176 {1,1,1,0}, 177 {0,0,0,0}, 178 {0,0,0,0}, 179 }, 180 181 { 182 {1,1,0,0}, 183 {1,0,0,0}, 184 {1,0,0,0}, 185 {0,0,0,0}, 186 }, 187 188 { 189 190 {1,1,1,0}, 191 {0,0,1,0}, 192 {0,0,0,0}, 193 {0,0,0,0}, 194 }, 195 196 { 197 {0,1,0,0}, 198 {0,1,0,0}, 199 {1,1,0,0}, 200 {0,0,0,0}, 201 }, 202 }, 203 /////////////////////////5 204 { 205 { 206 {0,0,1,0}, 207 {1,1,1,0}, 208 {0,0,0,0}, 209 {0,0,0,0}, 210 }, 211 212 { 213 {1,0,0,0}, 214 {1,0,0,0}, 215 {1,1,0,0}, 216 {0,0,0,0}, 217 218 }, 219 220 221 { 222 {1,1,1,0}, 223 {1,0,0,0}, 224 {0,0,0,0}, 225 {0,0,0,0}, 226 227 }, 228 229 230 { 231 {1,1,0,0}, 232 {0,1,0,0}, 233 {0,1,0,0}, 234 {0,0,0,0}, 235 236 }, 237 }, 238 /////////////////////////6 239 { 240 { 241 {0,1,0,0}, 242 {1,1,1,0}, 243 {0,0,0,0}, 244 {0,0,0,0}, 245 }, 246 247 { 248 {1,0,0,0}, 249 {1,1,0,0}, 250 {1,0,0,0}, 251 {0,0,0,0}, 252 253 }, 254 255 256 { 257 {1,1,1,0}, 258 {0,1,0,0}, 259 {0,0,0,0}, 260 {0,0,0,0}, 261 262 }, 263 264 265 { 266 {0,1,0,0}, 267 {1,1,0,0}, 268 {0,1,0,0}, 269 {0,0,0,0}, 270 271 }, 272 273 }, 274 275}; 276/*ブロック種類,回転番号*/ 277static int block_space[7][4] = 278{ 279 { 280 {4}, 281 {1}, 282 {4}, 283 {1}, 284 }, 285 286 { 287 {1}, 288 {1}, 289 {1}, 290 {1}, 291 }, 292 293 { 294 {2}, 295 {2}, 296 {2}, 297 {1}, 298 }, 299 300 { 301 {}, 302 {}, 303 {}, 304 {}, 305 }, 306 307 { 308 {}, 309 {}, 310 {}, 311 {}, 312 }, 313 314 { 315 {}, 316 {}, 317 {}, 318 {}, 319 }, 320 321 { 322 {}, 323 {}, 324 {}, 325 {}, 326 }, 327}; 328 329typedef struct block_pos 330{ 331 int x; 332 int y; 333}bp; 334 335 336 337typedef enum key_state 338{ 339 Left, 340 Right, 341 Down, 342 Rotation, 343 Invalid, 344}ks; 345 346static int game[9][19] = { 0 }; //ブロック記録 347static int blcok_pos[10][20] = {0}; 348static int now_pos[10][20] = { 0 }; 349 350static ks key = Invalid; //キー入力管理 351static bp bpos; //ブロック座標 352static int block_r = 0; //回転 353static int number = 0; //乱数で引いたブロック番号 354static int bcolor = 1; //ブロックの色 355static uint block_rand; //乱数記録 356static bool isdown = false; //落下して止まったかどうか 357static uint cidx[7] = { 5,3,4,1,6,2,7 }; //カラーインデックス 358static int space = 0; //右側のマス目の最大値 359 360 361/*乱数算出*/ 362void randb() 363{ 364 block_rand = rand() % 7; 365 366} 367 368/*初期化*/ 369void Player::Initialize() 370{ 371 frame_hendle = LoadGraph("Asset/Frame_Block_24px.png"); 372 LoadDivGraph("Asset/Block_tmp_24px.png", 8, 4, 2, 24, 24, block_tmp); 373 374 srand((unsigned int) time(NULL)); 375 //randb(); 376 block_rand = 0; 377 bpos.x = 4; 378 bpos.y = 0; 379 380} 381 382 383 384// ------------------------------------------------------------------------------- 385// 計算 386// ------------------------------------------------------------------------------- 387 388void Put_Block() 389{ 390 391} 392/*ブロックを生成*/ 393void Player::Create_block() 394{ 395 //落下中のブロックが落ちてないときはfalse 落ちたらtrue 396 if (isdown == true) 397 { 398 randb(); 399 400 401 bpos.x = 4; 402 bpos.y = 0; 403 404 isdown = true; 405 } 406} 407 408/*ブロック落下処理*/ 409void Player::Block_Down() 410{ 411 if (fCount % 20 == 0) 412 { 413 // bpos.y += 1; 414 } 415} 416 417/*操作と枠からはみ出ないよう*/ 418void Player::Move() 419{ 420 int x = bpos.x; 421 int t = 10 - block_space[block_rand][block_r]; 422 //DrawFormatString(100,200,Color,"t: %d",t); 423 424 425 /*左移動*/ 426 if (stage[0][0] != 0) 427 { 428 429 } 430 int b = 0; 431 if (key == Left) 432 { 433 434 if( stage[bpos.y][bpos.x - 1] != 1) 435 { 436 bpos.x -= 1; 437 } 438 key = Invalid; 439 } 440 441 442 /*右移動*/ 443 if (key == Right) 444 { 445 446 if (stage[bpos.y][bpos.x + 1] != 1) 447 { 448 bpos.x += 1; 449 } 450 451 key = Invalid; 452 } 453 454 455} 456 457/*キー入力受付処理*/ 458void Player::Control() 459{ 460 461 462 if(keybord(KEY_INPUT_LEFT) == 1) 463 { 464 key = Left; 465 466 } 467 468 469 if (keybord(KEY_INPUT_RIGHT) == 1 ) 470 { 471 472 key = Right; 473 474 } 475 476 if (keybord(KEY_INPUT_X) == 1) 477 { 478 key = Rotation; 479 } 480 481 if (keybord(KEY_INPUT_RIGHT) == 0 && keybord(KEY_INPUT_LEFT) == 0 && keybord(KEY_INPUT_X) == 0) 482 { 483 key = Invalid; 484 485 } 486 487 488} 489 490/*回転処理*/ 491int rt = 0; 492void Player::Rotate() 493{ 494 495 /*回転*/ 496 if (key == Rotation) 497 { 498 499 block_r++; 500 if (block_r > 3) 501 { 502 block_r = 0; 503 } 504 505 key = Invalid; 506 } 507 508 509 510} 511 512 513 514 515//*********************************************** 516void Player::Update() 517{ 518 DrawFormatString(150,100,GetColor(255,255,255),"%d",fCount); 519 DrawFormatString(100, 250, GetColor(255, 255, 255), "bpos.x %d", bpos.x); 520 521 522 Block_Down(); 523 Rotate(); 524 Move(); 525 Control(); 526 527} 528//*********************************************** 529 530 531 532 533 534 535// ------------------------------------------------------------------------------- 536// 描画 537// ------------------------------------------------------------------------------- 538 539/*ブロックは一部しか実装しません。*/ 540/*ブロック描画*/ 541void Player::Draw_Block() 542{ 543 int x = bpos.x; 544 int y = bpos.y; 545 546 int xx = bpos.x * block; 547 //y += 1; 548 549 550 for (int dy = 0; dy < 4; dy++) 551 { 552 for (int dx = 0; dx < 4; dx++) 553 { 554 //if (gblock[block_rand][0][dy][dx] != 0) 555 if (gblock[block_rand][block_r][dy][dx] != 0) 556 { 557 558 DrawGraph(dx * block + xx, (dy * block) + (y * block), block_tmp[cidx[block_rand]], true); 559 } 560 } 561 } 562 563 564} 565 566//*********************************************** 567void Player::DrawUpdate() 568{ 569 frame(); 570 Draw_Block(); 571 572} 573//*********************************************** 574 575 576/*枠組み*/ 577void Player::frame() 578{ 579 /*枠の表示*/ 580 for (uint y = 0; y < 21; y++) 581 { 582 for (uint x = 0; x < 12; x++) 583 { 584 if (stage[y][x] != 0) 585 { 586 DrawGraph(x * block, y * block, frame_hendle, true); 587 } 588 } 589 } 590} 591 592 593 594 595/*終了*/ 596void Player::EndProcess() 597{ 598 599} 600 601

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

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

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

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

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

guest

回答1

0

ベストアンサー

何も書いてありませんがソースからテ○リス的な物と認識しました。

右への移動も、詰みあがり云々も
配列stage内の移動しようとしている先が、0かどうか(1でないか)で判断できると思います。

1が一つでもあれば、
移動の場合は移動できない。
設置の場合は現在の状態をstageに書き込みます。
ついでに回転の可否も同様に判断できます。

block_spaceが横の長さとの事ですが使いますかね?壁の判断だけならよさそうですが。
ブロックが詰みあがった状態の判定には使えない気がします。
もちろん私が思っただけなので用途があるのなら問題ないですが。

投稿2019/05/24 00:37

torisan

総合スコア678

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問