From bae8dd0032b45f632e85f12693debd2f03603f07 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 21 Dec 2006 20:20:42 +0000 Subject: [PATCH] fixed a lot of bugs, started to work on solos, moved some stuff to output.php --- db.php | 5 +- functions.php | 139 +++++++++++++++++++++++++++++++++-------- index.php | 170 +++++++++++++++++++------------------------------- output.php | 72 +++++++++++++++++++-- 4 files changed, 246 insertions(+), 140 deletions(-) diff --git a/db.php b/db.php index 4b18d9c..254c460 100644 --- a/db.php +++ b/db.php @@ -200,9 +200,10 @@ function DB_set_hand_status_by_hash($hash,$status) return; } -function DB_get_hand_status_by_userid($id) +function DB_get_hand_status_by_userid_and_gameid($uid,$gid) { - $result = mysql_query("SELECT status FROM Hand WHERE user_id=".DB_quote_smart($id)); + $result = mysql_query("SELECT status FROM Hand WHERE user_id=".DB_quote_smart($uid). + " AND game_id=".DB_quote_smart($gid)); $r = mysql_fetch_array($result,MYSQL_NUM); if($r) diff --git a/functions.php b/functions.php index 7cc2826..c4305b5 100644 --- a/functions.php +++ b/functions.php @@ -14,28 +14,123 @@ function mymail($To,$Subject,$message) return; } -function is_trump($c) { return (($c<27) ? 1:0);} -function is_club($c) { return (in_array($c,array('27','28','29','30','31','32','33','34')));} -function is_spade($c) { return (in_array($c,array('35','36','37','38','39','40','41','42')));} -function is_heart($c) { return (in_array($c,array('43','44','45','46','47','48')));} +function myisset() +{ + /* returns 1 if all names passed as args are defined by a GET or POST statement, + * else it returns 0 + */ + + $ok = 1; + $args = func_get_args(); + + foreach($args as $arg) + { + $ok = $ok * isset($_REQUEST[$arg]); + /* echo "$arg: ok = $ok
"; + */ + } + return $ok; +} -function compare_cards($a,$b,$mode) +function is_trump($c,$game) +{ + 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; + } +} + +function is_same_suite($c1,$c2,$game) +{ + 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; + } +} + +function compare_cards($a,$b,$game) { /* if "a" is higher than "b" return 1, else 0, "a" being the card first played */ - /* don't think we need this */ + /* first map all cards to the odd number, + * this insure that the first card wins the trick + * if they are the same card + */ if( $a/2 - (int)($a/2) != 0.5) $a--; if( $b/2 - (int)($b/2) != 0.5) $b--; - switch($mode) + switch($game) { case "trumpless": break; case "jack": break; case "queen": + if(is_trump($a,$game) && $a<=$b) + return 1; + else if(is_trump($a,$game)) + 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 */ + return 1; + } + } break; case "trump": break; @@ -46,35 +141,25 @@ function compare_cards($a,$b,$mode) case "heart": break; case "normal": - /* first map all cards to the odd number */ - if(is_trump($a) && $a<=$b) + 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) && $a>$b) + else if(is_trump($a,$game)) return 0; else { /*$a is not a trump */ - if(is_trump($b)) + if(is_trump($b,$game)) return 0; else { - /* both clubs? */ - if( is_club($a) && is_club($b)) - if($a<=$b) - return 1; - else - return 0; - /* both spade? */ - if( is_spade($a) && is_spade($b)) - if($a<=$b) - return 1; - else - return 0; - /* both heart? */ - if( is_heart($a) && is_heart($b)) + if(is_same_suite($a,$b,$game)) if($a<=$b) return 1; else return 0; + + /* not the same suit and no trump: a wins */ return 1; } } @@ -92,9 +177,9 @@ function get_winner($p,$mode) /* find out who won */ if( compare_cards($c1,$c2,$mode) && compare_cards($c1,$c3,$mode) && compare_cards($c1,$c4,$mode) ) return 1; - if( compare_cards($c2,$c3,$mode) && compare_cards($c2,$c4,$mode) ) + if( !compare_cards($c1,$c2,$mode) && compare_cards($c2,$c3,$mode) && compare_cards($c2,$c4,$mode) ) return 2; - if( compare_cards($c3,$c4,$mode) ) + if( !compare_cards($c1,$c3,$mode) && !compare_cards($c2,$c3,$mode) && compare_cards($c3,$c4,$mode) ) return 3; return 4; } diff --git a/index.php b/index.php index c849f69..29b3eb1 100644 --- a/index.php +++ b/index.php @@ -1,26 +1,21 @@ \n"; - echo "perhaps the game has been cancled."; + echo "perhaps the game has been cancled, check by login in here."; exit(); } @@ -141,7 +135,7 @@ else if(isset($_REQUEST["me"])) DB_set_hand_status_by_hash($me,'init'); break; case 'init': - if( !isset($_REQUEST["in"]) || !isset($_REQUEST["update"])) + if( !myisset("in","update") ) { DB_set_hand_status_by_hash($me,'start'); echo "you need to answer both question"; @@ -183,17 +177,14 @@ else if(isset($_REQUEST["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."; - if(!isset($_REQUEST["solo"]) || - !isset($_REQUEST["wedding"]) || - !isset($_REQUEST["poverty"]) || - !isset($_REQUEST["nines"]) ) + 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."; + if(!myisset("solo","wedding","poverty","nines") ) { - DB_set_hand_status_by_hash($me,'init'); - /* problem: by setting it back to init, variables "in" and "update" are - * not set, so the player will be send back to the start, after seeing his hand - */ - echo "you need to fill out the form"; + /* all these variables have a pre-selected default, + * so we should never get here, + * unless a user tries to cheat ;) */ + echo "something went wrong...please contact the admin."; } else { @@ -237,17 +228,23 @@ else if(isset($_REQUEST["me"])) /* check if the game can start */ $userids = DB_get_all_userid_by_gameid($gameid); - $done=1; + $ok=1; foreach($userids as $user) - if(DB_get_hand_status_by_userid($user)!='play') - $done=0; + if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='play') + $ok=0; - if($done) + if($ok) DB_set_game_status_by_gameid($gameid,'play'); break; case 'play': - case 'gameover': /*both entries here, so that the tricks are visible for both in case of 'play' there is a break later that skips the last part*/ + case 'gameover': + /* both entries here, so that the tricks are visible for both. + * in case of 'play' there is a break later that skips the last part + */ + + /* display useful things in divs */ + /* display local time */ echo "
\n Local times:"; $users = array(); @@ -255,35 +252,35 @@ else if(isset($_REQUEST["me"])) foreach($users as $user) { $offset = DB_get_user_timezone($user); - $zone = return_timezone($offset); + $zone = return_timezone($offset); date_default_timezone_set($zone); - $name = DB_get_name_by_userid($user); + $name = DB_get_name_by_userid($user); echo "\n"; }; echo "
$name ".date("Y-m-d H:i:s")."
\n
\n"; + display_status(); - /* display links to other games */ - echo "
\n"; + /* display links to the users status page */ $result = mysql_query("SELECT email,password from User WHERE id='$myid'" ); - $r = mysql_fetch_array($result,MYSQL_NUM); - echo "
\n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo "
\n"; - echo "
\n"; - + $r = mysql_fetch_array($result,MYSQL_NUM); + output_link_to_user_page($r[0],$r[1]); + display_news(); + /* end display useful things*/ + + /* has the game started? No, then just wait here...*/ $gamestatus = DB_get_game_status_by_gameid($gameid); if($gamestatus == 'pre') { echo "you need to wait for the others...
"; - break; + break; /* not sure this works... the idea is that you can + * only play a card after everyone is ready to play */ } - /* get everythin relevant to display the tricks */ + + /* get everything relevant to display the tricks */ $result = mysql_query("SELECT Hand_Card.card_id as card,". " User.fullname as name,". " Hand.position as position,". @@ -388,7 +385,7 @@ else if(isset($_REQUEST["me"])) $myturn = 0; /* do we want to play a card? */ - if(isset($_REQUEST["card"]) && $myturn) + if(myisset("card") && $myturn) { $card = $_REQUEST["card"]; $handid = DB_get_handid_by_hash($me); @@ -412,7 +409,7 @@ else if(isset($_REQUEST["me"])) $playid = DB_play_card($trickid,$handcardid,$sequence); /*check for coment */ - if(isset($_REQUEST["comment"])) + if(myisset("comment")) { DB_insert_comment($_REQUEST["comment"],$playid,$myid); }; @@ -430,11 +427,11 @@ else if(isset($_REQUEST["me"])) $mystatus='gameover'; } - /* if all players are done, set game status also to game over */ + /* if all players are done, set game status to game over */ $userids = DB_get_all_userid_by_gameid($gameid); $done=1; foreach($userids as $user) - if(DB_get_hand_status_by_userid($user)!='gameover') + if(DB_get_hand_status_by_userid_and_gameid($user,$gameid)!='gameover') $done=0; if($done) @@ -474,7 +471,7 @@ else if(isset($_REQUEST["me"])) echo "couldn't find card
\n"; } } - else if(isset($_REQUEST["card"]) && !$myturn ) + else if(myisset("card") && !$myturn ) { echo "please wait until it is your turn!
\n"; } @@ -483,19 +480,18 @@ else if(isset($_REQUEST["me"])) sort($mycards); echo "
\n"; - if($myturn && !isset($_REQUEST["card"])) + if($myturn && !myisset("card")) { echo "Hello ".$myname.", it's your turn!
\n"; echo "Your cards are:
\n"; echo "
\n"; foreach($mycards as $card) display_link_card($card); -?> -
A short comments: - - -
- \nA short comments:\n"; + echo "\n"; + echo "\n"; + echo "\n"; } else if($mystatus=='play') { @@ -508,7 +504,7 @@ else if(isset($_REQUEST["me"])) /* check if we need to set status to 'gameover' is done during playing of the card */ if($mystatus=='play') break; - /* the following happens only when the gamestatus is 'gameover' */ + /* the following happens only when the gamestatus is 'gameover' */ /* check if game is over, display results */ if(DB_get_game_status_by_gameid($gameid)=='play') { @@ -520,16 +516,7 @@ else if(isset($_REQUEST["me"])) /* suggest a new game with the same people in it, just rotated once */ $names = DB_get_all_names_by_gameid($gameid); - - echo "Do you want to continue playing?(This will start a new game, with the next person as dealer.)\n"; - echo "
\n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo " \n"; - echo "
\n"; + output_ask_for_new_game($names[1],$names[2],$names[3],$names[0],$gameid); } break; default: @@ -538,7 +525,7 @@ else if(isset($_REQUEST["me"])) exit(); } /* user status page */ - else if(isset($_REQUEST["email"]) && isset($_REQUEST["password"])) + else if(myisset("email","password")) { /* test id and password, should really be done in one step */ $email = $_REQUEST["email"]; @@ -576,6 +563,7 @@ else if(isset($_REQUEST["me"])) foreach ($names as $name) echo "$name
\n"; echo "

\n"; + echo "

Want to start a new game? remember 4 names from the list above and visit ". "this page.

"; } @@ -586,42 +574,12 @@ else if(isset($_REQUEST["me"])) exit(); } /* page for registration */ -else if(isset($_REQUEST["register"]) ) +else if(myisset("register") ) { - echo "IMPORTANT: passwords are going over the net as clear text, so pick an easy password. No need to pick anything complicated here ;)

"; - echo "TODO: convert timezone into a menu
\n"; - echo "TODO: figure out a way to handle passwrods
\n"; -?> -
-
- Register - - - - - - - - - - - - - - - -
- -
-
-
-\n"; + echo "
\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "
\n"; + echo "
\n"; + + return; +} + +function output_register() +{ + echo "IMPORTANT: passwords are going over the net as clear text, so pick an easy password. No need to pick anything complicated here ;)

"; + echo "TODO: convert timezone into a menu
\n"; + echo "TODO: figure out a way to handle passwrods
\n"; + ?> +
+
+ Register + + + + + + + + + + + + + + + +
+ +
+
+
+\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo "\n"; + + return; +} function output_form_for_new_game() { @@ -69,7 +129,7 @@ function check_for_sickness($me,$mycards) do you want to play solo? "; + echo " yes"; echo " no
\n"; } else @@ -96,7 +156,7 @@ function check_for_sickness($me,$mycards) echo "do you have poverty?"; if(count_trump($mycards)<4) { - echo " yes"; + echo " yes"; echo " no
\n"; } else @@ -107,7 +167,7 @@ function check_for_sickness($me,$mycards) echo "do you have too many nines?"; if(count_nines($mycards)>4) { - echo " yes"; + echo " yes"; echo " no
\n"; } else @@ -143,7 +203,7 @@ function check_want_to_play($me) return; } -function home_page() +function output_home_page() { ?>

If you want to play a game of Doppelkopf, you found the right place ;)

@@ -213,6 +273,8 @@ function output_header() return; } + + function output_footer() { echo "\n"; -- 2.34.1