首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >想要在同一个页面上操作我的web应用程序游戏的会话数据

想要在同一个页面上操作我的web应用程序游戏的会话数据
EN

Stack Overflow用户
提问于 2017-07-24 04:16:35
回答 2查看 61关注 0票数 0

我有一个名为忍者黄金的游戏,我已经成功地编码了。我正在与CodeIgniter一起使用PHP。当索引页加载会话变量(Gold和and )(如果没有设置)时,它是如何工作的。通过单击每个位置,一定数量范围内的黄金将添加到总金额中。唯一的例外是赌场的位置,那里的钱可能也会丢失。这是使用赔率生成器创建的,以确定来自赌场的金额是赢了还是输了。一旦单击了位置并添加或丢失了黄金,就会显示一条活动消息来告诉用户发生了什么。下面是我的忍者控制器中的代码:

代码语言:javascript
复制
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/');
    }
}

以下是索引页代码:

代码语言:javascript
复制
<!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)。这样我就可以让音乐在后台播放,而不会被打断。做这件事最好的方法是什么?问题:

  1. 最好使用Ajax通过表单提交数据,这样页面就不需要刷新了吗?我可以使用JavaScript轻松地对游戏进行重新编码,但如果可能的话,我希望使用PHP变量来在我的投资组合中展示我的PHP技能。
  2. 是否有可能在索引函数内嵌套函数以使其工作?我相信这并不是只想确保。即使是这样,我想这也不是最好的做法,对吧?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-24 04:33:02

这样我就可以让音乐在后台播放,而不会被打断。

然后你应该使用AJAX,(这是唯一明智的方法),或者像@Beetle414所建议的那样,将WebSockets扔到混合物中:/

您还可以移除process_money方法并在索引方法中处理它,只需将表单(有或不带AJAX)发回自己。虽然如果游戏变得更大,你可能希望你把它放在自己的方法。

票数 0
EN

Stack Overflow用户

发布于 2017-07-24 04:42:07

你走在正确的轨道上。如果您不想触发页面加载并中断音乐,Ajax是更新服务器的简单方法。

  1. 去掉<form>标记。
  2. 将输入从type="submit"更改为type="button"
  3. 向每个按钮添加一个onclick处理程序:type="button" onclick="process(this)"
  4. process(button){}处理程序中,捕获值:v = button.value (例如:“洞穴”或“农场”)
  5. process()处理程序中,触发一个将值发送给PHP的新Ajax请求
  6. 在PHP中,如果会话不存在,则加载一个空白游戏。否则,如果发送了位置值,更新黄金并将新余额发回。
  7. JavaScript接收Ajax成功回调中的新平衡,并更新游戏(通知用户)。

顺便说一下,您的现有代码有一个问题。在赌场,用户只有在rand(0,1)===0时才会赔钱。这种事几乎永远不会发生。如果你想让用户赔钱,比如说20%的时间,你会检查mt_rand(0,1)<=0.2 (我会切换到mt_rand,因为直到PHP7.1 兰德有严重的缺陷

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45272532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档