Dxライブラリで7並べを作りたいのです・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
B787
記事: 2
登録日時: 12年前

Dxライブラリで7並べを作りたいのです・・・

#1

投稿記事 by B787 » 12年前

全くの初心者です。今回学校の課題でゲームを作成しなければ、いけないのですがいろいろなサイト等を見ていたのですが、DxLibで7並べを作成しているものが無く近々に提出期限が迫っていて切羽詰まっています。また、現状起動はできるのですが、その後うまく組めてないので、応答なしになってしまいます。根本的に直すようになるのは解っていますがどう直せば、動くようになるのでしょうか。ご教授お願いします。

コード:

#include "DxLib.h"

struct {				// 場に置いてあるカード
	int top;			// 先頭
	int end;			// 末尾
} card7[4] = { 6, 6, 6, 6, 6, 6, 6, 6 };
struct {				// プレイヤーデータ
	int num;			// カード枚数
	bool pass;			// パスしたなら true
	int mark[12];		// 持っているカードのマーク
	int number[12];			// 持っているカードの数字
} player[4];

int card[1], mark[4], number[13];
int start_time;
int color = GetColor(255, 255, 255);
int x, y;
int count = 0;

void CardPrint(int x, int y, int cardn, int mark_cp){
	DrawGraph(x + 6, y + 5, mark[mark_cp], FALSE);
	DrawGraph(x + 6, y + 33, number[cardn], FALSE);
}

bool CardPut(int playern, int cardn){
	bool ret = true;
	int cardm = player[playern].mark[cardn];
	if (player[playern].number[cardn] == card7[cardm].top - 1)card7[cardm].top--;
	else if (player[playern].number[cardn] == card7[cardm].end + 1)card7[cardm].end++;
	else ret = false;
	if (ret){
		for (int i = count + 1; i < player[playern].num; i++){
			player[playern].number[i - 1] = player[playern].number[i];
			player[playern].mark[i - 1] = player[playern].mark[i];
		}
		player[playern].num--;
	}
	return ret;
}




int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){

	ChangeWindowMode(TRUE);//モード変更
	DxLib_Init(); //DX初期化
	SetDrawScreen(DX_SCREEN_BACK);
	//bmpの読み込み//
	LoadDivGraph("card.bmp", 1, 1, 1, 40, 64, card);
	LoadDivGraph("mark.bmp", 4, 4, 1, 28, 28, mark);
	LoadDivGraph("number.bmp", 13, 13, 1, 28, 28, number);
	//シャッフル//
	int cardm, cardn, playern;
	int check[4][13] = { 0 };
	for (cardm = 0; cardm < 4; cardm++) check[cardm][6] = 1;
	for (playern = 0; playern < 4; playern++){
		for (count = 0; count < 12; count++){
			do { cardm = rand() % 4; cardn = rand() % 13; } while (check[cardm][count] == 1);
			player[playern].mark[count] = cardm;
			player[playern].number[count] = cardn;
			check[cardm][cardn] = 1;
		}
		player[playern].num = 12;
		player[playern].pass = false;
	}

	start_time = GetNowCount();
	while (!ProcessMessage()){
		ClearDrawScreen();


		int i;
		int MouseX, MouseY;
		static int now_player = 0; //今のプレイヤー(0:player1~3:COM)
		static float wait = 0;
		int FrameTime, OldTime, NowTime=0;
		OldTime = NowTime;
		NowTime = GetNowCount();
		FrameTime = NowTime - OldTime;
		char* name[4] = { "あなた", "COM1", "COM2", "COM3" };
		if (now_player == 0){
			if (GetMouseInput()& MOUSE_INPUT_LEFT){
				GetMousePoint(&MouseX, &MouseY);
				int xs = (640 - player[0].num * 40) / 2;
				if (MouseX >= xs && MouseX < xs + player[0].num * 40 && MouseY >= 384 && MouseY < 384 + 64){
					cardn = (MouseX - xs) / 40;
					if (CardPut(0, count)) {
						player[0].pass = false;
						now_player++;
					}
				}
			}
			else if (GetMouseInput()& MOUSE_INPUT_RIGHT){
				player[0].pass = true;
				now_player++;
			}
		}
		else {					// コンピュータの順番のとき
			wait += FrameTime;
			if (wait > 0.3) {
				wait = 0;
				int ck[12] = { 0 };
				player[now_player].pass = true;
				for (int i = 0; i < player[now_player].num; i++) {
					do cardn = rand() % player[now_player].num; while (ck[cardn]);
					ck[cardn] = 1;
					if (CardPut(now_player, cardn)) {
						player[now_player].pass = false;
						break;
					}
				}
				if (++now_player >= 4) now_player = 0;
			}
		}
		for (cardm = 0; cardm < 4; cardm++) {
			for (cardn = 0; cardn < 13; cardn++) {
				if (cardn >= card7[cardm].top && cardn <= card7[cardm].end)
					CardPrint(60 + cardn * 40, 64 + cardm * 64, cardn, cardm);
			}
		}
		for (cardn = 0; cardn < player[0].num; cardn++) {
			CardPrint((640 - player[0].num * 40) / 2 + cardn * 40, 384, player[0].number[count], player[0].mark[count]);
		}
		for (i = 0; i < 4; i++) {
			int x = 8 + i * 100;
			DrawFormatString(x, 8, color, name[i]);
			DrawFormatString(x, 24, color, "残り%d枚", player[i].num);
			if (player[i].pass){
				DrawFormatString(x, 40, color, "Pass!");
			}
		}

		DrawFormatString(8, 480 - 20, color, "左クリック:カードを出す 右クリック:パス");
		ShowCursor(TRUE);


		for (i = 0; i < 4; i++) {
			if (player[i].num <= 0) {
				DrawFormatString(8, 8, color, "%s が優勝です!!", name[i]);
			}
		}



		

	}

	DxLib_End(); //DX終了
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Dxライブラリで7並べを作りたいのです・・・

#2

投稿記事 by softya(ソフト屋) » 12年前

デバッガで確認されると分かると思いますが、最初のシャフルで無限ループしています。
条件を再確認してみてください。

怪しそうな所 → } while ( check[cardm][count] == 1 );

【補足】
大事なScreenFilp()が抜けてますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

B787
記事: 2
登録日時: 12年前

Re: Dxライブラリで7並べを作りたいのです・・・

#3

投稿記事 by B787 » 12年前

ご教授くださりありがとうございます。確かに確認したところ配列における、チェックしたい要素が数字とマークなのに対して、なぜかカードの枚数の変数を入れてました。
これで、表示はできるようになったのですが、あと一点だけ動かないところがありまして、右クリックでは、ちゃんと指定したことをしてくれるのですが、左クリックでカードを選択しようとすると、どれも選択できなくてゲームが先に進まない状況です。どこがおかしいのでしょうか?宜しくお願い致します。

コード:

#include "DxLib.h"

struct {				// 場に置いてあるカード
	int top;			// 先頭
	int end;			// 末尾
} card7[4] = { 6, 6, 6, 6, 6, 6, 6, 6 };
struct {				// プレイヤーデータ
	int num;			// カード枚数
	bool pass;			// パスしたなら true
	int mark[12];		// 持っているカードのマーク
	int number[12];			// 持っているカードの数字
} player[4];

int card[1], mark[4], number[13];
int start_time;
int color = GetColor(255, 255, 255);
int x, y;
int count = 0;


void CardPrint(int x, int y, int cardn, int mark_cp){
	DrawGraph(x + 6, y + 5, mark[mark_cp], FALSE);
	DrawGraph(x + 6, y + 33, number[cardn], FALSE);
}

bool CardPush(int playern, int cardn){
	bool ret = true;
	int cardm = player[playern].mark[cardn];
	if (player[playern].number[cardn] == card7[cardm].top - 1)card7[cardm].top--;
	else if (player[playern].number[cardn] == card7[cardm].end + 1)card7[cardm].end++;
	else ret = false;
	if (ret){
		for (int i = cardn + 1; i < player[playern].num; i++){
			player[playern].number[i - 1] = player[playern].number[i];
			player[playern].mark[i - 1] = player[playern].mark[i];
		}
		player[playern].num--;
	}
	return ret;
}




int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){

	ChangeWindowMode(TRUE);//モード変更
	DxLib_Init(); //DX初期化
	SetDrawScreen(DX_SCREEN_BACK);
	//bmpの読み込み//
	LoadDivGraph("card.bmp", 1, 1, 1, 40, 64, card);
	LoadDivGraph("mark.bmp", 4, 4, 1, 28, 28, mark);
	LoadDivGraph("number.bmp", 13, 13, 1, 28, 28, number);
	//シャッフル//
	int cardm, cardn, playern;
	int check[4][13] = { 0 };
	for (cardm = 0; cardm < 4; cardm++) check[cardm][6] = 1;
	for (playern = 0; playern < 4; playern++){
		for (count = 0; count < 12; count++){
			do { cardm = rand() % 4; cardn = rand() % 13; } while (check[cardm][cardn] == 1);
			player[playern].mark[count] = cardm;
			player[playern].number[count] = cardn;
			check[cardm][cardn] = 1;
		}
		player[playern].num = 12;
		player[playern].pass = false;
	}

	start_time = GetNowCount();
	while (!ProcessMessage()){
		ClearDrawScreen();


		int i;
		int MouseX, MouseY;
		static int now_player = 0; //今のプレイヤー(0:player1~3:COM)
		static float wait = 0;
		int FrameTime, OldTime, NowTime=0;
		OldTime = NowTime;
		NowTime = GetNowCount();
		SetMouseDispFlag(TRUE);
		FrameTime = NowTime - OldTime;
		GetMousePoint(&MouseX, &MouseY);
		char* name[4] = { "あなた", "COM1", "COM2", "COM3" };
		if (now_player == 0){
			if (GetMouseInput()& MOUSE_INPUT_LEFT){
				int xs = (640 - player[0].num * 40) / 2;
				if (MouseX >= xs && MouseX < xs + player[0].num * 40 && MouseY >= 384 && MouseY < 384 + 64){
					cardn = (MouseX - xs) / 40;
					if (CardPush(0, count)) {
						player[0].pass = false;
						now_player++;
					}
				}
			}
			else if (GetMouseInput()& MOUSE_INPUT_RIGHT){
				player[0].pass = true;
				now_player++;
			}
		}
		else {					// コンピュータの順番のとき
			wait += FrameTime;
			if (wait > 0.3) {
				wait = 0;
				int ck[12] = { 0 };
				player[now_player].pass = true;
				for (int i = 0; i < player[now_player].num; i++) {
					do cardn = rand() % player[now_player].num; while (ck[cardn]);
					ck[cardn] = 1;
					if (CardPush(now_player, cardn)) {
						player[now_player].pass = false;
						break;
					}
				}
				if (++now_player >= 4) now_player = 0;
			}
		}
		for (cardm = 0; cardm < 4; cardm++) {
			for (cardn = 0; cardn < 13; cardn++) {
				if (cardn >= card7[cardm].top && cardn <= card7[cardm].end)
					CardPrint(60 + cardn * 40, 64 + cardm * 64, cardn, cardm);
			}
		}
		for (count = 0; count < player[0].num; count++) {
			CardPrint((640 - player[0].num * 40) / 2 + count * 40, 384, player[0].number[count], player[0].mark[count]);
		}
		for (i = 0; i < 4; i++) {
			int x = 8 + i * 100;
			DrawFormatString(x, 8, color, name[i]);
			DrawFormatString(x, 24, color, "残り%d枚", player[i].num);
			if (player[i].pass){
				DrawFormatString(x, 40, color, "Pass!");
			}
		}

		DrawFormatString(8, 480 - 20, color, "左クリック:カードを出す 右クリック:パス");
		ShowCursor(TRUE);


		for (i = 0; i < 4; i++) {
			if (player[i].num <= 0) {
				DrawFormatString(8, 8, color, "%s が優勝です!!", name[i]);
			}
		}



		
		ScreenFlip();
	}// while

	DxLib_End(); //DX終了
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Dxライブラリで7並べを作りたいのです・・・

#4

投稿記事 by softya(ソフト屋) » 12年前

これもデバッガで追いかけてもらうと分かると思いますが、CardPush()のcard7[cardm]とか間違ってませんでしょうか?
こういう間違いを多くしてしまうのは大抵、自分でも変数名が分かりづらい時です。
この配列の名前は使う添字も明確に分かる変数名にして、添字に使う変数名もわかりやすくしましょう。
cardn
cardm
とかご自身でもややこしいのでは?

例:
card7[cardm] → playerPlace[player_no] とか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る