【uniapp】实现买定离手小游戏

news2024/9/21 18:40:22

前言

最近玩了一个小游戏,感觉挺有意思,打算放进我的小程序【自动化小助手】里面,“三张押一张,专押花姑娘!”,从三张卡牌,挑选一张,中奖后将奖励进行发放,并且创建下一期,不多说了,说做就做

分析

前端分析

前端设计出页面以后,从接口处获得参与次数,押中次数以及当前期数、开奖时间,开奖时间获取到以后和现在的时间进行对比获得倒计时,下面是我已经大致构建的画面
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这是代码:

<template>
	<view>
		<view class="b-flex-x b-bg-white b-p-32">
			<image src="@/static/guanjun.png" mode="aspectFit" class="logo b-radius-8"></image>
			<view class="b-flex-item b-ml-32">
				<view class="b-text-B b-text-48 b-text-black">买定离手</view>
				<br>
				<view class="b-font-24 b-mt-8 b-text-black-dd">参与<span style="color: navajowhite;">2</span>次,押中<span style="color: yellowgreen;">23</span>次</view>
			</view>
		</view>
		
		<view class="b-pt-32 b-pr-32 b-pl-32 b-pb-24 b-text-black-dd" style="color: black;font-weight: 500;">第1期 开奖倒计时:<span style="color: red;">00:00</span></view>
		<view class="b-list-user b-bg-white" style="width: 700rpx;height: 300rpx;margin: auto;">
			<text style="color: orange;">已选择卡牌,等待开奖</text>
			<text style="color: orange;">请选择</text>
			<view style="width: 680rpx;height: 250rpx;margin: auto;display: flex;flex-direction: row;align-items: center;justify-content: center;">
				<image src="https://floor.huluxia.com/static/img/ya.png" mode="aspectFit" style="width: 200rpx;" v-if="select_card=='1'" ></image>
				<image src="https://floor.huluxia.com/static/img/1_normal.png" mode="aspectFit" style="width: 200rpx;" v-else @click="click_card('1')"></image>
				<image src="https://floor.huluxia.com/static/img/ya.png" mode="aspectFit" style="width: 200rpx;margin-left: 10rpx;" v-if="select_card=='2'"></image>
				<image src="https://floor.huluxia.com/static/img/2_normal.png" mode="aspectFit" style="width: 200rpx;margin-left: 10rpx;" v-else @click="click_card('2')"></image>
				<image src="https://floor.huluxia.com/static/img/ya.png" mode="aspectFit" style="width: 200rpx;margin-left: 10rpx;" v-if="select_card=='3'"></image>
				<image src="https://floor.huluxia.com/static/img/3_normal.png" mode="aspectFit" style="width: 200rpx;margin-left: 10rpx;" v-else @click="click_card('3')"></image>
			</view>
		</view>
		
		<view class="b-pt-32 b-pr-32 b-pl-32 b-pb-24 b-text-black-dd" style="color: black;font-weight: 500;">游戏规则:</view>
		<view class="b-list-user b-bg-white" style="width: 680rpx;height: 120rpx;margin:auto;">
			<text>①三张卡牌中有一张是K,请选择一张卡牌。</text>
			
			<br>
			<text>②开奖后,选中的话可以获得相应的金币,反之会失去你的金币。</text>
		</view>
		
		<view class="b-pt-32 b-pr-32 b-pl-32 b-pb-24 b-text-black-dd" style="color: black;font-weight: 500;">最近开局记录</view>
		<view class="b-list-user b-bg-white">
			
		</view>
		
		
	
		
		
	</view>
</template>

<script>
	export default {
		data() {
			return {
				select_card:'0'
			}
		},
		onShow() {
			
		},
		onLoad() {
			
		},
		methods: {
		click_card(num){
			this.select_card=num;
		},
		}
	}
</script>

<style lang="scss">
	.logo{
		width: 140rpx;
		height: 140rpx;
	}
</style>

后端分析

后端我这里用的是原生PHP,因为php简单,配合这次的项目能够发挥很大的效率,瘴气氨考虑用python,但是因为长连接不考虑,所以就
pass了

思路

新建一个php脚本,用来触发每一期的开盘
逻辑:查询数据库对应表,是否有最后一期,存在的话开奖,然后写入数据库,发放奖励,通过定时计划任务每几分钟触发,用户端在查到数据库信息后,换算开盘时间,进行押注

创建期数

新建game_system.php

<?php
include '../api/conn.php';
require_once("../api/Message_push/mqtt_sender.php");
if ($_GET['password']!='iuweojsd8542637lk') {
   die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '缺少参数'
        ),480)
);
} 


// 获取当前时间戳
$currentTimestamp = time();

// 计算5分钟之后的时间戳
$fiveMinutesLaterTimestamp = $currentTimestamp + (5 * 60);
//每多长时间开盘$fiveMinutesLaterTimestamp

//先获取最后一期数
$sql = "SELECT * FROM game_periods ORDER BY period DESC LIMIT 1";  
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // 读取查询结果中的一行数据
    $row = $result->fetch_assoc();
    
    // 获取period字段的值
    $period = $row['period'];
    
    //进行随机数计算,完成该期数据库写入
    // 生成1、2或3的随机数
    $randomNumber = mt_rand(1, 3);
    $sql_update="UPDATE `game_periods` SET `number` = '$randomNumber', `is_processed` = '1' WHERE `period` = '$period'";
     $conn->query($sql_update);
    
} else {
   //没有查询到任何记录
   //创建第一期
   
   $sql_insert="INSERT INTO `game_periods` (`id`, `period`, `number`, `next_draw_time`, `is_processed`) VALUES (NULL, '1', '','$fiveMinutesLaterTimestamp', '0')";
   $conn->query($sql_insert);
   
   
   die("创建了第一期");
}


//下一期创建
$nextPeriod = $period + 1;
$sql_insert_ = "INSERT INTO game_periods (`id`, `period`, `number`, `next_draw_time`, `is_processed`) VALUES (NULL, '$nextPeriod', '', '$fiveMinutesLaterTimestamp', '0')";
$result = $conn->query($sql_insert_);


// 匹配奖励结算(未中奖也要说)
$reward = "SELECT price,openid,number FROM `periods_data` WHERE `period`='$period'";
$result = $conn->query($reward);

if ($result->num_rows > 0) {
    // 循环读取查询结果中的所有行数据
    while ($row = $result->fetch_assoc()) {
        $openid = $row['openid'];
        $price = $row['price'];
        $number_sonal = $row['number'];
        // 获得$price的两倍
        $doublePrice = $price * 2;
        
        if ($number_sonal==$randomNumber) {
            
            // 金额到账
$price_update = "UPDATE `user` SET `price` = `price` + $doublePrice WHERE `openid` = '$openid'";
$conn->query($price_update);
$msg="恭喜您,选中了K牌,奖励已到账";
        } else {
$msg="很遗憾,未选中K牌,再接再厉";
        }
        
    $receiver = "$openid";
    $content = $msg;
    send_mqtt_message($receiver, $content,$conn,'0');
        



 // 通知消息
 
    }
} 


// 关闭数据库连接
$conn->close();
?>
  1. 首先,代码通过include和require_once引入了一些依赖的文件,包括数据库连接文件和消息推送相关的文件。
  2. 接下来,代码检查传入的GET请求参数password是否等于iuweojsd8542637lk,如果不等于则返回一个JSON格式的错误信息,包含错误代码和错误消息。
  3. 然后,代码获取当前的时间戳,并计算出5分钟后的时间戳。代码通过数据库查询获取最后一期的信息,如果有查询结果,说明已经存在期数记录,就对该期进行更新操作:生成1、2或3的随机数,并将这个随机数以及标记为已处理的状态写入数据库。如果没有查询到任何记录,说明是第一期,代码将创建第一期的记录,并将下一期的信息也插入数据库,但这个记录的期数是当前期数加1,即第二期。
  4. 之后,代码会检查当前期数的数据记录,查询是否有用户参与,如果有参与,会根据用户选择的数字和随机生成的数字进行奖励结算。如果用户选择的数字与随机数一致,会将用户的账户余额增加两倍的奖励金额,否则用户得到一条未中奖的消息。
  5. 最后,代码通过消息推送的方式,将奖励结果发送给对应的用户。
  6. 最后关闭数据库连接。

定时计划

通过宝塔的定时计划任务,到点后触发URL,这个时候你可能会说程序会在创建过程中出现很多BUG,是的,当速度不匹配用户提交数据有很多不确定性,所以我们需要对下面的用户操作部分做一些调整,避免出现这些情况
在这里插入图片描述

买定离手操作

新建buy.php

<?php

include '../api/conn.php';
if (!$_POST) {
   die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '缺少参数'
        ),480)
);
} 

$period=$_POST['period'];
$openid=$_POST['openid'];
$number=$_POST['number'];
$price=$_POST['price'];
//查询当前提交期数与系统最后期数一致吗(期数一致)
$sql1="SELECT period,is_processed FROM game_periods ORDER BY period DESC LIMIT 1";
$result = $conn->query($sql1);

if ($result->num_rows > 0) {
    // 读取查询结果中的一行数据
    $row = $result->fetch_assoc();
    
    // 获取id字段的值
    $period_database = $row['period'];
    $is_processed = $row['is_processed'];
    if ($period_database==$period&&$is_processed=='0') {
        //防止写入两次
        $query_sql="SELECT id FROM `periods_data` WHERE `period`='$period'and `openid`='$openid'";
        $result = $conn->query($query_sql);

if ($result->num_rows > 0) {
die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '已经押注过啦~'
        ),480)
);

} else {
    
    // 余额支付
      //我的余额查询
    $cx_yue="SELECT `price` FROM `user` WHERE `openid`='$openid'";
     $res=$conn->query($cx_yue);
    if ($rowss=$res->fetch_assoc()) {
       $my_money=$rowss['price'];//我的余额
    } else {
      die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '当前用户未注册'
        ),480)
);
    }
 
    
    
     $buy=$price;//真正需要付的钱
     
    //  var_dump($buy);
    //余额判断
    if ($my_money>=$buy) {
        // 余额扣除
        $residue_money=$my_money-$buy;
    $money_update="UPDATE `user` SET `price` = '$residue_money' WHERE `openid` = '$openid'";
    $res2=$conn->query($money_update);
    //插入操作
     $sql2="INSERT INTO `periods_data` (`id`, `period`, `number`, `openid`, `price`) VALUES (NULL, '$period_database', '$number', '$openid', '$price')";
      $conn->query($sql2);
      die(
        json_encode(
            array(
            'code' => 100,
            'msg' => '押注成功'
        ),480)
);

   
} else {
   die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '余额不足'
        ),480)
);
}
    // 余额支付
       
    
}
     
    } else {
       die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '该局游戏不存在,请刷新后重试'
        ),480)
);
    }
    
} else {
   die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '游戏暂未开盘'
        ),480)
);
}

// 关闭数据库连接
$conn->close();

//放防止重复提交(同个用户一期只能提交一次)

  1. 代码首先通过include引入了数据库连接文件。
  2. 接下来,代码检查是否收到了POST请求,如果没有收到POST请求,返回一个JSON格式的错误信息,表示缺少参数。代码从POST请求中获取了期数 p e r i o d 、用户标识 period、用户标识 period、用户标识openid、用户选择的数字 n u m b e r 以及押注金额 number以及押注金额 number以及押注金额price。
  3. 代码查询数据库,获取系统中最后一期的信息,包括期数和是否已经处理的标记。
  4. 如果查询到最后一期的信息,代码会检查用户提交的期数 p e r i o d 是否与系统最后一期的期数一致,并且检查该期是否未处理( period是否与系统最后一期的期数一致,并且检查该期是否未处理( period是否与系统最后一期的期数一致,并且检查该期是否未处理(is_processed为0)。如果期数一致且未处理,继续进行下面的操作。
  5. 代码查询数据库,检查该用户是否已经在当前期数下进行过押注,如果已经押注过,返回一个JSON格式的错误信息,表示已经押注过。
  6. 如果用户没有在当前期数下进行过押注,则继续进行余额支付判断。首先查询该用户的余额,并检查余额是否足够支付押注金额。
  7. 如果余额足够,进行余额扣除操作,更新用户余额,并将押注记录插入periods_data表中。
  8. 如果余额不足,返回一个JSON格式的错误信息,表示余额不足。
  9. 如果系统最后一期的期数与用户提交的期数不一致,或者该期已经处理过,返回相应的JSON格式错误信息,提示游戏状态或操作不合法。
  10. 最后,关闭数据库连接。

前端页面渲染接口

新建get_last_periods.php

<?php
include '../api/conn.php';
header("Content-type:text/html;charset=utf-8");//字符编码设置
if (!$_POST) {
   die(
        json_encode(
            array(
            'code' => 200,
            'msg' => '缺少参数'
        ),480)
);
} 

$sql = "SELECT * FROM game_periods ORDER BY period DESC LIMIT 1";  
$result =$conn->query($sql);
if (!$result) {
   die("fail");
}

$jarr = array();
while ($rows=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    $count=count($rows);//不能在循环语句中,由于每次删除 row数组长度都减小  
    for($i=0;$i<$count;$i++){  
        unset($rows[$i]);//删除冗余数据  
    }
    array_push($jarr,$rows);
}

//  $str=json_encode($jarr);//将数组进行json编码
//  $info = json_decode(trim($jarr),true);
 die(
        json_encode(
            array(
            'code' => 100,
            'data' => $jarr,
            'msg' => '获取成功'
        ),480)
);

?>

MQTT消息通知写入数据库

    $receiver = "$openid";
    $content = $msg;
    send_mqtt_message($receiver, $content,$conn,'0');

演示操作

可以去小程序【自动打卡小助手】里面体验,下面是演示视频

【uniapp】实现买定离手小游戏

🍋希望你能喜欢我的其他作品
《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》

推荐专栏:

《Python爬虫脚本项目实战》

该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》

🥦如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
🥦作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选

如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!

🚀Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)
【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

⭐⭐欢迎订阅⭐⭐
在这里插入图片描述

Python爬虫脚本项目实战
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux线程】第一章||理解线程概念+创建一个线程(附代码加讲解)

线程概念 &#x1f335;什么是线程&#x1f332;线程和进程的关系&#x1f384;线程有以下特点&#xff1a;&#x1f333; 线程的优点&#x1f334; 线程的缺点&#x1f331;线程异常&#x1f33f;线程用途 ☘️手动创建一个进程&#x1f340;运行 &#x1f335;什么是线程 在L…

【需求响应DR】一种新的需求响应机制DR-VCG研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【技术架构】技术架构的演进

文章目录 前言1.名词解释(常见概念)1.1 应用&#xff08;Application&#xff09; / 系统&#xff08;System&#xff09;1.2 模块&#xff08;Module&#xff09; / 组件&#xff08;Component&#xff09;1.3 分布式&#xff08;Distributed&#xff09;1.4 集群&#xff08;…

AOP概念 和 使用

目录 AOP的概念 什么是AOP? 什么是SpringAOP? 为什要⽤ AOP? AOP的作用&#xff1f; AOP的组成 通知 AOP的实现 1. 添加 Spring AOP 框架⽀持。 2. 定义切面和切点。 3. 定义通知。 切点表达式 AOP的概念 什么是AOP? AOP&#xff08;Aspect Oriented Programm…

工程师分享:如何解决传导干扰?

电磁干扰 EMI 中电子设备产生的干扰信号是通过导线或公共电源线进行传输&#xff0c;互相产生干扰称为传导干扰。传导干扰给不少电子工程师带来困惑&#xff0c;如何解决传导干扰&#xff1f; 找对方法&#xff0c;你会发现&#xff0c;传导干扰其实很容易解决&#xff0c;只要…

献给大一新生的JavaSE入门篇章 大三秋招JavaSE

Java反射 反射实现有哪些? Class.forName(“com.jdbc.cj.Driver.mysql”) 类名.class 对象名.getClass() 反射优缺点有哪些? 优点: 能够动态的获取类的实例&#xff0c;提高灵活性 缺点: 会降低性能&#xff0c;解决办法: 1. 如果多次创建某个对象的实例&#xff0c;使用…

Pixelmator Pro 3.3.10 Mosaic (macOS Universal) - 专业图像编辑工具

Pixelmator Pro 3.3.10 Mosaic (macOS Universal) - 专业图像编辑工具 请访问原文链接&#xff1a;https://sysin.org/blog/pixelmator-pro-3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Pixelmator Pro 真正基于 Apple M…

机器学习算法实现(基于numpy)

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 这篇博客是将笔者边学边刷《机器学习公式推导与代码实现》的模型跟代码记录下来&#xff0c;部分地方结合自己的思考对原作者的代码有一定的改动…

【自定义图库】

sld文件 前段时间,有网友委托我帮他做一个家具的图库。 首先,做图库的方法有很多,最简单的是MFC拖控件然后自己把做好的bmp图贴进去就可以了,麻烦一点的是sld文件,最麻烦 是用blockview做。 下面先说说3种办法的区别: 首先,如果用MFC拖控件的办法,最简单也最方便,用st…

安全帽检测+反光衣检测+工作服检测数据集

安全帽检测反光衣检测工作服检测数据集下载地址分享:https://download.csdn.net/download/qq_34717531/88112870

AF 350 tyramide,AlexaFluor350 TSA,AF350酪胺,荧光标记试剂

文章资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu​ PART1----产品描述 AF350 tyramide&#xff08;AlexaFluor350酪酰胺&#xff09;&#xff0c;用于荧光标记的试剂&#xff0c;Tyramide信号放大&#xff08;TSA&#xff09;已被证明是一种特别通用且…

SAS-input和put的使用

在SAS中经常会遇到数值型变量与字符型变量之间进行相互转换&#xff0c;如何进行转换呢&#xff1f; 一、字符型转数值型 方法1&#xff1a;字符型变量通过运算进行转换&#xff0c;如Numeric Character * 1。运算符可以转换&#xff0c;但是会有NOTE提示&#xff0c;不推荐…

一个外贸业务员的鸡飞蛋打

最近在论坛上看到一个案例&#xff0c;案例是一个是SOHO的业务员从他朋友厂子拿货, 然后他发现他的前同事在他朋友的厂子做sales director&#xff0c;然后最近一个客户A出货&#xff0c;这个小伙伴就去他朋友的工厂做发货前的质检&#xff0c;正好碰到以前的一个同事也去他朋友…

【Docker】Docker安全性与安全实践(五)

前言&#xff1a; Docker安全性的作用和意义在于确保容器化应用程序和镜像的隔离性、保护数据和系统资源、防止恶意攻击&#xff0c;以及提高应用的整体安全性。 文章目录 1. Docker安全性1.1 隔离性1.2 镜像安全1.3 特权访问1.4 数据保护 2. Docker安全实践2.1 使用官方镜像或…

管理类联考——数学——趣味篇——可视化——安装Manim软件

Manim: 一个数学可视化的动画引擎 官网&#xff1a;https://3b1b.github.io/manim/index.html 名词解析 python3.7是python语言的解释器, 运行python程序的环境必备品. 这个没啥说的,大家都能懂. 虽然官方建议3.7,但是我用3.8发现也没问题.考虑未来的历史进程,大伙最好还是装…

Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用 (July 2023)

Windows Subsystem for Android (WSA) 下载&#xff1a;在 Windows 11 上运行 Android 应用 (July 2023) 适用于 Android™️ 的 Windows 子系统&#xff0c;2023 年 7 月更新&#xff1a;2306.40000.4.0 请访问原文链接&#xff1a;https://sysin.org/blog/wsa/&#xff0c;…

探讨高校公共建筑能耗监测系统的设计与应用

安科瑞 华楠 摘要&#xff1a;在资源节约型社会建设进程中&#xff0c;高校公共建筑能耗管理存在问题已经成为办学成本加大、社会资源浪费的桎梏。在各级政府的推动下&#xff0c;高校公共建筑能耗监测系统建设在探索中发展&#xff0c;依托互联网大数据技术逐步实现能耗管理信…

跨域冲突问题解决

1、问题分析 服务端和nginx代理 都做了跨域配置&#xff0c;导致请求头重复 headers 里面有两个重复的 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Credentials 2、解决方法 在nginx去除服务端的跨域配置 proxy_hide_header Access-…

【腾讯云 Cloud Studio 实战训练营】CloudStudio体验真正的现代化开发方式,双手插兜不知道什么叫对手!

CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01; 文章目录 CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01;前言出现的背景一、CloudStudio 是什么&#xff1f;二、CloudStudio 的特点三、CloudS…

医学案例|配对wilcoxon符号秩检验

一、案例介绍 某单位想要研究某保健品对小鼠是否具有抗疲劳作用&#xff0c;将同种属的小鼠按性别与年龄相同、体重相近配成对子&#xff0c;共14对&#xff0c;并将每对中的两只小鼠随机分配到两个不同的保健食品剂量组&#xff0c;测量小鼠负重5&#xff05;体重时的游泳时间…