///////////////////////////////////////////////////////////////////////////// // Name: rubber.cpp // tag: score rubber bridge // Author: David Roundy // Created: 9/2001 // Copyright: (c) 2001 David Roundy // Licence: GPL /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes . #include #ifndef WX_PRECOMP #include #include #endif #include "rubber.h" #include "colors.h" #include "rubber.h" #include "debug.h" aBridgeRubber::aBridgeRubber(aBridgeGame *the_game) : aBridgeScoreBase(the_game) { } aBridgeRubber::~aBridgeRubber() { } bool aBridgeRubber::HandleHand(Seat dummy_seat,int bid_val, Suit bid_suit, bool is_doubled, bool is_redoubled, int ns_tricks) { int declarer_made; bool declarer_vulnerable; int declarer_above=0, declarer_below=0, defense_above=0; wxString msg; if (!IsNS(dummy_seat)) { DebugMsg("Declarer is EW"); declarer_made = 13-ns_tricks - 6; declarer_vulnerable = ew_vulnerable; } else { DebugMsg("Declarer is NS"); declarer_made = ns_tricks - 6; declarer_vulnerable = ns_vulnerable; } msg.Printf("Declarer made a bid of %d\n", declarer_made); DebugMsg(msg); msg.Printf("Declarer actually bid %d\n", bid_val); DebugMsg(msg); if (declarer_made < bid_val) { msg.Printf("Declarer is set %d\n", bid_val-declarer_made); DebugMsg(msg); if (declarer_vulnerable) { defense_above += 100*(bid_val-declarer_made); } else { defense_above += 50*(bid_val-declarer_made); } } else { int bidpoints; int overval; if (bid_suit == clubs || bid_suit == diamonds) { bidpoints = bid_val*20; overval = 20; } else if (bid_suit == hearts || bid_suit == spades) { bidpoints = bid_val*30; overval = 30; } else { bidpoints = bid_val*30 + 10; overval = 30; } wxString msg; msg.Printf("Declarer makes with %d overtricks\n", -bid_val+declarer_made); DebugMsg(msg); if (!is_doubled) { declarer_above += overval*(declarer_made-bid_val); declarer_below += bidpoints; } else if (!is_redoubled) { declarer_above += 50+2*overval*(declarer_made-bid_val); declarer_below += 2*bidpoints; } else { DebugMsg("I'm not sure what the points for redoubled are."); declarer_above += 50+2*overval*(declarer_made-bid_val); declarer_below += 2*bidpoints; } // Slam!!! if (bid_val == 6) { // Small slam made! if (declarer_vulnerable) { declarer_above += 500; DebugMsg("Small slam, not vulnerable: 500 points!"); } else { declarer_above += 700; DebugMsg("Small slam, vulnerable: 700 points!"); } } else if (bid_val == 7) { // Grand slam made! if (declarer_vulnerable) { declarer_above += 750; DebugMsg("Grand slam, not vulnerable: 750 points!"); } else { declarer_above += 1500; DebugMsg("Grand slam, vulnerable: 1500 points!"); } } } if (!IsNS(dummy_seat)) { // ew is declarer ns_above_line += defense_above; ew_above_line += declarer_above; ew_below_line += declarer_below; } else { // ns is declarer ew_above_line += defense_above; ns_above_line += declarer_above; ns_below_line += declarer_below; } // Check for game!!! if (ns_below_line >= 100) { ns_above_line += ns_below_line; ns_below_line = 0; ew_above_line += ew_below_line; ew_below_line = 0; if (!ns_vulnerable) { DebugMsg("NS won its first game!"); ns_vulnerable = TRUE; } else { if (ew_vulnerable) { ns_above_line += 500; DebugMsg("NS won rubber in three games!"); return true; } else { ns_above_line += 700; DebugMsg("NS won rubber in two games!"); return true; } ew_vulnerable = ns_vulnerable = FALSE; } } else if (ew_below_line >= 100) { ns_above_line += ns_below_line; ns_below_line = 0; ew_above_line += ew_below_line; ew_below_line = 0; if (!ew_vulnerable) { DebugMsg("EW won its first game!"); ew_vulnerable = TRUE; } else { if (ns_vulnerable) { DebugMsg("EW won rubber in three games!"); ew_above_line += 500; return true; } else { ew_above_line += 700; DebugMsg("EW won rubber in two games!"); return true; } ew_vulnerable = ns_vulnerable = FALSE; } } return false; }