Exemplo n.º 1
0
    public int CalculateScore(ChessBoardSnapshot boardSnapshot, ChessPlayerType playerType)
    {
        int ret = 0;

        ChessPieceType[] board = boardSnapshot.board;

        for (int i = 0; i < board.Length; i++)
        {
            if (!board[i].IsValid())
            {
                continue;
            }
            if (board[i].IsEmpty())
            {
                continue;
            }

            if (board[i].IsSameTeamAs(playerType))
            {
                ret += profilesDict[board[i]].score + 1;
            }
            else if (board[i].IsDifferentTeamAs(playerType))
            {
                ret -= profilesDict[board[i]].score + 1;
            }
        }

        return(ret);
    }
Exemplo n.º 2
0
    /// <summary>
    /// 当进入一个房间(通过创建或加入)时被调用。在所有客户端(包括主客户端)上被调用.
    /// </summary>
    /// <remarks>这种方法通常用于实例化玩家角色。
    /// 如果一场比赛必须“积极地”被开始,你也可以调用一个由用户的按键或定时器触发的PunRPC 。
    ///
    /// 当这个被调用时,你通常可以通过PhotonNetwork.playerList访问在房间里现有的玩家。
    /// 同时,所有自定义属性Room.customProperties应该已经可用。检查Room.playerCount就知道房间里是否有足够的玩家来开始游戏.</remarks>
    public override void OnJoinedRoom()
    {
        local  = PhotonNetwork.player;
        remote = PhotonNetwork.player.GetNext();
        if (PhotonNetwork.isMasterClient && local != null)
        {
            localPlayerType               = ChessPlayerType.Red;
            LocalGameStatusText.text      = "您是红方棋手……";
            this.LocalPlayerNameText.text = local.NickName + ":红方";
            ExitGames.Client.Photon.Hashtable playerType = new ExitGames.Client.Photon.Hashtable();
            playerType.Add("playerType", "红方选手");
            local.SetCustomProperties(playerType, null, false);
        }
        else
        {
            this.LocalPlayerNameText.text = local.NickName + ":黑方";
            ExitGames.Client.Photon.Hashtable playerType = new ExitGames.Client.Photon.Hashtable();
            playerType.Add("playerType", "黑方选手");
            local.SetCustomProperties(playerType, null, false);
            localPlayerType          = ChessPlayerType.Black;
            LocalGameStatusText.text = "您是黑方棋手……";
        }

        if (PhotonNetwork.room.PlayerCount == 2 && this.turnManager.Turn == 0)
        {
            // 当房间内有两个玩家,则开始首回合
            Play();
        }

        if (PhotonNetwork.room.PlayerCount > 2)
        {
            localPlayerType          = ChessPlayerType.Guest;
            LocalGameStatusText.text = "棋局已开始,正在进入观棋模式……";
        }

        if (remote != null)
        {
            RemoteGameStatusText.text = "已匹配!";
            // 应该是这种格式: "name        00"
            if (PhotonNetwork.isMasterClient)
            {
                this.RemotePlayerNameText.text = remote.NickName + "—黑方";
            }
            else
            {
                this.RemotePlayerNameText.text = remote.NickName + "—红方";
            }
        }
        else
        {
            this.RemotePlayerNameText.text = "匹配...";
            LocalGameStatusText.text       = "等待其他玩家...";
            RemoteGameStatusText.text      = "正在匹配...";
        }

        RefreshUIViews();
    }
Exemplo n.º 3
0
        public static ChessPlayerType ToOpposite(this ChessPlayerType playerType)
        {
            if (playerType == ChessPlayerType.White)
            {
                return(ChessPlayerType.Black);
            }
            if (playerType == ChessPlayerType.Black)
            {
                return(ChessPlayerType.White);
            }

            return(playerType);
        }
Exemplo n.º 4
0
    /// <summary>
    /// 更新玩家文本信息
    /// </summary>
    private void UpdatePlayerTexts()
    {
        PhotonPlayer remote = PhotonNetwork.player.GetNext();
        PhotonPlayer local  = PhotonNetwork.player;

        if (remote != null)
        {
            // 应该是这种格式: "name        00"
            if (PhotonNetwork.isMasterClient)
            {
                this.RemotePlayerText.text = remote.NickName + "—黑方 | Black   " + remote.GetScore().ToString("D2");
            }
            else
            {
                this.RemotePlayerText.text = remote.NickName + "—红方 | Red   " + remote.GetScore().ToString("D2");
            }
        }
        else
        {
            TimerFillImage.anchorMax   = new Vector2(0f, 1f);
            this.TimeText.text         = "";
            this.RemotePlayerText.text = "等待其他玩家        00";
        }

        if (local != null)
        {
            // 应该是这种样式: "YOU   00"
            if (PhotonNetwork.isMasterClient)
            {
                localPlayerType           = ChessPlayerType.Red;
                this.LocalPlayerText.text = local.NickName + ":红方 | Red   " + local.GetScore().ToString("D2");
                //Debug.Log ("MasterClient");
            }
            else
            {
                localPlayerType           = ChessPlayerType.Black;
                this.LocalPlayerText.text = local.NickName + ":黑方 | Black   " + local.GetScore().ToString("D2");
            }


            if (localPlayerType == ChessPlayerType.Guest)
            {
                this.LocalPlayerText.text = PhotonNetwork.player.Get(2).NickName + ":黑方 | Black   " + PhotonNetwork.player.Get(1).GetScore().ToString("D2");
                //Debug.Log ("ChessPlayerType.Guest");
            }
        }
    }
Exemplo n.º 5
0
 public static bool IsDifferentTeamAs(this ChessPieceType pieceType, ChessPlayerType playerType)
 {
     if (!pieceType.IsValid())
     {
         return(false);
     }
     if (pieceType.IsEmpty())
     {
         return(false);
     }
     if (pieceType.IsWhite() && playerType == ChessPlayerType.Black)
     {
         return(true);
     }
     if (pieceType.IsBlack() && playerType == ChessPlayerType.White)
     {
         return(true);
     }
     return(false);
 }
Exemplo n.º 6
0
    /// <summary>
    /// 当进入一个房间(通过创建或加入)时被调用。在所有客户端(包括主客户端)上被调用.
    /// </summary>
    /// <remarks>这种方法通常用于实例化玩家角色。
    /// 如果一场比赛必须“积极地”被开始,你也可以调用一个由用户的按键或定时器触发的PunRPC 。
    ///
    /// 当这个被调用时,你通常可以通过PhotonNetwork.playerList访问在房间里现有的玩家。
    /// 同时,所有自定义属性Room.customProperties应该已经可用。检查Room.playerCount就知道房间里是否有足够的玩家来开始游戏.</remarks>
    public override void OnJoinedRoom()
    {
        PhotonPlayer local = PhotonNetwork.player;

        if (PhotonNetwork.isMasterClient)
        {
            localPlayerType     = ChessPlayerType.Red;
            GameStatusText.text = "您是红方棋手……";
            Debug.Log("OnJoinedRoom+您是红方棋手");
            ExitGames.Client.Photon.Hashtable playerType = new ExitGames.Client.Photon.Hashtable();
            playerType.Add("playerType", "红方选手");
            local.SetCustomProperties(playerType, null, false);
        }

        if (PhotonNetwork.room.PlayerCount == 2)
        {
            if (!PhotonNetwork.isMasterClient)
            {
                ExitGames.Client.Photon.Hashtable playerType = new ExitGames.Client.Photon.Hashtable();
                playerType.Add("playerType", "黑方选手");
                local.SetCustomProperties(playerType, null, false);
                localPlayerType     = ChessPlayerType.Black;
                GameStatusText.text = "您是黑方棋手……";
            }

            if (this.turnManager.Turn == 0)
            {
                // 当房间内有两个玩家,则开始首回合
                this.StartTurn();
            }
        }

        if (PhotonNetwork.room.PlayerCount > 2)
        {
            if (localPlayerType == ChessPlayerType.Guest)
            {
                GameStatusText.text = "棋局已开始,正在进入观棋模式……";
            }
        }
        RefreshUIViews();
    }
Exemplo n.º 7
0
 /// <summary>
 /// 离线模式
 /// </summary>
 public void OfflineModeAct(int nPly)
 {
     HidePath();
     chessManManager.hidePointer();
     _isRedTurn = true;
     PhotonNetwork.offlineMode = true;
     nFlag = 0;
     PlayMusic(welcomMusic);
     AI.OnNewGame(1, nPly);
     chessManManager.ChessmanInit();
     LocalGameStatusText.text  = "开局!";
     RemoteGameStatusText.text = "开局!";
     localPlayerType           = ChessPlayerType.Red;
     LocalGameStatusText.text  = "您是红方棋手……";
     if (PlayerPrefs.HasKey("PlayerName"))
     {
         this.LocalPlayerNameText.text = PlayerPrefs.GetString("PlayerName") + ":红方";
     }
     RemotePlayerNameText.text = "AI:黑方";
     UpdatePlayerScoreTexts();
     this.StartTurn();
 }
Exemplo n.º 8
0
    /// <summary>
    /// 当进入一个房间(通过创建或加入)时被调用。在所有客户端(包括主客户端)上被调用.
    /// </summary>
    /// <remarks>这种方法通常用于实例化玩家角色。
    /// 如果一场比赛必须“积极地”被开始,你也可以调用一个由用户的按键或定时器触发的PunRPC 。
    ///
    /// 当这个被调用时,你通常可以通过PhotonNetwork.playerList访问在房间里现有的玩家。
    /// 同时,所有自定义属性Room.customProperties应该已经可用。检查Room.playerCount就知道房间里是否有足够的玩家来开始游戏.</remarks>
    public override void OnJoinedRoom()
    {
        if (PhotonNetwork.isMasterClient)
        {
            localPlayerType     = ChessPlayerType.Red;
            GameStatusText.text = "您是红方棋手……";
            Debug.Log("OnJoinedRoom+您是红方棋手");
        }
        if (PhotonNetwork.room.PlayerCount == 2)
        {
            if (!PhotonNetwork.isMasterClient)
            {
                localPlayerType     = ChessPlayerType.Black;
                GameStatusText.text = "您是黑方棋手……";
            }

            if (this.turnManager.Turn == 0)
            {
                // 当房间内有两个玩家,则开始首回合
                this.StartTurn();
            }
        }
        else
        {
            Debug.Log("Waiting for another player");
            GameStatusText.text = "等待玩家加入……";
        }

        if (PhotonNetwork.room.PlayerCount > 2)
        {
            if (localPlayerType == ChessPlayerType.Guest)
            {
                GameStatusText.text = "棋局已开始,正在进入观棋模式……";
            }
        }
        RefreshUIViews();
    }
Exemplo n.º 9
0
 public static bool IsDifferentTeamAs(this ChessPlayerType playerType, ChessPieceType pieceType)
 {
     return(pieceType.IsDifferentTeamAs(playerType));
 }
Exemplo n.º 10
0
    public ChessBoardSnapshot[] FindPossibleMoves(ChessBoardSnapshot boardSnapshot, ChessPlayerType playerType)
    {
        List <ChessBoardSnapshot>       ret       = new List <ChessBoardSnapshot>();
        Dictionary <int, ChessPosition> boardDict = boardSnapshot.ToDictionary();

        foreach (KeyValuePair <int, ChessPosition> kvp in boardDict)
        {
            ChessPosition position = kvp.Value;

            if (position.type.IsDifferentTeamAs(playerType))
            {
                continue;
            }

            ChessCoordinate from = position.coord;

            ChessPieceMove[] possibleMoves = GameManager.Instance.profilesDict[position.type].possibleMoves;

            for (int j = 0; j < possibleMoves.Length; j++)
            {
                ChessCoordinate to = from + possibleMoves[j].move;
                int             k  = 1;

                while
                (
                    to.IsWithinRange() &&
                    (possibleMoves[j].repeatTimes < 0 || k <= possibleMoves[j].repeatTimes)
                )
                {
                    if (GameManager.Instance.IsValidSpecialRule(possibleMoves[j].specialRule, position, from, to))
                    {
                        // When there are only finite amount of moves, set only when reached destination
                        if (possibleMoves[j].repeatTimes < 0 || k == possibleMoves[j].repeatTimes)
                        {
                            bool isLastMove = false;

                            if (possibleMoves[j].pattern == ChessPieceMovePattern.Normal)
                            {
                                if (boardDict.ContainsKey(to.ToArrayCoord()))
                                {
                                    if (boardDict[to.ToArrayCoord()].type.IsSameTeamAs(position.type))
                                    {
                                        break;
                                    }

                                    isLastMove = true;
                                }
                            }
                            else if (possibleMoves[j].pattern == ChessPieceMovePattern.MoveOnly)
                            {
                                if (boardDict.ContainsKey(to.ToArrayCoord()))
                                {
                                    break;
                                }
                            }
                            else if (possibleMoves[j].pattern == ChessPieceMovePattern.CaptureOnly)
                            {
                                if (!boardDict.ContainsKey(to.ToArrayCoord()))
                                {
                                    break;
                                }

                                if (boardDict[to.ToArrayCoord()].type.IsSameTeamAs(position.type))
                                {
                                    break;
                                }
                            }

                            // Pawn Promotion
                            if (position.type.IsPawn())
                            {
                                if
                                (
                                    position.type == ChessPieceType.WhitePawn &&
                                    position.coord.y == 0
                                )
                                {
                                    position.type = ChessPieceType.WhiteQueen;
                                }
                                else if
                                (
                                    position.type == ChessPieceType.BlackPawn &&
                                    position.coord.y == 7
                                )
                                {
                                    position.type = ChessPieceType.BlackQueen;
                                }
                            }

                            ret.Add(GameManager.Instance.AdjustBoard
                                    (
                                        boardSnapshot,
                                        position.type.ToIcon() + " " + from.x + "," + from.y + "-->" + to.x + "," + to.y,
                                        new ChessPosition(ChessPieceType.None, from, true),
                                        new ChessPosition(position.type, to, true)
                                    ));

                            if (isLastMove)
                            {
                                break;
                            }
                        }
                        else
                        {
                            if (boardDict.ContainsKey(to.ToArrayCoord()))
                            {
                                break;
                            }
                        }
                    }

                    to += possibleMoves[j].move;
                    k++;
                }
            }
        }

        return(ret.ToArray());
    }