チェスプログラミング、コマの選択の判定について

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

チェスプログラミング、コマの選択の判定について

#1

投稿記事 by tonari » 9ヶ月前

こんにちは、今私はチェスのコマの判定で、以下のような処理を行いたいのですがうまくいきません。
1,コマの選択
2,選択したコマを置ける場所に置く(細かい条件は未実装)
3,ターンの切り替え
この処理の中で、コマの選択をする場合の条件を

コード:

//入力が正しく行われたか
bool Check_Input()
{
	for (int y = 0; y < BOARDSIZE; ++y)
	{
		for (int x = 0; x < BOARDSIZE; ++x)
		{
			//何もない場所を指定したとき
			if (board[y][x].piece == nullptr)
			{
				return false;
			}
			//相手のコマを指定したとき
			if (board[y][x].piece != nullptr && currentPlayer != board[y][x].piece->player)
			{
				return false;
			}	
		}
	}
	return true;	//問題がなければtrue(コマの選択が正しく行われた)
}
 
このようにして、入力を行う関数内の条件分に書いているのですが、そもそも選択状態になりません。(ただ選択状態とその解除ならできます)
そして2回目の入力が成功したときにターンを入れ替えたいのですがこれもうまくいきません。
わかりにくい説明の仕方になってしまうので、プロジェクトのリンクを張っておくので、ソースコードに書かれているコメントを参照していただけると助かります。
この設計の方法はやめたほうがいい、という場合はぜひ指摘をお願いします
また、チェスプログラミングについての解説がある日本語のサイトはありますか?
以下がプロジェクトのリンクです

アバター
みけCAT
記事: 6013
登録日時: 7年前
住所: 千葉県
連絡を取る:

Re: チェスプログラミング、コマの選択の判定について

#2

投稿記事 by みけCAT » 9ヶ月前

まだプロジェクトは見ていませんが、このCheck_Input関数はおそらく
「ボード全体を走査して、何もない場所か相手のコマが1個でもあればfalse、そうでなければtrueを返す」関数ですよね。
どのようにして「選択」をしていますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

tonari
記事: 28
登録日時: 11ヶ月前

Re: チェスプログラミング、コマの選択の判定について

#3

投稿記事 by tonari » 9ヶ月前

返信ありがとうございます
入力部分はこのようになっています

コード:

//入力
int Input(int &currentPlayer)
{
	for (int y = 0; y < BOARDSIZE; ++y)
	{
		for (int x = 0; x < BOARDSIZE; ++x)
		{
			if (Key(KEY_INPUT_Z) == 1 && cursor.select == false && currentPlayer == BLACK && CELLSIZE * x == cursor.x && CELLSIZE * y == cursor.y)
			{
				if (Check_Input() == true)
				{
					//cursorがtrueなら、自分のコマが選択できている状態とする。
					cursor.select = true;
				}
			}
			if (Key(KEY_INPUT_Z) == 1 && cursor.select == true && CELLSIZE * x == cursor.x && CELLSIZE * y == cursor.y)
			{
				//すべての処理が終わったら、ターンを変える
				//コマを置いた後に呼び出す
				if (currentPlayer == BLACK && Check_Move() == true)
				{
					cursor.select = false;
					currentPlayer = WHITE;
				}
			}
		}
	}
	return currentPlayer;
}


アバター
usao
記事: 1382
登録日時: 5年前

Re: チェスプログラミング、コマの選択の判定について

#4

投稿記事 by usao » 9ヶ月前

オフトピック
既に指摘されている事柄に関してですが…

Check_Input()内だけでなく,それを呼び出すInput()でも盤面上の全走査が記述されているようですが,
どのような理由で,盤面全体を走査することにしたのでしょう?


//何もない場所を指定したとき
という注釈がありますが,「指定された場所」がどこなのかを表すデータとは,このコードでは具体的には何になるのですか?

tonari
記事: 28
登録日時: 11ヶ月前

Re: チェスプログラミング、コマの選択の判定について

#5

投稿記事 by tonari » 9ヶ月前

返信ありがとうございます、まずInput()の全面捜査ですが、これには全く意味がないので治します、(消しても問題なく動きました)、次に何もない場所を指定することですが、これはボードの中にコマがない場合は、nullptrを指定しています

Math

Re: チェスプログラミング、コマの選択の判定について

#6

投稿記事 by Math » 9ヶ月前

コードをみると
Game.h

コード:

#pragma once
#include "./プロジェクトに追加すべきファイル_VC用/DxLib.h"
#include "Input.h"
#include "Piece.h"
#include "Square.h"

//ゲーム情報の初期化
void Init_Gamedata();
//画像のロード
void Load_Graph();
//カーソルの更新
void Updata_cursor();
//ゲームの更新処理
void Updata_Game();
//入力
int Input(int &currentPlayer);
//相手の入力
int Input2(int &currentPlayer);
//移動の判定
bool Check_Input();
//コマの動き
bool Check_Move();
//描画
void Draw_Game();
//1フレーム処理を行う
int Main_Program(int &currentPlayer);
Input.h

コード:

#pragma once
#include "DxLib.h"

//キーの入力状態を更新
void Updata_Key();

//引数のキーコードのキーの入力状態を返す
int Key(int keycode);
となっていて
#include "./プロジェクトに追加すべきファイル_VC用/DxLib.h"
とすべきところを
#include "DxLib.h"
としてるため うまくビルドされず 前のビルドで動いてるようですね。

アバター
usao
記事: 1382
登録日時: 5年前

Re: チェスプログラミング、コマの選択の判定について

#7

投稿記事 by usao » 9ヶ月前

プレイヤーは,何らかの操作(マウスなのかキーボードなのか知らんけど)によって
盤上の8x8個のマス群のうちのいずれか1つのマスを指し示して,
「このマスに存在する駒を選択したいんだよなぁ」ということを表現する

 ↓

プログラム側としては,その操作結果に対して,
プレイヤーの指定が妥当であるか否かを確認し,妥当でないならば棄却する必要がある.
具体的には
・指定されたマスには駒が存在しない
・指定されたマスには駒が存在するが,それは相手側の駒である
のいずれの場合でもないことを確認する必要がある.


…的な話だと思うのだけども,そういう話なのであれば,

・【 「指定されたマス」の駒の有無や所有者をチェックする処理 】が必要であろうと思うのだが,
 「指定されたマスってのは,一体どのマスですか?」を表すデータ(変数)というのはこのコードでは何になるのか?

・「指定されたマス」ではない63個のマス群については特に何もチェックする必要は無いと思うのだが,
 Check_Input()では全マスのチェックを行い何らかの判定を行っている.その意図とは何なのか?
オフトピック
なんだろう? 問いの答えを述べずには問えない みたいな謎の状態.なんだかなぁ.

tonari
記事: 28
登録日時: 11ヶ月前

Re: チェスプログラミング、コマの選択の判定について

#8

投稿記事 by tonari » 9ヶ月前

すみません、返信が遅れました。
指定したマスというのは、カーソルを合わせていてかつZキーを押したときです。
その指定した状態を表す変数はbool型のcursor.selectで判断するようにしているつもりです。
Check_Input()がtrueなら置けるということなので、cursor.select = true。(cursor.select == trueなら自分のコマの選択が正しく行われている状態)
「駒の有無や所有者をチェックする処理」は、

コード:

       //何もない場所を指定したとき
			if (board[y][x].piece == nullptr)
			{
				return false;
			}
			//相手のコマを指定したとき
			if (board[y][x].piece != nullptr && currentPlayer != board[y][x].piece->player)
			{
				return false;
			}
でチェックしているつもりです。
マスそのもののデータを格納することまで考えていませんでした......
自分でも何をしたいのかわからなくなってしまったので、
一度このプログラムを中断してもう一度チャートから作り直したいと思います。

返信

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