合計 昨日 今日

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

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: tonari
[URL]
初心者(7,123 ポイント)
Date: 2017年9月10日(日) 19:36
No: 1
(OFFLINE)

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

こんにちは、今私はチェスのコマの判定で、以下のような処理を行いたいのですがうまくいきません。
1,コマの選択
2,選択したコマを置ける場所に置く(細かい条件は未実装)
3,ターンの切り替え
この処理の中で、コマの選択をする場合の条件を
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//入力が正しく行われたか
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回目の入力が成功したときにターンを入れ替えたいのですがこれもうまくいきません。
わかりにくい説明の仕方になってしまうので、プロジェクトのリンクを張っておくので、ソースコードに書かれているコメントを参照していただけると助かります。
この設計の方法はやめたほうがいい、という場合はぜひ指摘をお願いします
また、チェスプログラミングについての解説がある日本語のサイトはありますか?
以下がプロジェクトのリンクです
https://drive.google.com/open?id=0B-rIh ... EY3RWoxMm8
プログラミングが全然上達しない・・・

Name: みけCAT
[URL]
伝説なるハッカー(680,549 ポイント)
Date: 2017年9月10日(日) 20:03
No: 2
(ONLINE)

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

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

Name: tonari
[URL]
初心者(7,123 ポイント)
Date: 2017年9月10日(日) 20:10
No: 3
(OFFLINE)

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

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//入力
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;
}
プログラミングが全然上達しない・・・

Name: usao
[URL]
ハッカー(139,041 ポイント)
Date: 2017年9月11日(月) 10:06
No: 4
(OFFLINE)

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

Offtopic :
既に指摘されている事柄に関してですが…

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


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

Name: tonari
[URL]
初心者(7,123 ポイント)
Date: 2017年9月11日(月) 12:03
No: 5
(OFFLINE)

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

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

Name: Math
[URL]
Date: 2017年9月11日(月) 12:58
No: 6
(OFFLINE)

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

コードをみると
Game.h
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
#pragma once
#include "DxLib.h"
 
//キーの入力状態を更新
void Updata_Key();
 
//引数のキーコードのキーの入力状態を返す
int Key(int keycode);

となっていて
#include "./プロジェクトに追加すべきファイル_VC用/DxLib.h"
とすべきところを
#include "DxLib.h"
としてるため うまくビルドされず 前のビルドで動いてるようですね。

Name: usao
[URL]
ハッカー(139,041 ポイント)
Date: 2017年9月11日(月) 13:19
No: 7
(OFFLINE)

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

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

 ↓

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


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

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

・「指定されたマス」ではない63個のマス群については特に何もチェックする必要は無いと思うのだが,
 Check_Input()では全マスのチェックを行い何らかの判定を行っている.その意図とは何なのか?

Offtopic :
なんだろう? 問いの答えを述べずには問えない みたいな謎の状態.なんだかなぁ.

Name: tonari
[URL]
初心者(7,123 ポイント)
Date: 2017年9月14日(木) 13:16
No: 8
(OFFLINE)

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

すみません、返信が遅れました。
指定したマスというのは、カーソルを合わせていてかつZキーを押したときです。
その指定した状態を表す変数はbool型のcursor.selectで判断するようにしているつもりです。
Check_Input()がtrueなら置けるということなので、cursor.select = true。(cursor.select == trueなら自分のコマの選択が正しく行われている状態)
「駒の有無や所有者をチェックする処理」は、
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
       //何もない場所を指定したとき
            if (board[y][x].piece == nullptr)
            {
                return false;
            }
            //相手のコマを指定したとき
            if (board[y][x].piece != nullptr && currentPlayer != board[y][x].piece->player)
            {
                return false;
            }

でチェックしているつもりです。
マスそのもののデータを格納することまで考えていませんでした......
自分でも何をしたいのかわからなくなってしまったので、
一度このプログラムを中断してもう一度チャートから作り直したいと思います。
プログラミングが全然上達しない・・・


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]