/// <summary> /// used to determine if the turn's hand can defend against a prescribed attack /// </summary> /// <param name="Hand">attacking hand</param> /// <returns>bool</returns> public bool CanDefend(Hand attackCards) { bool bRet = false; int iCountTrumpsInLeftHand = GameUtil.GetCountTrumps(m_Hand); int iCountTrumpsInRightHand = GameUtil.GetCountTrumps(attackCards); if (iCountTrumpsInRightHand > 0) { Hand rightTrumps = GameUtil.getTrumps(attackCards); if (iCountTrumpsInLeftHand > 0) { Hand leftTrumps = GameUtil.getTrumps(m_Hand); if (iCountTrumpsInRightHand > iCountTrumpsInLeftHand) { bRet = GameUtil.CompareTrumps(leftTrumps, rightTrumps); } else if (iCountTrumpsInRightHand < iCountTrumpsInLeftHand) { bRet = GameUtil.CompareTrumps(rightTrumps, leftTrumps); } else { bRet = GameUtil.CompareHands(m_Hand, attackCards); } } else { bRet = GameUtil.CompareHands(m_Hand, attackCards); } } else if (iCountTrumpsInLeftHand > 0) { bRet = true; } else { int iMaxCountRanksInLeftHand = GameUtil.getCountMaxRanksInHand(m_Hand); int iMaxCountRanksInRightHand = GameUtil.getCountMaxRanksInHand(attackCards); if (iMaxCountRanksInLeftHand == iMaxCountRanksInRightHand) { bRet = true; //most of the time there will be 1 in each hand, but it is possible //to have 2 of a kind in each hand, and use those for gameplay } else { //first test for sets, otherwise a flush for both hands //if (GameUtil.doHandSuitsMatch(attackCards, m_Hand)) //{ // bRet = (m_Hand>attackCards); //} bRet = GameUtil.CompareHands(m_Hand, attackCards); } } return(bRet); }
/// <summary> /// Handles when the done button has been clicked /// </summary> /// <param name="bClickedByHuman"></param> public void DoneClicked(bool bClickedByHuman) { Round curRound = m_Rounds[m_Rounds.Count - 1]; curRound.Expand(); Turn curTurn = curRound.GetCurrentTurn(); Turn prevTurn = (Turn)curTurn.Clone(); prevTurn--; Player curPlayer = curTurn.GetPlayer(); Player prevPlayer = prevTurn.GetPlayer(); Hand prevHand = prevTurn.GetHand(); Hand curHand = curTurn.GetHand(); if (curTurn.GetPlayer().ID == prevTurn.GetPlayer().ID) { if (!curTurn.isDefending())//impossible to defend on the first turn { if (!bClickedByHuman) { curHand = curPlayer.Attack(prevHand);//a player object may attack, only if it's not human foreach (PlayingCard card in curHand) { m_Gg.m_BattleArea.AddAttackCard(new CardBox(card, Orientation.Vertical, curTurn.GetHashCode())); curPlayer.m_Hand -= card;//remove the card from the player's hand WriteToLog("Player " + prevTurn.GetPlayer().ID.ToString() + " " + ((!(PlayerType.human == prevTurn.GetPlayer().GetMode())) ? "computer" : "human") + " attacked using " + card.ToString()); } curTurn.SetHand(curHand); if (0 == curHand.Count) { WriteToLog("Player " + prevTurn.GetPlayer().ID.ToString() + " " + ((!(PlayerType.human == prevTurn.GetPlayer().GetMode())) ? "computer" : "human") + " player (prev turn) sucessfully attacked/defended"); } m_Gg.UpdateElements(m_Players);//update UI } } if (false == btnDoneGuard) { Timed_Response(ResponseType.next_turn);//timed response gives time for the user to view cards on the table } } else { int iLoserId = 0;//used to track loser of this round. The loser will have the first turn in next round if (!bClickedByHuman) { if (false == btnDoneGuard) { if (curTurn.GetPlayer().CanDefend(prevHand)) { curHand = curPlayer.MakeDefense(prevHand); foreach (PlayingCard card in curHand) { m_Gg.m_BattleArea.AddDefenseCard(new CardBox(card, Orientation.Vertical, curTurn.GetHashCode())); curPlayer.m_Hand -= card; WriteToLog("Player " + prevTurn.GetPlayer().ID.ToString() + " " + ((!(PlayerType.human == prevTurn.GetPlayer().GetMode())) ? "computer" : "human") + " defended using " + card.ToString()); } curTurn.SetHand(curHand);//override any existing hand if (0 == curHand.Count) { WriteToLog("Player " + prevTurn.GetPlayer().ID.ToString() + " " + ((!(PlayerType.human == prevTurn.GetPlayer().GetMode())) ? "computer" : "human") + " player (prev turn) sucessfully attacked/defended"); iLoserId = prevTurn.GetPlayer().ID; } } else { iLoserId = ProcessLoser(prevTurn, prevHand, prevPlayer.ID, curTurn, curHand, bClickedByHuman); } } } //need to get the current count of cards in each player's hands int ranksInPrevHand = GameUtil.getCountMaxRanksInHand(prevHand); int ranksInCurHand = GameUtil.getCountMaxRanksInHand(curHand); bool bTemp = GameUtil.doHandSuitsMatch(prevHand, curHand); if (ranksInPrevHand == ranksInCurHand)//test for equal hands, do nothing if not equals { if (false == btnDoneGuard) { if (prevHand > curHand)//compare { iLoserId = ProcessLoser(prevTurn, prevHand, prevPlayer.ID, curTurn, curHand, bClickedByHuman); } else if (curHand > prevHand) { iLoserId = ProcessLoser(curTurn, curHand, curPlayer.ID, prevTurn, prevHand, bClickedByHuman); } else {//draw MessageBox.Show("Draw"); } } } else { if (curTurn.isDefending()) //attacking humans are free to place as many cards on the board as they want, errors to be caught by Cardbox_Clicked method { if (bClickedByHuman) //notify user of their mistake { if (GameUtil.ShallIDoThisForYou("You did not place the correct amount of cards in the battle area. Forfeit?")) { WriteToLog("Player " + prevTurn.GetPlayer().ID.ToString() + " " + ((!(PlayerType.human == prevTurn.GetPlayer().GetMode())) ? "computer" : "human") + " player (prev turn) sucessfully attacked/defended"); iLoserId = prevTurn.GetPlayer().ID; } } } } m_Gg.UpdateElements(m_Players); //refresh gui with new placements DoneWithRound(iLoserId); //iLoserId used to set player order in the next round curRound.m_CurrentTurn--; } curRound.m_CurrentTurn++; curRound.outputStatusToWindow(ref m_Gg); curRound.updateBoldedStatus(curRound.GetCurrentTurn(), ref m_Gg); }