服务热线
1888888888
作者:文煞发布时间:2024-05-02分类:PHP笔记浏览:203
好几天没有更新了,主要是不知道写什么?那么今天我就来分享一个我用PHP写的一个网页小游戏吧。该小游戏使用PHP和html混编来完成的,代码看起来有点乱,太多判断句,一不小心,把我自己都能搞蒙圈!没办法,为了方便分享代码,我只好写到一个PHP脚本里面,直接贴出完整代码,就可以给喜欢该代码的朋友直接使用了。
下面我们先分享代码,以供大家研究参考!本代码大概400多行,脚本文件大小大概是12KB。代码涉及了读取和写入TXT文件、数组排序、SESSION、数组和JSON数据的转换、数组循环输出、if...else语句、get数据与post数据的使用、自定义函数和switch()函数的使用等。如果你想要看懂该代码,还是很容易的,但是要想理解代码逻辑那估计得用点心了,毕竟我自己都得慢慢分析!也可能因为自学的PHP,没有系统的学些过PHP课程,导致我写代码的习惯不是太好吧,到底不够精通和专业。然而我觉得,小白学习PHP,看我写的代码,应该更容易接受一点!
代码运行效果图片预览
index.php:
<?php session_start(); // 检查变量是否已设置,未设置则设为默认值 function initialize_game_variable() { $_SESSION['lx'] = 0; $_SESSION['bosshp'] = 500; $_SESSION['playerhp'] = 100; $_SESSION['playerpf'] = 0; $_SESSION['dui'] = 0; $_SESSION['cuo'] = 0; $_SESSION['message'] = 0; } // 初始化游戏变量,将所有游戏变量重置为默认值 if (!isset($_GET['page']) || $_GET['page'] == '1') { initialize_game_variable(); } if (isset($_GET['page']) > 0 and $_SESSION['bosshp'] < 0) { echo "<script>alert('挑战成功!'); window.location.assign('index.php');</script>"; initialize_game_variable(); exit; } if (isset($_GET['page']) > 0 and $_SESSION['playerhp'] < 0) { echo "<script>alert('挑战失败!'); window.location.assign('index.php');</script>"; initialize_game_variable(); exit; } // 生成数学题目 function generate_question() { $operators = array('+', '-', '*'); $operator = $operators[array_rand($operators)]; $num1 = rand(1, 100); $num2 = rand(1, 100); switch ($operator) { case '+': $result = $num1 + $num2; break; case '-': $result = $num1 - $num2; break; case '*': $result = $num1 * $num2; break; default: return generate_question(); } $_SESSION['as'] = $result; return "$num1 $operator $num2"; } function game_logs($data) { $time = time(); $file = 'list.txt'; file_put_contents($file, $data); } class FileProcessor { private $file; public function __construct($file) { $this->file = $file; } public function processData() { $data = file_get_contents($this->file); $lines = explode("\n", $data); $sortedArray = array(); foreach ($lines as $line) { $json = json_decode($line, true); if ($json) { $sortedArray[] = $json; } } usort($sortedArray, function($a, $b) { return $b["gamepf"] - $a["gamepf"]; }); return $sortedArray; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>数学快问快答挑战</title> <style> body{ background-color: #673AB7; font-family: Arial, san-serif; } .main{ max-width: 800px; margin: auto; background-color: #FFF; padding: 20px; border-radius: 10px; } .main h1 { text-align: center; font-size: 2em; color: #673AB7; } .intro{ background-color: #512DA8; color: #FFF; padding: 10px; border-radius: 5px; margin-top: 50px; font-size: 0.8em; } .userinfo{ background-color: #EDE7F6; color: #512DA8; padding: 10px; border-radius: 5px; margin-top: 20px; font-size: 0.9em; } .userinfo form{ display: inline-block; margin-top: 10px; } .userinfo input[type=text], .userinfo input[type=submit]{ font-size: 1.2em; padding: 2px 5px; border-radius: 3px; border: 1px solid #512DA8; } .game-body{ padding: 50px; font-size: 1.5em; color: #512DA8; } .game-body form{ margin-top: 20px; } .game-body input[type=text], .game-body input[type=submit]{ font-size: 1.3em; padding: 2px 5px; border-radius: 3px; border: 1px solid #512DA8; } .message{ background-color: #BA68C8; color: #FFF; padding: 10px; border-radius: 5px; margin-top: 20px; font-size: 1.1em; } .health-bar { width: 100%; height: 20px; background: linear-gradient(to right, red 100%); position: relative; border: 1px solid #000; border-radius: 5px; margin: 20px auto; } .health-bar::before { content: ""; display: block; height: 100%; width: var(--health); background-color: rgba(255, 0, 0, 0.8); border-radius: 5px; } .health-text { text-align: center; font-weight: bold; margin-top: 10px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .button { display: inline-block; padding: 10px 20px; background-color: #00B0F0; color: yellow; font-size: 1.5em; border: none; border-radius: 10px; cursor: pointer; text-decoration: none; text-align: center; } .button a { color: yellow; text-decoration: none; display: inline-block; width: 100%; height: 100%; } </style> </head> <body> <div> <h1>数学快问快答挑战游戏</h1> <div> <?php if (isset($_SESSION['username'])) { echo '<span style="font-size: 1.5em;">'.$_SESSION['username'].':</span><span style="font-size: 1.2em;">欢迎加入数学快问快答挑战游戏!当前分数:'.$_SESSION['playerpf'].'</span>'; $bossHealthPercentage = ($_SESSION['bosshp'] / 500) * 100; $playerHealthPercentage = ($_SESSION['playerhp'] / 100) * 100; echo <<<HTML <table width="100%"> <tbody> <tr> <th valign="left" style="border-color: rgb(221, 221, 221);" width="100">BOSS:</th> <td valign="left" style="border-color: rgb(221, 221, 221);" width="100%"> <div style="--health: {$bossHealthPercentage}%; ">HP值:{$_SESSION['bosshp']}/500</div> </td> </tr> <tr> <th valign="left" style="border-color: rgb(221, 221, 221);" width="100">{$_SESSION['username']}</th> <td valign="left" style="border-color: rgb(221, 221, 221);" width="100%"> <div style="--health: {$playerHealthPercentage}%; ">HP值:{$_SESSION['playerhp']}/100</div> </td> </tr> </tbody> </table> HTML; if($_SESSION['message'] != 0){ echo '<p><strong>上次挑战结果:</strong></p >'; echo '<div>'.$_SESSION['message'].'</div>'; initialize_game_variable(); } }else { if (!isset($_POST['username'])) { echo <<<HTML <form id="joinForm" action="index.php" method="POST"> 请输入您的名字:<input type="text" name="username" required><br> <input type="submit" value="提交"> </form> HTML; } else { $_SESSION['username'] = $_POST['username']; echo '<span style="font-size: 1.5em;">'.$_SESSION['username'].':</span><span style="font-size: 1.2em;">欢迎加入数学快问快答挑战游戏!</span>'; } } ?> </div><div> <?php if (!isset($_GET['page'])) { if (isset($_SESSION['username'])) { echo '<center><div><a href="index.php?page=1" target="_self">请点击此处开始挑战</a></div></center>'; } else { echo '必须输入用户名,才可以挑战!'; } } if (isset($_GET['page']) && isset($_SESSION['username'])) { if (isset($_POST['as'])) { $post_as = $_POST['as']; $session_as = $_SESSION['as']; if ($post_as == $session_as) { $_SESSION['lx']++; $_SESSION['dui'] = $_SESSION['dui'] + 1; $diff = time() - $_POST['time']; $decimal = round($diff / 1000, 3); $bcpf = 500 * ($_SESSION['lx'] + $decimal); $bcpf = round($bcpf); $_SESSION['playerpf'] += $bcpf; $_SESSION['bosshp'] -= 10 + $_SESSION['lx'] * 5; if ($_SESSION['bosshp'] <= 0) { $annums = $_SESSION['dui'] + $_SESSION['cuo']; $_SESSION['playerpf'] = $_SESSION['playerpf'] *($_SESSION['dui'] / $annums); $_SESSION['playerpf'] = round($_SESSION['playerpf']); $message .= '恭喜您,尊敬的'.$_SESSION['username'].',您的本次挑战完美成功!您的本次挑战分:<span>' . $_SESSION['playerpf']. '</span>'; $message .= '<br/>你本次一共答题:'.$annums.'道,对:<span>'.$_SESSION['dui'].'</span>道,错:<span>'.$_SESSION['cuo'].'</span>道!'; $gamelog = array('username' => $_SESSION['username'], 'gamepf' => $_SESSION['playerpf'], 'time' => time()); $fileProcessor = new FileProcessor('list.txt'); $sortedData = $fileProcessor->processData(); array_push($sortedData, $gamelog); // 按照'gamepf'值对$sortedData数组进行排序 usort($sortedData, function($a, $b) { return $b['gamepf'] - $a['gamepf']; }); $x = 0; $finalData = ""; foreach ($sortedData as &$data) { $x++; if ($x <= 100 && $x > 0) { $finalData .= json_encode($data)."\n"; } } if ($x == 0) { $finalData .= json_encode($gamelog); } game_logs($finalData); initialize_game_variable(); $_SESSION['message'] = $message; echo "<script>alert('挑战成功!'); window.location.assign('index.php');</script>"; exit; } else { $message = '回答正确!请继续挑战下一题!当前挑战分:' . $bcpf; $url = 'index.php?page=' . ($_GET['page'] + 1); echo "<script>alert('$message'); window.location.assign('$url');</script>"; exit; } } else { $_SESSION['playerpf'] -= 1000; $_SESSION['playerpf'] = round($_SESSION['playerpf']); $_SESSION['lx'] = 0; $_SESSION['playerhp'] -= 10; $_SESSION['cuo'] = $_SESSION['cuo'] + 1; if ($_SESSION['playerhp'] <= 0) { $annums = $_SESSION['dui'] + $_SESSION['cuo']; $message .= '很抱歉,尊敬的:'.$_SESSION['username'].',你此次挑战失败了!请继续努力'; $message .= '<br/>你本次一共答题:<span>'.$annums.'</span>道,对:<span>'.$_SESSION['dui'].'</span>道,错:<span>'.$_SESSION['cuo'].'</span>道!'; initialize_game_variable(); $_SESSION['message'] = $message; echo "<script>alert('挑战失败!'); window.location.assign('index.php');</script>"; exit; } else { $message = '回答错误!请继续挑战下一题!本次扣除积分:1000'; $url = 'index.php?page=' . ($_GET['page'] + 1); echo "<script>alert('$message'); window.location.assign('$url');</script>"; exit; } } $_POST = array(); } if ($_SESSION['bosshp'] > 0 && $_SESSION['playerhp'] > 0) { echo ''; echo '<center>'.generate_question().'等于多少?'; echo '<form id="joinForm" action="index.php?page=' . ($_GET['page']) . '" method="POST">'; echo '<input type="text" name="as" required>'; echo '<input type="hidden" name="time" value="'.time().'">'; echo '<input type="submit" value="提交">'; echo '</form></center>'; } } ?> </div> <div> <table width="100%"> <thead> <tr> <th style="border-color: rgb(221, 221, 221);" width="10%"> 排序<br/> </th> <th style="border-color: rgb(221, 221, 221);" width="35%"> 玩家 </th> <th style="border-color: rgb(221, 221, 221);" width="25%"> 评分 </th> <th style="border-color: rgb(221, 221, 221);" width="30%"> 挑战时间 </th> </tr> </thead> <tbody> <?php $fileProcessor = new FileProcessor('list.txt'); $sortedData = $fileProcessor->processData(); $i = 0; foreach ($sortedData as $value) { $i++; echo '<tr>'; echo '<td width="10%" style="border-color: rgb(251, 213, 181);">' .$i . '</td>'; echo '<td width="35%" style="border-color: rgb(251, 213, 181);">' .$value['username'] . '</td>'; echo '<td width="25%" style="border-color: rgb(251, 213, 181);">' .$value['gamepf'] . '</td>'; echo '<td width="30%" style="border-color: rgb(251, 213, 181);">' .date('Y-m-d H:i:s',$value['time']) . '</td>'; echo '</tr>'; } ?> </tbody> </table> </div> <div> <h3>游戏规则介绍:</h3> <p> <strong>评分机制:</strong> </p > <p> 1:每答对一题,加上500基础分,连续答对额外获得奖励分(系统根据答题使用时间和连续答对次数进行奖励)!<br/> 2:每答错一题,扣除1000评分,终止连续答对次数! </p > <p> <strong>战斗机制:</strong> </p > <p> 1:BOSS初始值,BOSS血量500点,每答对一题,对BOSS伤害10点血量,连续答对根据连续答对次数获得额外伤害值!答错不对BOSS造成伤害,同时终止连续答对额外伤害值!<br/> 2:玩家初始值,玩家血量100点,每答错一题,玩家被BOSS伤害10点,玩家对BOSS不造成伤害,无连续答错惩罚。 </p > <p> <strong>胜负机制:</strong> </p > <p> 1:胜利判断依据,BOSS血量小于或等于0,玩家血量大于0;<br/> 2:失败判断依据,玩家血量小于或等于0,BOSS血量大于0; </p > </div> </div> </body> </html>
代码讲解:
我们首先设定一个游戏规则和胜负评判机制,然后用代码来完成,游戏规则也在代码中介绍,这里就不说了,我们来分析一下代码中一些常用的PHP知识点吧!
我们首先自定义了一个函数:
function initialize_game_variable() { $_SESSION['lx'] = 0; $_SESSION['bosshp'] = 500; $_SESSION['playerhp'] = 100; $_SESSION['playerpf'] = 0; $_SESSION['dui'] = 0; $_SESSION['cuo'] = 0; $_SESSION['message'] = 0; }
这里我们自定义的函数initialize_game_variable()的作用主要是初始化游戏数据,每一局游戏的开始,我们都使用initialize_game_variable()函数对必要数据进行初始化,为玩家挑战游戏做好准备!
代码中我们就通过获取$_GET['page']来判断游戏是否开始,利用BOSS的血量和玩家的血量来判断游戏是否结束,文中代码:
// 初始化游戏变量,将所有游戏变量重置为默认值 if (!isset($_GET['page']) || $_GET['page'] == '1') { initialize_game_variable(); } if (isset($_GET['page']) > 0 and $_SESSION['bosshp'] < 0) { echo "<script>alert('挑战成功!'); window.location.assign('index.php');</script>"; initialize_game_variable(); exit; } if (isset($_GET['page']) > 0 and $_SESSION['playerhp'] < 0) { echo "<script>alert('挑战失败!'); window.location.assign('index.php');</script>"; initialize_game_variable(); exit; }
本代码中用到一个我之前文章没有介绍过的一个函数:switch(),该代码可以在一定程度上减少if判断句。当然本文的代码中没有很好的体现。
// 生成数学题目 function generate_question() { $operators = array('+', '-', '*'); $operator = $operators[array_rand($operators)]; $num1 = rand(1, 100); $num2 = rand(1, 100); switch ($operator) { case '+': $result = $num1 + $num2; break; case '-': $result = $num1 - $num2; break; case '*': $result = $num1 * $num2; break; default: return generate_question(); } $_SESSION['as'] = $result; return "$num1 $operator $num2"; }
这里的switch($v)函数,通过$v值的不同,运行不同的代码。在通过判断句运行较小代码块的时候,使用该方法,十分简洁,但是运行的代码块比较复杂的时候,代码看起来就更乱。
本来时间已经很晚了,文章篇幅因为代码的原因,看起来已经很臃肿了,不想在继续写下去了,但是我觉得关于代码中数组的排序的知识点,有必要分享出来给大家借鉴一下。
gamelog = array('username' => $_SESSION['username'], 'gamepf' => $_SESSION['playerpf'], 'time' => time()); $fileProcessor = new FileProcessor('list.txt'); $sortedData = $fileProcessor->processData(); array_push($sortedData, $gamelog); // 按照'gamepf'值对$sortedData数组进行排序 usort($sortedData, function($a, $b) { return $b['gamepf'] - $a['gamepf']; }); $x = 0; $finalData = ""; foreach ($sortedData as &$data) { $x++; if ($x <= 100 && $x > 0) { $finalData .= json_encode($data)."\n"; } } if ($x == 0) { $finalData .= json_encode($gamelog); } game_logs($finalData);
$gamelog是把在玩家挑战成功以后,把用户名、评分、和时间组装到一个数组利,然后使用json_encode()把它转换成json数据以后,保存道txt文件里。这里用到了两个函数,都与数组有关,array_push($oldarr, $newarr)与usort()函数。array_push($oldarr, $newarr)的作用是把$newarr函数插入到$oldarr函数里。
usort($sortedData, function($a, $b) { return $b['gamepf'] - $a['gamepf']; });
该usort()函数在这里的作用是把$sortedData数组按照子数组键名'gamepf'对应值的大小进行从大到小进行排序,以便我们在对一些数组需要按照升序或者降序排列的时候使用!
好了,实在不能再写下去了,代码分享和代码解读就到这里了。代码不完善和讲述有异议的欢迎留言讨论,让我们一起学习成长!
欢迎站长或从事网站建设服务的朋友加入我们的‘‘网站建设交流群’’,请扫码加入,如果二维码过期,请私聊该微信公众号‘‘文煞站长笔记网’’!
由于部分虚拟主机用户建设违法网页,导致原IP被封禁,请及时解析域名到新的IP地址:45.15.10.56!同时遵守我国法律法规,并保留将相关传播违法信息者的联系信息提供给警方的权利!
分享:
支付宝
微信