diff options
author | arun <arun@nubati.net> | 2007-01-08 09:16:20 +0000 |
---|---|---|
committer | arun <arun> | 2007-01-08 09:16:20 +0000 |
commit | f91a22b698415eacda6af7403814caa6f34ad7e5 (patch) | |
tree | 9c1ffdca2fb8738a41f4fddb062a143481bce5cc | |
parent | a260a1abdfb22b421fbb4305cf2a0c8d57b89c9e (diff) | |
download | e-DoKo-f91a22b698415eacda6af7403814caa6f34ad7e5.tar.gz e-DoKo-f91a22b698415eacda6af7403814caa6f34ad7e5.tar.bz2 e-DoKo-f91a22b698415eacda6af7403814caa6f34ad7e5.zip |
FEATURE: added solo and now you also can only play cards that are valid on a trick
-rw-r--r-- | create_database.sql | 3 | ||||
-rw-r--r-- | db.php | 55 | ||||
-rw-r--r-- | functions.php | 338 | ||||
-rw-r--r-- | index.php | 105 | ||||
-rw-r--r-- | 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, @@ -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 @@ -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...<br /> if you have a wedding or poverty you need to play a normal game,sorry...<br />". + " At the moment you need to reload this page to finish the setup.<br />"; 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<br />\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 "</table>\n</div>\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<ul class=\"tricks\">\n"; echo " <li> Hello $myname! History: </li>\n"; @@ -338,20 +372,27 @@ else if(myisset("me")) /* save card to be able to find the winner of the trick later */ $play[$pos] = $r[0]; - if($trick!=$lasttrick && $seq==1) - { - /* start of an old trick? */ - echo " <li onclick=\"hl('$trickNR');\"><a href=\"#\">Trick $trickNR</a>\n". - " <div class=\"trick\" id=\"trick".$trickNR."\">\n". - " <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n"; - } - else if($trick==$lasttrick && $seq==1) + if($seq==1) { - /* start of a last trick? */ - echo " <li onclick=\"hl('$trickNR');\"><a href=\"#\">Current Trick</a>\n". - " <div class=\"trick\" id=\"trick".$trickNR."\">\n". - " <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n"; - } + /* first card in a trick, output some html */ + if($trick!=$lasttrick) + { + /* start of an old trick? */ + echo " <li onclick=\"hl('$trickNR');\"><a href=\"#\">Trick $trickNR</a>\n". + " <div class=\"trick\" id=\"trick".$trickNR."\">\n". + " <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n"; + } + else if($trick==$lasttrick) + { + /* start of a last trick? */ + echo " <li onclick=\"hl('$trickNR');\"><a href=\"#\">Current Trick</a>\n". + " <div class=\"trick\" id=\"trick".$trickNR."\">\n". + " <img class=\"arrow\" src=\"pics/arrow".($pos-1).".png\" alt=\"table\" />\n"; + }; + + /* remember first card, so that we are able to check, what cards can be played */ + $firstcard = $r[0]; + }; /* display card */ echo " <div class=\"card".($pos-1)."\">\n"; @@ -381,8 +422,9 @@ else if(myisset("me")) /* whos turn is it? */ if($seq==4) { - $winner = get_winner($play,"normal"); /* returns the position */ + $winner = get_winner($play,$gametype); /* returns the position */ $next = $winner; + $firstcard = ""; /* new trick, no first card */ } else { @@ -455,7 +497,7 @@ else if(myisset("me")) if($sequence==4) { $play = DB_get_cards_by_trick($trickid); - $winner = get_winner($play,"normal"); /* returns the position */ + $winner = get_winner($play,$gametype); /* returns the position */ $next = $winner; } else @@ -497,8 +539,19 @@ else if(myisset("me")) echo "Hello ".$myname.", it's your turn! <br />\n"; echo "Your cards are: <br />\n"; echo "<form action=\"index.php?me=$me\" method=\"post\">\n"; + + /* do we have to follow suit? */ + $followsuit = 0; + if(have_suit($mycards,$firstcard)) + $followsuit = 1; + foreach($mycards as $card) - display_link_card($card); + { + if($followsuit && !same_type($card,$firstcard)) + display_card($card); + else + display_link_card($card); + } echo "<br />\nA short comments:<input name=\"comment\" type=\"text\" size=\"30\" maxlength=\"50\" />\n"; echo "<input type=\"hidden\" name=\"me\" value=\"$me\" />\n"; @@ -2,10 +2,10 @@ /* functions which only ouput html */ -function display_status() +function display_status($gametype) { echo "<div class=\"info\">"; - echo " is someone playing solo, etc?"; + echo " Gametype: $gametype"; echo "</div>\n"; return; @@ -142,7 +142,7 @@ function check_for_sickness($me,$mycards) <?php - echo "wedding?"; + echo "wedding?"; if(check_wedding($mycards)) { echo " yes<input type=\"radio\" name=\"wedding\" value=\"yes\" checked=\"checked\" />"; |