From f91a22b698415eacda6af7403814caa6f34ad7e5 Mon Sep 17 00:00:00 2001 From: arun Date: Mon, 8 Jan 2007 09:16:20 +0000 Subject: FEATURE: added solo and now you also can only play cards that are valid on a trick --- create_database.sql | 3 +- db.php | 55 ++++++++- functions.php | 338 +++++++++++++++++++++++++++++++--------------------- index.php | 105 ++++++++++++---- output.php | 6 +- 5 files changed, 339 insertions(+), 168 deletions(-) diff --git a/create_database.sql b/create_database.sql index 66c0cc3..88c41d9 100644 --- a/create_database.sql +++ b/create_database.sql @@ -70,8 +70,9 @@ CREATE TABLE `Game` ( `mod_date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `create_date` timestamp NOT NULL default '0000-00-00 00:00:00', `randomnumbers` varchar(136) default NULL, - `type` enum('solo','wedding','poverty','dpoverty') default NULL, + `type` enum('normal','solo','wedding','poverty','dpoverty') default NULL, `solo` enum('trumpless','jack','queen','trump','club','spade','heart','silent') default NULL, + `startplayer` tinyint(4) default '1', `status` enum('pre','play','gameover') default NULL, `followup_of` int(11) default NULL, `id` int(11) NOT NULL auto_increment, diff --git a/db.php b/db.php index 254c460..6da3bd9 100644 --- a/db.php +++ b/db.php @@ -283,12 +283,18 @@ function DB_get_cards_by_trick($id) } -function DB_set_solo_by_hash($me,$solo) +function DB_set_solo_by_hash($hash,$solo) { mysql_query("UPDATE Hand SET solo=".DB_quote_smart($solo)." WHERE hash=".DB_quote_smart($hash)); return; } +function DB_set_solo_by_gameid($id,$solo) +{ + mysql_query("UPDATE Game SET solo=".DB_quote_smart($solo)." WHERE id=".DB_quote_smart($id)); + return; +} + function DB_set_sickness_by_hash($hash,$sickness) { mysql_query("UPDATE Hand SET sickness=".DB_quote_smart($sickness)." WHERE hash=".DB_quote_smart($hash)); @@ -420,4 +426,51 @@ function DB_insert_comment($comment,$playid,$userid) mysql_query("INSERT INTO Comment VALUES (NULL,NULL,NULL,$userid,$playid, ".DB_quote_smart($comment).")"); return; } + +function DB_get_gametype_by_gameid($id) +{ + $result = mysql_query("SELECT type FROM Game WHERE id=".DB_quote_smart($id)); + $r = mysql_fetch_array($result,MYSQL_NUM); + + if($r) + return $r[0].""; + else + return ""; +} + +function DB_set_gametype_by_gameid($id,$p) +{ + mysql_query("UPDATE Game SET type='".$p."' WHERE id=".DB_quote_smart($id)); + return; +} + +function DB_get_solo_by_gameid($id) +{ + $result = mysql_query("SELECT solo FROM Game WHERE id=".DB_quote_smart($id)); + $r = mysql_fetch_array($result,MYSQL_NUM); + + if($r) + return $r[0].""; + else + return ""; +} + + +function DB_get_startplayer_by_gameid($id) +{ + $result = mysql_query("SELECT startplayer FROM Game WHERE id=".DB_quote_smart($id)); + $r = mysql_fetch_array($result,MYSQL_NUM); + + if($r) + return $r[0]; + else + return 0; +} + +function DB_set_startplayer_by_gameid($id,$p) +{ + mysql_query("UPDATE Game SET startplayer='".$p."' WHERE id=".DB_quote_smart($id)); + return; +} + ?> \ No newline at end of file diff --git a/functions.php b/functions.php index a6ee160..2077d00 100644 --- a/functions.php +++ b/functions.php @@ -49,69 +49,35 @@ function pos_array($c,$arr) return $ret; } -function is_trump($c,$game) +function is_trump($c) { - switch($game) - { - case "queen": - if(in_array($c,array('3','4','5','6','7','8','9','10'))) - return 1; - else - return 0; - break; - case "normal": - return (($c<27) ? 1:0); - break; - } + global $TRUMP; + + if(in_array($c,$TRUMP)) + return 1; + else + return 0; } -function is_same_suite($c1,$c2,$game) +function is_same_suite($c1,$c2) { - switch($game) - { - case "queen": - /* clubs */ - if(in_array($c1,array('11','12','27','28','29','30','31','32','33','34')) && - in_array($c2,array('11','12','27','28','29','30','31','32','33','34')) ) - return 1; - /* spade */ - if(in_array($c1,array('13','14','35','36','37','38','39','40','41','42')) && - in_array($c2,array('13','14','35','36','37','38','39','40','41','42')) ) - return 1; - /* heart */ - if(in_array($c1,array( '1', '2','15','16','43','44','45','46','47','48')) && - in_array($c2,array( '1', '2','15','16','43','44','45','46','47','48')) ) - return 1; - /* diamonds */ - if(in_array($c1,array('17','18','19','20','21','22','23','24','25','26')) && - in_array($c2,array('17','18','19','20','21','22','23','24','25','26')) ) - return 1; - - return 0; - break; - case "normal": - /* clubs */ - if(in_array($c1,array('27','28','29','30','31','32','33','34')) && - in_array($c2,array('27','28','29','30','31','32','33','34')) ) - return 1; - /* spade */ - if(in_array($c1,array('35','36','37','38','39','40','41','42')) && - in_array($c2,array('35','36','37','38','39','40','41','42')) ) - return 1; - /* heart */ - if(in_array($c1,array('43','44','45','46','47','48')) && - in_array($c2,array('43','44','45','46','47','48')) ) - return 1; - - return 0; - break; - } + global $TRUMP,$DIAMONDS,$HEARTS,$CLUBS,$SPADES; + + if(in_array($c1,$TRUMP ) && in_array($c2,$TRUMP ) ) return 1; + if(in_array($c1,$CLUBS ) && in_array($c2,$CLUBS ) ) return 1; + if(in_array($c1,$HEARTS ) && in_array($c2,$HEARTS ) ) return 1; + if(in_array($c1,$SPADES ) && in_array($c2,$SPADES ) ) return 1; + if(in_array($c1,$DIAMONDS) && in_array($c2,$DIAMONDS) ) return 1; + + return 0; } function compare_cards($a,$b,$game) { /* if "a" is higher than "b" return 1, else 0, "a" being the card first played */ + global $TRUMP,$DIAMONDS,$HEARTS,$CLUBS,$SPADES; + /* first map all cards to the odd number, * this insure that the first card wins the trick * if they are the same card @@ -120,93 +86,65 @@ function compare_cards($a,$b,$game) $a--; if( $b/2 - (int)($b/2) != 0.5) $b--; - + + /* some special cases */ switch($game) { - case "trumpless": - break; - case "jack": - break; - case "queen": - if(is_trump($a,$game) && is_trump($b,$game) && $a<=$b) - return 1; - else if(is_trump($a,$game) && is_trump($b,$game) ) - return 0; - else - { /*$a is not a trump */ - if(is_trump($b,$game)) - return 0; - else - { /* both no trump */ - /* both clubs? */ - $posA = pos_array($a,array('27','28','29','30','31','32','11','12','33','34')); - $posB = pos_array($b,array('27','28','29','30','31','32','11','12','33','34')); - if($posA && $posB) - if($posA <= $posB) - return 1; - else - return 0; - /* both spades? */ - $posA = pos_array($a,array('35','36','37','38','39','40','13','14','41','42')); - $posB = pos_array($b,array('35','36','37','38','39','40','13','14','41','42')); - if($posA && $posB) - if($posA <= $posB) - return 1; - else - return 0; - /* both hearts? */ - $posA = pos_array($a,array('43','44','15','16','45','46', '1', '2','47','48')); - $posB = pos_array($b,array('43','44','15','16','45','46', '1', '2','47','48')); - if($posA && $posB) - if($posA <= $posB) - return 1; - else - return 0; - /* both diamonds? */ - $posA = pos_array($a,array('19','20','21','22','23','24','17','18','25','26')); - $posB = pos_array($b,array('19','20','21','22','23','24','17','18','25','26')); - if($posA && $posB) - if($posA <= $posB) - return 1; - else - return 0; - - /* not the same suit and no trump: a wins */ - return 1; - } - } - break; - case "trump": - break; - case "club": - break; - case "spade": - break; - case "heart": - break; case "normal": if($a==1 && $b==1) /* both 10 of hearts */ return 0; /* second one wins. TODO should be able to set this at the start of a new game */ - if(is_trump($a,$game) && $a<=$b) - return 1; - else if(is_trump($a,$game)) + } + + if(is_trump($a) && is_trump($b) && $a<=$b) + return 1; + else if(is_trump($a) && is_trump($b) ) + return 0; + else + { /*$a is not a trump */ + if(is_trump($b)) return 0; - else - { /*$a is not a trump */ - if(is_trump($b,$game)) - return 0; - else - { - if(is_same_suite($a,$b,$game)) - if($a<=$b) - return 1; - else - return 0; - - /* not the same suit and no trump: a wins */ + else + { /* both no trump */ + + /* both clubs? */ + $posA = pos_array($a,$CLUBS); + $posB = pos_array($b,$CLUBS); + if($posA && $posB) + if($posA <= $posB) return 1; - } - } + else + return 0; + + /* both spades? */ + $posA = pos_array($a,$SPADES); + $posB = pos_array($b,$SPADES); + if($posA && $posB) + if($posA <= $posB) + return 1; + else + return 0; + + /* both hearts? */ + $posA = pos_array($a,$HEARTS); + $posB = pos_array($b,$HEARTS); + if($posA && $posB) + if($posA <= $posB) + return 1; + else + return 0; + + /* both diamonds? */ + $posA = pos_array($a,$DIAMONDS); + $posB = pos_array($b,$DIAMONDS); + if($posA && $posB) + if($posA <= $posB) + return 1; + else + return 0; + + /* not the same suit and no trump: a wins */ + return 1; + } } } @@ -219,12 +157,25 @@ function get_winner($p,$mode) $c4 = $p[4]; /* find out who won */ + + /* first card is better than all the rest */ if( compare_cards($c1,$c2,$mode) && compare_cards($c1,$c3,$mode) && compare_cards($c1,$c4,$mode) ) - return 1; + return 1; + + /* second card is better than first and better than the rest */ if( !compare_cards($c1,$c2,$mode) && compare_cards($c2,$c3,$mode) && compare_cards($c2,$c4,$mode) ) return 2; - if( !compare_cards($c1,$c3,$mode) && !compare_cards($c2,$c3,$mode) && compare_cards($c3,$c4,$mode) ) - return 3; + + /* third card is better than first card and better than last */ + if( !compare_cards($c1,$c3,$mode) && compare_cards($c3,$c4,$mode) ) + /* if second card is better than first, third card needs to be even better */ + if( !compare_cards($c1,$c2,$mode) && !compare_cards($c2,$c3,$mode) ) + return 3; + /* second is worse than first, e.g. not following suite */ + else if (compare_cards($c1,$c2,$mode) ) + return 3; + + /* non of the above */ return 4; } @@ -246,7 +197,7 @@ function count_nines($cards) function check_wedding($cards) { - if( in_array("3",$cards) && in_array("2",$cards) ) + if( in_array("3",$cards) && in_array("4",$cards) ) return 1; return 0; @@ -461,4 +412,117 @@ function return_timezone($offset) return $zone; } +function have_suit($cards,$c) +{ + global $TRUMP,$DIAMONDS,$HEARTS,$CLUBS,$SPADES; + $suit = array(); + + if(in_array($c,$TRUMP)) + $suit = $TRUMP; + else if(in_array($c,$CLUBS)) + $suit = $CLUBS; + else if(in_array($c,$SPADES)) + $suit = $SPADES; + else if(in_array($c,$HEARTS)) + $suit = $HEARTS; + else if(in_array($c,$DIAMONDS)) + $suit = $DIAMONDS; + + foreach($cards as $card) + { + if(in_array($card,$suit)) + return 1; + } + + return 0; +} + +function same_type($card,$c) +{ + global $TRUMP,$DIAMONDS,$HEARTS,$CLUBS,$SPADES; + $suit = ""; + + /* figure out what kind of card c is */ + if(in_array($c,$TRUMP)) + $suit = $TRUMP; + else if(in_array($c,$CLUBS)) + $suit = $CLUBS; + else if(in_array($c,$SPADES)) + $suit = $SPADES; + else if(in_array($c,$HEARTS)) + $suit = $HEARTS; + else if(in_array($c,$DIAMONDS)) + $suit = $DIAMONDS; + + /* card is the same suid return 1 */ + if(in_array($card,$suit)) + return 1; + + return 0; +} + +function set_gametype($gametype) +{ + global $TRUMP,$DIAMONDS,$HEARTS,$CLUBS,$SPADES; + + switch($gametype) + { + case "normal": + case "trump": + case "silent": + $TRUMP = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', + '17','18','19','20','21','22','23','24','25','26'); + $DIAMONDS = array(); + $CLUBS = array('27','28','29','30','31','32','33','34'); + $SPADES = array('35','36','37','38','39','40','41','42'); + $HEARTS = array('43','44','45','46','47','48'); + break; + case "queen": + $TRUMP = array('3','4','5','6','7','8','9','10'); + $CLUBS = array('27','28','29','30','31','32','11','12','33','34'); + $SPADES = array('35','36','37','38','39','40','13','14','41','42'); + $HEARTS = array('43','44', '1', '2','45','46','15','16','47','48'); + $DIAMONDS = array('19','20','21','22','23','24','17','18','25','26'); + break; + case "jack": + $TRUMP = array('11','12','13','14','15','16','17','18'); + $CLUBS = array('27','28','29','30','31','32','3', '4','33','34'); + $SPADES = array('35','36','37','38','39','40','5', '6','41','42'); + $HEARTS = array('43','44', '1', '2','45','46','7', '8','47','48'); + $DIAMONDS = array('19','20','21','22','23','24','9','10','25','26'); + break; + case "trumpless": + $TRUMP = array(); + $CLUBS = array('27','28','29','30','31','32','3', '4','11','12','33','34'); + $SPADES = array('35','36','37','38','39','40','5', '6','13','14','41','42'); + $HEARTS = array('43','44', '1', '2','45','46','7', '8','15','16','47','48'); + $DIAMONDS = array('19','20','21','22','23','24','9','10','17','18','25','26'); + break; + case "club": + $TRUMP = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', + '17','18','27','28','29','30','31','32','33','34'); + $CLUBS = array(); + $SPADES = array('35','36','37','38','39','40','41','42'); + $HEARTS = array('43','44','45','46','47','48'); + $DIAMONDS = array('19','20','21','22','23','24','25','26'); + break; + case "spade": + $TRUMP = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', + '17','18','35','36','37','38','39','40','41','42'); + $CLUBS = array('27','28','29','30','31','32','33','34'); + $SPADES = array(); + $HEARTS = array('43','44','45','46','47','48'); + $DIAMONDS = array('19','20','21','22','23','24','25','26'); + break; + case "heart": + $TRUMP = array('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16', + '17','18','43','44','45','46','47','48'); + $CLUBS = array('27','28','29','30','31','32','33','34'); + $SPADES = array('35','36','37','38','39','40','41','42'); + $HEARTS = array(); + $DIAMONDS = array('19','20','21','22','23','24','25','26'); + break; + } +} + ?> \ No newline at end of file diff --git a/index.php b/index.php index 550144f..f8c7a3a 100644 --- a/index.php +++ b/index.php @@ -7,7 +7,6 @@ include_once("db.php"); /* database only */ include_once("functions.php"); /* the rest */ DB_open(); - output_header(); /* check if we want to start a new game */ @@ -47,10 +46,10 @@ else if( myisset("PlayerA", "PlayerB","PlayerC","PlayerD" )) if(myisset("followup") ) { $followup= $_REQUEST["followup"]; - mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', NULL, NULL,'pre','$followup' ,NULL)"); + mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', 'normal', NULL,'1','pre','$followup' ,NULL)"); } else - mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', NULL, NULL,'pre', NULL ,NULL)"); + mysql_query("INSERT INTO Game VALUES (NULL, NULL, '$randomNRstring', 'normal', NULL,'1','pre', NULL ,NULL)"); $game_id = mysql_insert_id(); /* create hash */ @@ -127,6 +126,7 @@ else if(myisset("me")) $gameid = DB_get_gameid_by_hash($me); $myname = DB_get_name_by_hash($me); $mystatus = DB_get_status_by_hash($me); + $mypos = DB_get_pos_by_hash($me); switch($mystatus) { @@ -177,8 +177,8 @@ else if(myisset("me")) break; case 'check': - echo "no checking at the moment... you need to play a normal game.". - " At the moment you need to reload this page to finish the setup."; + echo "checking for solo...
if you have a wedding or poverty you need to play a normal game,sorry...
". + " At the moment you need to reload this page to finish the setup.
"; if(!myisset("solo","wedding","poverty","nines") ) { /* all these variables have a pre-selected default, @@ -188,13 +188,28 @@ else if(myisset("me")) } else { + /* check if this sickness needs to be handled first */ + $gametype = DB_get_gametype_by_gameid($gameid); + $startplayer = DB_get_startplayer_by_gameid($gameid); + if( $_REQUEST["solo"]!="No") { DB_set_solo_by_hash($me,$_REQUEST["solo"]); DB_set_sickness_by_hash($me,"solo"); + echo "Seems like you want to play a ".$_REQUEST["solo"]." solo. Got it.\n"; + + if($gametype == "solo" && $startplayer<$mypos) + {}/* do nothing */ + else + { + DB_set_gametype_by_gameid($gameid,"solo"); + DB_set_startplayer_by_gameid($gameid,$mypos); + DB_set_solo_by_gameid($gameid,$_REQUEST["solo"]); + }; } else if($_REQUEST["wedding"] == "yes") { + /* TODO: add silent solo somewhere*/ echo "wedding was chosen
\n"; DB_set_sickness_by_hash($me,"wedding"); } @@ -209,14 +224,14 @@ else if(myisset("me")) DB_set_sickness_by_hash($me,"nines"); } } + DB_set_hand_status_by_hash($me,'poverty'); - + /* check all players and set game to final result, e.g. solo, wedding, povert, redeal */ - - /* reset solo, etc from players who did say something, but it didn't matter? */ + break; case 'poverty': - /* here we need to check if there is a solo or some other form o sickness. + /* here we need to check if there is a solo or some other form of sickness. * If so, which one counts * set that one in the Game table, delete other ones form Hand table * tell people about it. @@ -246,6 +261,24 @@ else if(myisset("me")) * in case of 'play' there is a break later that skips the last part */ + /* figure out what kind of game we are playing, + * set the global variables $TRUMP,$DIAMONDS,$HEARTS,$CLUBS,$SPADES + * accordingly + */ + + $gametype = DB_get_gametype_by_gameid($gameid); + $GT = $gametype; + if($gametype=="solo") + { + $gametype = DB_get_solo_by_gameid($gameid); + $GT = $gametype." ".$GT; + } + else + $gametype="normal"; + + set_gametype($gametype); + + /* display useful things in divs */ /* display local time */ @@ -263,7 +296,7 @@ else if(myisset("me")) }; echo "\n\n"; - display_status(); + display_status($GT); /* display links to the users status page */ $result = mysql_query("SELECT email,password from User WHERE id='$myid'" ); @@ -324,6 +357,7 @@ else if(myisset("me")) $play = array(); /* needed to calculate winner later */ $seq = 1; $pos = 0; + $firstcard = ""; /* first card in a trick */ echo "\n