C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)


(過去ログ 75 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■44311 / inTopicNo.1)  将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
  
□投稿者/ HTML-M (1回)-(2009/12/04(Fri) 18:18:32)

分類:[VB.NET/VB2005 以降] 

2009/12/04(Fri) 18:57:36 編集(投稿者)
[初心者,VB2008、WinXP-SP3]
こんにちは。

将棋を作っています。
香車の移動処理を3日ぐらい考えてもできたソースは
意図した動作をしてくれません。(またいではいけないという処理)
いっしょに考えていただけませんか?

お願いします。

試しに作ってみたソースコード(英語苦手なので、引数の名前が間違っているかもしれません。):
======ここから======

        '香車の動ける範囲を求めるソースコード
        'MovePositionは移動元の座標です。
                Dim plist As New List(Of Point)
        '考えられる香車の移動できるマスすべてを求める
                plist.AddRange(New Point() { _
                New Point(MovePosition.X, MovePosition.Y - 1), _
                New Point(MovePosition.X, MovePosition.Y - 2), _
                New Point(MovePosition.X, MovePosition.Y - 3), _
                New Point(MovePosition.X, MovePosition.Y - 4), _
                New Point(MovePosition.X, MovePosition.Y - 5), _
                New Point(MovePosition.X, MovePosition.Y - 6), _
                New Point(MovePosition.X, MovePosition.Y - 7), _
                New Point(MovePosition.X, MovePosition.Y - 8) _
                })

                '負の数、9以上はとれない(正常)
                plist.RemoveAll(AddressOf CheckNegativeandnineplus) 'plistから負の数、9以上のx,y座標を削除

                '自分の駒は取れない(正常)
                plist.RemoveAll(AddressOf CheckMykoma)

                'ほかの駒をまたいではいけない
                For i As Integer = plist.Count - 1 To 0 Step -1
                    If Checkmatagi(CellStatus.Kyosha, MovePosition, plist(i)) Then
                        plist.RemoveAt(i)
                    End If
                Next
        
        'ほかの駒をまたいでいないか(trueで削除)
    Private Function Checkmatagi(ByVal koma As CellStatus, ByVal MovePosition As Point, ByVal MoveToPosition As Point) As Boolean
        Select Case koma
            Case CellStatus.Kyosha ’香車の場合の処理
      ☆なんてかいたらいいですか?
        End Select
    End Function

すべてのマスの情報は、public property Cells(x,y) As cellstatus
Public Enum CellStatus
    [Nothing] 'なし
    Gyokusho '玉将
    Hisya '飛車
    Kakugyo '角行
    Kinsho '金将
    Ginsho '銀将
    Keima '桂馬
    Kyosha '香車
    Huhyo '歩兵
    _Hisya '飛車成り(+銀
    _Kakugyo '角成り(+金
    _Ginsho '成銀(金
    _Keima '成桂(金
    _Kyosha '成香(金
    _Huhyo 'と金(金
    '---逆さまの駒(Sakは逆さまの略)---
    Sak_Gyokusho '玉将
    Sak_Hisya '飛車
    Sak_Kakugyo '角行
    Sak_Kinsho '金将
    Sak_Ginsho '銀将
    Sak_Keima '桂馬
    Sak_Kyosha '香車
    Sak_Huhyo '歩兵
End Enum

======ここまで======

引用返信 編集キー/
■44314 / inTopicNo.2)  Re[1]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
□投稿者/ .SHO (1047回)-(2009/12/04(Fri) 19:58:48)
No44311 (HTML-M さん) に返信

> Private Function Checkmatagi(ByVal koma As CellStatus, ByVal MovePosition As Point, ByVal MoveToPosition As Point) As Boolean
> Select Case koma
> Case CellStatus.Kyosha ’香車の場合の処理
>       ☆なんてかいたらいいですか?
> End Select
> End Function

移動先のPointが引数で渡されなければ
またいでるかなんて判定できるわけないです。

引用返信 編集キー/
■44315 / inTopicNo.3)  Re[2]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
□投稿者/ HTML-M (2回)-(2009/12/04(Fri) 20:06:07)
No44314 (.SHO さん) に返信
> ■No44311 (HTML-M さん) に返信
>
>> Private Function Checkmatagi(ByVal koma As CellStatus, ByVal MovePosition As Point, ByVal MoveToPosition As Point) As Boolean
>> Select Case koma
>> Case CellStatus.Kyosha ’香車の場合の処理
>>      ☆なんてかいたらいいですか?
>> End Select
>> End Function
>
> 移動先のPointが引数で渡されなければ
> またいでるかなんて判定できるわけないです。
>

分かりにくくてすみません。
考えられる香車の動く場所から
動かせない場所を削除していき、
最終的に、動かせる場所だけが残るようにしています。
なので、MoveToPositionに、plist(i)を指定しています。
引用返信 編集キー/
■44316 / inTopicNo.4)  Re[2]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
□投稿者/ .SHO (1048回)-(2009/12/04(Fri) 20:06:49)
No44311 (HTML-M さん) に返信

あと、判定時の盤面の状態も。

それと、上への移動だけでいいんですか?
上へ行くのが自分だとして、相手の移動は判定しない?
引用返信 編集キー/
■44317 / inTopicNo.5)  Re[3]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
□投稿者/ .SHO (1049回)-(2009/12/04(Fri) 20:10:05)
No44315 (HTML-M さん) に返信

> 考えられる香車の動く場所から
> 動かせない場所を削除していき、
> 最終的に、動かせる場所だけが残るようにしています。
> なので、MoveToPositionに、plist(i)を指定しています。

そういうことか・・・
動かせない場所は、plistから削除されればいいわけね。

plistのPointを順番に見て、その場所に駒があったら
それ以降全部削除でいいのでは。
引用返信 編集キー/
■44318 / inTopicNo.6)  Re[4]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
□投稿者/ .SHO (1050回)-(2009/12/04(Fri) 20:14:53)
No44315 (HTML-M さん) に返信

つか、「最初に考えられる香車の移動できるマスすべてを求める」のではなく
「'ほかの駒をまたいではいけない」のループの中で、移動可能な場所まで
plistに追加した方が簡単そう。

引用返信 編集キー/
■44326 / inTopicNo.7)  Re[5]: 将棋作成中。香車が移動できるかどうかの処理(またいでいるか)
□投稿者/ HTML-M (3回)-(2009/12/04(Fri) 22:21:54)
2009/12/04(Fri) 22:24:29 編集(投稿者)
2009/12/04(Fri) 22:23:28 編集(投稿者)

■No44318 (.SHO さん) に返信
> ■No44315 (HTML-M さん) に返信
> 
> つか、「最初に考えられる香車の移動できるマスすべてを求める」のではなく
> 「'ほかの駒をまたいではいけない」のループの中で、移動可能な場所まで
> plistに追加した方が簡単そう。
> 
それ、いいですね!
こんなプログラムが組めました。

'香車の動ける範囲
                Dim plist As New List(Of Point)

                'もしもすぐ前が駒だったら
                If Cells(MovePosition.X, MovePosition.Y - 1).Status <> CellStatus.Nothing Then 'Nothingじゃなかったら
                    For i As Integer = 0 To Sak_komas.Length - 1
                        If Cells(MovePosition.X, MovePosition.Y - 1).Status = Sak_komas(i) Then plist.Add(New Point(MovePosition.X, MovePosition.Y - 1))
                    Next
                Else
                    '通常動作

                    'ほかの駒をまたいではいけない
                    For i As Integer = MovePosition.Y - 1 To 0 Step -1
                        If Cells(MovePosition.X, i).Status = CellStatus.Nothing Then
                            plist.Add(New Point(MovePosition.X, i))
                        Else
                            Exit For
                        End If
                    Next
                End If

                '負の数、9以上はとれない
                plist.RemoveAll(AddressOf CheckNegativeandnineplus)

                '自分の駒は取れない
                plist.RemoveAll(AddressOf CheckMykoma)
                Return plist.ToArray

.SHOさん、ありがとうございました。
その他、このスレに目を通してくださった
方々に感謝します。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -