我有一个名为忍者黄金的游戏,我已经成功地编码了。我正在与CodeIgniter一起使用PHP。当索引页加载会话变量(Gold和and )(如果没有设置)时,它是如何工作的。通过单击每个位置,一定数量范围内的黄金将添加到总金额中。唯一的例外是赌场的位置,那里的钱可能也会丢失。这是使用赔率生成器创建的,以确定来自赌场的金额是赢了还是输了。一旦单击了位置并添加或丢失了黄金,就会显示一条活动消息来告诉用户发生了什么。下面是我的忍者控制器中的代码:
defined('BASEPATH') OR exit('No direct script access allowed');
date_default_timezone_set('America/Los_Angeles');
class Ninjas extends CI_Controller {
public function index()
{
if (!$this->session->userdata('gold') && !$this->session->userdata('activities'))
{
$this->session->set_userdata('gold', 0);
$this->session->set_userdata('activities', [" ", "win"]);
}
$this->load->view('index');
}
public function process_money()
{
$building = $this->input->post('building');
//for an alternative to if/else, going to use case/switch
switch ($building) {
case 'farm':
$gold = rand(10,20);
break;
case 'cave':
$gold = rand(5,10);
break;
case 'house':
$gold = rand(2,5);
break;
case 'casino':
$odds = rand(0,1);
$gold = rand(0,50);
if ($odds == 0)
{
$gold *= -1;
}
break;
default:
$gold = 0;
break;
}
if ($gold < 0)
{
$activity = ['You entered a casino and lost ' . $gold . ' gold(s). Ouch!', 'loss'];
}
else
{
$activity = ['You entered a ' . $building . ' and earned ' . $gold . ' gold(s)', 'win'];
}
// $activities = $this->session->userdata('activities');
// array_unshift($activities, $activity);
$this->session->set_userdata('activities', $activity);
$running_total = $this->session->userdata('gold');
$running_total += $gold;
$this->session->set_userdata('gold', $running_total);
redirect('http://localhost:8888/');
}
}以下是索引页代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ninja Gold</title>
<link rel="stylesheet" href="<?= base_url('assets/css/style.css'); ?>">
</head>
<body>
<h1>Your Gold: <?= $this->session->userdata('gold') ?></h1>
<form action="/process_money" method="post">
<h2>Farm</h2>
<p>Earns 10-20 golds</p>
<input type="hidden" name="building" value="farm">
<input type="submit" value="Find Gold!">
</form>
<form action="/process_money" method="post">
<h2>Cave</h2>
<p>Earns 5-10 golds</p>
<input type="hidden" name="building" value="cave">
<input type="submit" value="Find Gold!">
</form>
<form action="/process_money" method="post">
<h2>House</h2>
<p>Earns 2-5 golds</p>
<input type="hidden" name="building" value="house">
<input type="submit" value="Find Gold!">
</form>
<form action="/process_money" method="post">
<h2>Casino</h2>
<p>Earns/Loses 0-50 golds</p>
<input type="hidden" name="building" value="casino">
<input type="submit" value="Find Gold!">
</form>
<div class="activities">
<?php foreach ($this->session->userdata('activities') as $activity) { ?>
<p class="<?= $activity[1] ?>"><?= $activity[0] ?></p>
<?php } ?>
</div>
</body>
</html>我正在使用表格提交数据与POST方法。我想要做的是重新编码游戏,使其只有忍者控制器中的索引函数,而在提交位置表单(名称=代码中的“建筑物”)时,不提交到另一个URL (忍者/进程_money)。这样我就可以让音乐在后台播放,而不会被打断。做这件事最好的方法是什么?问题:
发布于 2017-07-24 04:33:02
这样我就可以让音乐在后台播放,而不会被打断。
然后你应该使用AJAX,(这是唯一明智的方法),或者像@Beetle414所建议的那样,将WebSockets扔到混合物中:/
您还可以移除process_money方法并在索引方法中处理它,只需将表单(有或不带AJAX)发回自己。虽然如果游戏变得更大,你可能希望你把它放在自己的方法。
发布于 2017-07-24 04:42:07
你走在正确的轨道上。如果您不想触发页面加载并中断音乐,Ajax是更新服务器的简单方法。
<form>标记。type="submit"更改为type="button"type="button" onclick="process(this)"process(button){}处理程序中,捕获值:v = button.value (例如:“洞穴”或“农场”)process()处理程序中,触发一个将值发送给PHP的新Ajax请求。顺便说一下,您的现有代码有一个问题。在赌场,用户只有在rand(0,1)===0时才会赔钱。这种事几乎永远不会发生。如果你想让用户赔钱,比如说20%的时间,你会检查mt_rand(0,1)<=0.2 (我会切换到mt_rand,因为直到PHP7.1 兰德有严重的缺陷
https://stackoverflow.com/questions/45272532
复制相似问题