7

まず、これが重複した投稿である場合はお詫びします。同時に投稿/登録しようとしているので、物事は少し混乱しました。

単純なWPFウィンドウからUCIチェスエンジンを実行することを調査し始め、インターフェイスとは別のスレッドでチェスエンジンを実行するコツをつかみ、適度にサービス可能なテキストベースのフロントエンドを作成しました。

私はもう少し野心的になっています。プレーヤーの動きをチェスエンジンに送り、ボード上のエンジンの動きも表す、チェスの駒を備えたGUIの構築を開始したいと思います。四角をクリックするのではなく、ドラッグ可能なピースを目指しています。

私の現在の試みは、<canvas>要素のピースにドラッグ可能なユーザーコントロールを使用することです。私は自分が正しい方向に進んでいると完全に確信しているわけではないので、他の経験豊富なWPF/.NETプログラマーがこれにどのようにアプローチするかを聞いて本当に興味があります。

例:均一なグリッドを使用して、子要素間でピースデータをドラッグする方がよいでしょうか?ポーンなどのピースを派生させることができる抽象的な「ピース」クラスを作成する必要がありますか?そういうこと。

何かご意見は?これは宿題などではなく、余暇に運動をしているだけです。

4

1 に答える 1

3

Silverlightオンライン チェスシステムにチェス盤を実装しました。

これが私がやった方法です。

  1. チェス盤用に別のユーザー コントロールを作成しました
  2. コントロールに 8x8 のグリッドを追加しました
  3. 次に、それぞれ異なる色 (暗い正方形と明るい正方形) でシェーディングする 64 の境界線を追加しました。それぞれに名前を付けてください。各境界線は、Grid.Row および Grid.Col プロパティを使用してグリッドに配置されました。
  4. 各 Border 内に、チェスの駒の画像を保持する Image を追加しました。
  5. 現在のゲームの状態に基づいて、画像を正しいチェスの駒に設定する方法をいくつかコーディングする必要があります。
  6. 各イメージは同じイベントを受け取り (これは重要です)、64 個すべてが同じコードを呼び出します。

    MouseLeftButtonDown="Image_MouseLeftButtonDown" MouseMove="Image_MouseMove" MouseLeftButtonUp="Image_MouseLeftButtonUp"

これら 3 つのイベントの背後にある考え方は、クリックの起点を取得する画像 (MouseLeftButtonDown) をクリックしたときに記録し、マウスが動いているときにイベントを呼び出すことです。これにより、ピースの動きに合わせて画面を更新できます。マウス ボタンを放したときに記録する最後のイベント (MouseLeftButtonUp) を使用すると、移動先を取得してチェス エンジンに移動を送信できます。チェス エンジンによって動きが記録されたら、チェス盤を再描画するだけです。

private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Image image = (Image)sender;
    Border border = (Border)image.Parent;

    image.CaptureMouse();
    isMouseCapture = true;
    mouseXOffset = e.GetPosition(border).X;
    mouseYOffset = e.GetPosition(border).Y;

    var chessPiece = (Image) sender;
    var chessSquare = (Border) chessPiece.Parent;

    var row = (byte) (Grid.GetRow(chessSquare));
    var column = (byte) (Grid.GetColumn(chessSquare) - 1);

    if (engine.HumanPlayer == ChessPieceColor.White)
    {
        SelectionChanged(row, column, false);
    }
    else
    {
        SelectionChanged((byte)(7 - row), (byte)(7 - column), false);
    }
}

SelectionChanged は、ユーザーが選択したソース スクエアを記録する独自の方法です。isMouseCapture は、ユーザーがピースのドラッグを開始したときを記録するための独自の変数でもあります。

private void Image_MouseMove(object sender, MouseEventArgs e)
{

    Image image = (Image)sender;
    Border border = (Border)image.Parent;


    if (!currentSource.Selected)
    {
        image.ReleaseMouseCapture();
        isMouseCapture = false;

        translateTransform = new TranslateTransform();

        translateTransform.X = 0;
        translateTransform.Y = 0;

        mouseXOffset = 0;
        mouseYOffset = 0;
    }



    if (isMouseCapture)
    {
        translateTransform = new TranslateTransform();

        translateTransform.X = e.GetPosition(border).X - mouseXOffset;
        translateTransform.Y = e.GetPosition(border).Y - mouseYOffset;

        image.RenderTransform = translateTransform;

        CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, false);


    }
}

上記のCalculareSquareSelectedでは、8x8のチェス盤でピースが移動していると思われる場所に移動したピクセルを変換します。たとえば、100 ピクセル移動したとします。チェス ボードの正方形は、2 チェス ボードの正方形を移動したよりもわずか 50 ピクセルです。

private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (translateTransform == null)
    {
        return;
    }

    Image image = (Image)sender;

    image.ReleaseMouseCapture();
    isMouseCapture = false;

    if (translateTransform.X > 10 || translateTransform.Y > 10 || translateTransform.X < -10 || translateTransform.Y < -10)
    {
        CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, true);
    }
    translateTransform = new TranslateTransform();

    translateTransform.X = 0;
    translateTransform.Y = 0;

    mouseXOffset = 0;
    mouseYOffset = 0;

    image.RenderTransform = translateTransform;

}

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2010-09-02T20:55:33.723 に答える