###前提・実現したいこと
こんな初心者で勉強不足な自分がこのような素晴らしいサイトで質問するのは恐縮ですが、DxLibでパズルゲームを作ることに関して質問です。4枚の画像から背景画像を一枚選んでシャッフルし、パズルを組み立てるというものですが、うまくいきません。直しかけのぐちゃぐちゃなソースですが、どうか細かく直していただきたいです。それとBGMをちゃんと流せるようにしたいです。
###発生している問題・エラーメッセージ
エラーメッセージは特にありません。しかしスタート画面から何を押しても進みません。
###該当のソースコード
include"DxLib.h"
// グローバル変数
int pics[3][16];
int pic_all[3];
int start;
int panel[16];
enum { TITLE, CHOSE, MAIN, CLEAR } status = TITLE;
//選択したパネルと空白を入れ替える
void change(int x, int y) {
int p1 = y * 4 + x;
int p2 = -1;
if (x > 0 && panel[p1 - 1] == 15) p2 = p1 - 1;
if (x < 3 && panel[p1 + 1] == 15) p2 = p1 + 1;
if (y > 0 && panel[p1 - 4] == 15) p2 = p1 - 4;
if (y < 3 && panel[p1 + 4] == 15) p2 = p1 + 4;
if (p2 != -1) {
panel[p2] = panel[p1];
panel[p1] = 15;
}
}
// タイトル画面
void gameTitle() {
DrawGraph(0, 0, start, FALSE);
DrawString(102, 60, "パズル", GetColor(255, 0, 0));
DrawString(102, 80, "背景1", GetColor(255, 0, 0));
DrawString(102, 100, "背景2", GetColor(255, 0, 0));
DrawString(102, 120, "背景3", GetColor(255, 0, 0));
DrawString(102, 140, "背景4", GetColor(255, 0, 0));
}
//背景選択
void chose() {
if (CheckHitKey(KEY_INPUT_NUMPAD1)) {
for (int i = 0; i < 16; i++) panel[i] = i;
for (int i = 0; i < 1000; i++) {
change(GetRand(3), GetRand(3));
}
status = MAIN;
DrawGraph(0, 0, pic_all[0], FALSE);
}
if (CheckHitKey(KEY_INPUT_NUMPAD2)) {
pics[1][16] = pics[2][16];
for (int i = 0; i < 16; i++) panel[i] = i;
for (int i = 0; i < 1000; i++) {
change(GetRand(3), GetRand(3));
}
status = MAIN;
DrawGraph(0, 0, pic_all[1], FALSE);
}
if (CheckHitKey(KEY_INPUT_NUMPAD3)) {
pics[1][16] = pics[3][16];
for (int i = 0; i < 16; i++) panel[i] = i;
for (int i = 0; i < 1000; i++) {
change(GetRand(3), GetRand(3));
}
status = MAIN;
DrawGraph(0, 0, pic_all[2], FALSE);
}
if (CheckHitKey(KEY_INPUT_NUMPAD4)) {
pics[1][16] = pics[4][16];
for (int i = 0; i < 16; i++) panel[i] = i;
for (int i = 0; i < 1000; i++) {
change(GetRand(3), GetRand(3));
}
status = MAIN;
DrawGraph(0, 0, pic_all[3], FALSE);
}
}
// メイン画面
void gameMain() {
if (GetMouseInput() & MOUSE_INPUT_LEFT) {
int x, y;
GetMousePoint(&x, &y);
change(x / 80, y / 80);
// パネルが全部揃ったか判定
bool clear = true;
for (int i = 0; i < 16; i++) {
if (panel[i] != i) clear = false;
}
if (clear) status = CLEAR;
}
// パネルの描画
for (int i = 0; i < 16; i++) {
if (panel[i] < 15) {
DrawGraph((i % 4) * 80, (i / 4) * 80, pics[i][panel[i]], FALSE);
}
}
}
// 終了画面
void gameClear() {
//DrawGraph(0, 0, gakki, FALSE);
DrawString(115, 142, "完成!!!", GetColor(255, 255, 0));
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
SetGraphMode(320, 320, 32);
ChangeWindowMode(TRUE);//ウインドウモードに変更
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
int wait_time = 100;
int BGMHandle = LoadSoundMem("be00402.wav");//BGMの識別番号
LoadDivGraph("pic1.png", 16, 4, 4, 80, 80, pics[0]);
LoadDivGraph("pic2.png", 16, 4, 4, 80, 80, pics[1]);
LoadDivGraph("pic3.png", 16, 4, 4, 80, 80, pics[2]);
LoadDivGraph("pic4.png", 16, 4, 4, 80, 80, pics[3]);
pic_all[0] = LoadGraph("pic1.png");
pic_all[1] = LoadGraph("pic2.png");
pic_all[2] = LoadGraph("pic3.png");
pic_all[3] = LoadGraph("pic4.png");
start = LoadGraph("start.png");
while (!ProcessMessage()) {
ClearDrawScreen();
PlaySoundMem(BGMHandle, DX_PLAYTYPE_LOOP);//BGMを流す
switch (status) {
case TITLE: gameTitle(); break;
case CHOSE:chose(); break;
case MAIN: gameMain(); break;
case CLEAR: gameClear(); break;
}
ScreenFlip();
StopSoundMem(BGMHandle);//BGMを止める
}
DxLib_End();
return 0;
}
###試したこと
すみません。何をどうすればいいのかわかりません。
###補足情報(言語/FW/ツール等のバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。