[英]Select random array generated from while loop
我正在学习PHP,因为我只制作了设计和模板,而且我遇到了一个大问题,至少对我而言。 我正在制作一个简单的“军队战斗剧本”,每个玩家都有一些部队有攻击,防御,hp统计,并且他们互相争斗。 我已经制造了攻击玩家与玩家,但我正在努力解决许多实体战斗以及如何编码。 首先我呼吁所有我的单位被攻击,运行它进行循环并获得阵列每一行/单位然后我用敌人单位做到了,最后,我有一个简单的模拟脚本,使战斗。 但战斗不起作用。 它不会从阵列中选择随机单位,它不会在攻击者x防御者转弯之间切换,最糟糕的是,它只运行一个单位,当单位死亡时,脚本结束并且就是它...你们可以请给我一些回答,或处理这个问题的方法? 我会非常感激,因为我解决了这几天,我不知道。 谢谢。 (我知道代码很难看,但它只是概念...)
//编辑好了,我打开了错误报告并更改了模拟代码,但结果很糟糕。 我得到错误致命错误:超过30秒的最大执行时间或警告:在行中的除以零
$hit = ($attacker['attack']/$defender['defense']) + rand(1, 2);
下面是完整的代码,我试过rand(0,count($ unit_attacker_def)-1); 但我认为它没有变化。 此外,我添加了选择新的随机数组与单位,如果有0健康和未设置。 并且它仍在运行一个单位,而不是所有攻击者阵列,以及所有或左侧单位的后卫阵列。 我不知何故来到了脚本调用下一个单元的阶段,但它没有加载任何变量。
case 'battle_wizard_execute';
?>
<table>
<tr><td><h3>Utok</h3></td></tr>
<?
$query_street = mysql_query("SELECT * FROM game_army_attacks WHERE attack_id = '".$_GET['id']."' ");
$row_street = mysql_fetch_assoc($query_street);
$query_loc_info = mysql_query("SELECT * FROM game_location_street WHERE street_id = '".$row_street['attack_attacker']."' ");
$row_loc_info = mysql_fetch_assoc($query_loc_info);
$tilee_info = mysql_num_rows($query_street);
if ($tilee_info > 0){
$query_units_info = mysql_query("SELECT * FROM game_army_units_attacking WHERE army_attack = '".$_GET['id']."' ");
while (($unitsinfo = mysql_fetch_assoc($query_units_info)) != NULL) {
$query_unit_info = mysql_query("SELECT * FROM game_army_class WHERE army_class_id = '".$unitsinfo['army_class_id']."' ");
$unit = mysql_fetch_assoc($query_unit_info);
$unit_attacker = array();
$unit_attacker[] = array(
'name' => $unit['army_class_name'],
'power' => $unitsinfo['army_power'],
'attack' => $unitsinfo['army_att'],
'defense' => $unitsinfo['army_def']
);
///// Kolko jednotiek máš tolko krat sa vypise
$x = 1;
while($x <= $unitsinfo['army_population']) {
foreach($unit_attacker as $index => $record){
///// Tato cast pusti kod pre kazdu jednu jednotku ktora je v poli
echo "<tr><td>Jednotka: {$record['name']} ID: {$record['power']} ParentID: {$record['attack']} Title: {$record['defense']}</td></tr>";
$x++;
}
}
}
}
?>
</table>
<table>
<tr><td><h3>Utok protivnik</h3></td></tr>
<?
$query_street_def = mysql_query("SELECT * FROM game_army_units WHERE army_street = '".$row_street['attack_defender']."' ");
$tilee_info_def = mysql_num_rows($query_street_def);
if ($tilee_info_def > 0){
$query_units_info_def = mysql_query("SELECT * FROM game_army_units WHERE army_street = '".$row_street['attack_defender']."' ");
while (($unitsinfo_def = mysql_fetch_assoc($query_units_info_def)) != NULL) {
$query_unit_info_def = mysql_query("SELECT * FROM game_army_class WHERE army_class_id = '".$unitsinfo_def['army_class_id']."' ");
$unit_def = mysql_fetch_assoc($query_unit_info_def);
$unit_attacker_def = array();
$unit_attacker_def[] = array(
'name' => $unit_def['army_class_name'],
'power' => $unitsinfo_def['army_power'],
'attack' => $unitsinfo_def['army_att'],
'defense' => $unitsinfo_def['army_def']
);
///// Kolko jednotiek máš tolko krat sa vypise
$y = 1;
while($y <= $unitsinfo_def['army_population']) {
foreach($unit_attacker_def as $index => $record_def){
///// Tato cast pusti kod pre kazdu jednu jednotku ktora je v poli
echo "<tr><td>Jednotka: {$record_def['name']} ID: {$record_def['power']} ParentID: {$record_def['attack']} Title: {$record_def['defense']}</td></tr>";
$y++;
}
}
}
}
模拟:
$count = 0;
while ((count($unit_attacker_def) > 0) && (count($unit_attacker) > 0)){
$count++;
$attacker_key = rand(0,count($unit_attacker_def)-1);
$attacker =& $unit_attacker[$attacker_key];
$defender_key = rand(0,count($unit_defender)-1);
$defender =& $unit_attacker_def[$defender_key];
while (($defender['power'] >= 0) && ($defender['power'] >= 0)){
$hit = ($attacker['attack']/$defender['defense']) + rand(1, 2);
echo "<tr><td>{$count}.xx {$attacker_key} xJednotka {$defender['name']} ({$defender['power']} hp) bola zranená a dostala {$hit} zranenia jednotkou {$attacker['name']} ({$attacker['power']} hp)</td></tr>";
$defender['power'] = $defender['power'] - $hit;
$attacker['power'] = $attacker['power'] - $hit;
if ($defender['power'] <= 0) {
echo "<tr>Jednotka {$defender['name']} umrela, jednotka {$attacker['name']} vyhrala!</tr>";
unset($defender[$defender_key]);
$defender_key = rand(0,count($unit_defender)-1);
$defender =& $unit_attacker_def[$defender_key];
}
if ($attacker['power'] <= 0) {
echo "<tr>Jednotka {$attacker['name']} umrela, jednotka {$defender['name']} vyhrala!</tr>";
unset($attacker[$attacker_key]);
$attacker_key = rand(0,count($unit_attacker_def)-1);
$attacker =& $unit_attacker[$attacker_key];
}
}
}
?>
</table>
<?
break;
首先,确保您已启用错误报告:
<?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
通过简单的调试,您将找到错误的位置。 只需var_dump()每个重要变量并检查其状态。 没有人可以为您调试,因为我们不知道您的mysql表中的数据是什么。
尝试使用mysqli_ *函数,因为不推荐使用mysql。
尝试使用类来描述游戏中的所有内容,使其更具可读性和可维护性。 例如:
<?php
abstract class Unit{
protected $hp;
protected $damage;
protected $defense;
// Force Extending class to define this method
abstract protected function applyDamage($damage);
}
class GroundUnit extends Unit{
//GroundUnit inherits everything from Unit
//define methods specific for GroundUnits
}
class FlyingUnit extends Unit{
//FlyingUnit inherits everything from Unit
//define methods specific for GroundUnits
}
当您发现错误的位置,并且如果您仍然卡住时,请使用相关数据更新您的问题。
请注意,您的代码容易受到SQL注入攻击
$query_street = mysql_query("SELECT * FROM game_army_attacks WHERE attack_id = '".$_GET['id']."' ");//don't put $_GET['id'] directly into query because that is security hole
简单的步骤(与您的示例相关),以提高您的sql注入保护将是:
//assume that $_GET['id'] should hold an integer value
$id = isset($_GET['id']? trim($_GET['id']) ? 0);
$id = (int)$id;
现在让我们假装还有一个$ _GET ['some_key']并且它应该保存字符串值。 现在检查会有所不同:
$some_string_value = isset($_GET['some_key']? trim($_GET['some_key']) ? '');
$some_string_value = trim($some_string_value);//triming whitespace
$some_string_value = mysql_real_escape_string($some_string_value);//escaping troublesome quotes(')
您也可以使用我认为是首选方式的预准备语句 。
那么你使用array_rand()
它从数组中选择一个元素,当你使用$array[$key]
,其中$key = 1
因为数组到var的转换,它返回数组atackers的第二个元素和防御者的第二个元素。 使用rand(0,count($unit_attacker)-1)
生成随机密钥。 但它仍然会很烦人,因为你可以生成相同的密钥))。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.