#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終了
}
Dxライブラリで7並べを作りたいのです・・・
Dxライブラリで7並べを作りたいのです・・・
全くの初心者です。今回学校の課題でゲームを作成しなければ、いけないのですがいろいろなサイト等を見ていたのですが、DxLibで7並べを作成しているものが無く近々に提出期限が迫っていて切羽詰まっています。また、現状起動はできるのですが、その後うまく組めてないので、応答なしになってしまいます。根本的に直すようになるのは解っていますがどう直せば、動くようになるのでしょうか。ご教授お願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: Dxライブラリで7並べを作りたいのです・・・
デバッガで確認されると分かると思いますが、最初のシャフルで無限ループしています。
条件を再確認してみてください。
怪しそうな所 → } while ( check[cardm][count] == 1 );
【補足】
大事なScreenFilp()が抜けてますよ。
条件を再確認してみてください。
怪しそうな所 → } while ( check[cardm][count] == 1 );
【補足】
大事なScreenFilp()が抜けてますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: Dxライブラリで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 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並べを作りたいのです・・・
これもデバッガで追いかけてもらうと分かると思いますが、CardPush()のcard7[cardm]とか間違ってませんでしょうか?
こういう間違いを多くしてしまうのは大抵、自分でも変数名が分かりづらい時です。
この配列の名前は使う添字も明確に分かる変数名にして、添字に使う変数名もわかりやすくしましょう。
cardn
cardm
とかご自身でもややこしいのでは?
例:
card7[cardm] → playerPlace[player_no] とか。
こういう間違いを多くしてしまうのは大抵、自分でも変数名が分かりづらい時です。
この配列の名前は使う添字も明確に分かる変数名にして、添字に使う変数名もわかりやすくしましょう。
cardn
cardm
とかご自身でもややこしいのでは?
例:
card7[cardm] → playerPlace[player_no] とか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。