利用PHP开发的微信公共平台游戏

2024-04-29 12:48

本文主要是介绍利用PHP开发的微信公共平台游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直想利用微信公告平台提供的接口开发一个文字类型游戏,但是苦于没有什么点子,知道看到redraiment在OSChina上托管的微信游戏--开窗,让我觉得我也可以完成此类文字游戏的开发.redraiment利用的是Emacs Lisp脚本语言完成的,可惜我对这个脚本完全没有了解,而且我的微信接口环境是基于PHP的,所以就没办法参考他的源码了,好在游戏模式十分简单,不必利用redrainment提供的框架也可以完成这样一款文字游戏.

游戏规则很简单,1个5x5(或者其他规格)的棋盘,每改变其中一个棋子的状态(每个棋子都有两种对应的状态,用两种不同的颜色表示),其上,下,左,右四个位置的棋子状态也会跟着改变,如果你能将所有棋子的状态都变成其相对的状态,游戏就结束了.

首先说整个游戏本身,我选择了利用0和1的字符来表示棋子的两种状态,每个棋盘都是1个含有0和1的25个字符(暂时是基于5x5棋盘),写了一个translate函数专门将这个长度未25的字符串转换成表示特殊的棋子(以下代码都是基于PHP)

01 function translateLight($string)
02 {
03     $blue "◼️";
04     $purple "◻️";
05  
06     $strArray array_chunk(str_split($string),5);
07     $newStr "";
08     for($i = 0;$i < 5;$i++)
09     {
10         for ($j = 0;$j < 5;$j++)
11         {
12             if(!strcmp($strArray[$i][$j],"0"))
13             {
14                 $newStr .= $blue;
15             }
16             elseif(!strcmp($strArray[$i][$j],"1"))
17             {
18                 $newStr .= $purple;
19             }
20             else
21             {
22  
23             }
24         }
25         $newStr .= "\r\n";
26     }
27     return $newStr;
28 }

上述代码中的作为棋子的特殊字符是Mac下的特殊字符,其非标准的ASCII字符,但是在微信上可以显示出如下效果,图中的绿色和紫色圆圈就是代码中的$blue和$purple中保存的字符.

QQ20140526-1

 

有了基本的状态字符,同时我就需要将状态保存到数据库,每次用户发来指定的游戏消息(本例中游戏指定是数字,只要用户回复了数字类型,就是开始这个游戏),就会从数据库中将这个用户之前的游戏状态取出,然后根据其数字指令区处理整个棋盘的状态,将处理后的棋盘状态再发送给用户.

01 function turnLight($keyword,$fromUsername)
02 {  
03     $header "";
04     $footer "";
05     $sql "select nick_name,best_score,says from wx_turnlight where best_score = (select min(best_score) from wx_turnlight);";
06     $result = execSql($sql);
07     $rownum = mysql_num_rows($result);
08     $response "";
09     if($rownum != 0)
10     {
11         $row = mysql_fetch_array($result);
12         $header $header."擂主:".$row['nick_name']."\r\n总步数:".$row['best_score']."\r\n擂主宣言:".$row['says'];
13     }
14  
15     /*全局命令,keyword的长度为1
16      *2:结束游戏
17      *1:开始游戏
18      */
19     if(strlen($keyword) == 1)
20     {
21         if(!strcmp($keyword,"1"))
22         {
23             $str = getLightState($fromUsername);
24             $response = translateLight($str);
25         }
26         else if(!strcmp($keyword,"2"))
27         {
28             $str "1111111111111111111111111";
29             setLightState($fromUsername,$str);
30             setScore($fromUsername,0);
31             return "游戏已退出,所有灯的状态恢复初始状态!";
32         }
33     }
34     else if(strlen($keyword) == 2)
35     {
36         $str = getLightState($fromUsername);
37         $str = processLight($str,$keyword);
38  
39         $score = getScore($fromUsername);
40         $newScore = (int)$score + 1;
41         $footer "\r\n当前步数:$score";
42         setScore($fromUsername,$newScore);
43         //检查是否成功
44         if(isWin($str))
45         {
46             $footer .= "\r\n你赢了!恭喜你!请回复您的昵称,格式如下:\r\n昵称 你的大名";
47             setBestScore($fromUsername,$newScore);
48             $str "1111111111111111111111111";
49             setLightState($fromUsername,$str);
50             setScore($fromUsername,0);
51         }
52         setLightState($fromUsername,$str);
53         $response = translateLight($str);
54     }
55     return $header."\r\n".$response.$footer;
56  
57 }

状态的更改算法很简单,又一个二维数组存储棋子的状态,根据用户所给坐标来改变所有5个点的值就可以了.

01 function processLight($str,$order)
02 {
03     //将字符串转换为数组
04     $array array_chunk(str_split($str),5);
05  
06     if(strlen($order) != 2)
07     {
08         return "命令有误,必须是两位数字";
09     }
10     $ord_array str_split($order);
11  
12     $x = (int)$ord_array[0];
13     $y = (int)$ord_array[1];
14  
15     $newStr "";
16     for($i = 0; $i < 5;$i++)
17     {
18         for($j = 0;$j < 5;$j++)
19         {
20  
21             if(($j == $x-1) && ($i == $y))
22             {
23                 $newStr .= zero2one($array[$i][$j]);
24             }
25             elseif(($j == $x+1) && ($i == $y))
26             {
27                 $newStr .= zero2one($array[$i][$j]);
28             }
29             elseif(($j == $x) && ($i == $y-1))
30             {
31                 $newStr .= zero2one($array[$i][$j]);
32             }
33             elseif(($j == $x) && ($i == $y+1))
34             {
35                 $newStr .= zero2one($array[$i][$j]);
36             }
37             elseif(($j == $x) && ($i == $y))
38             {
39                 $newStr .=zero2one($array[$i][$j]);
40             }
41             else
42             {
43                 $newStr .= $array[$i][$j];
44             }
45         }
46     }
47     return $newStr;
48 }

这里面同时还需要几个数据库连接的函数,用来将棋盘状态存放进数据库以及从数据库中读取状态,若干函数如下:

01 function execSql($sql)
02 {
03     $sqluser "*****";
04     $sqlpwd "******";
05     $con = mysql_connect("localhost",$sqluser,$sqlpwd);
06     if(!$con)
07     {  
08         return 'Could not Connect: '.mysql_error();
09     }
10     mysql_select_db("wordpress",$con);
11     $result = mysql_query($sql);
12     mysql_close($con);
13     return $result;
14 }
15  
16 function getLightState($fromUsername)
17 {
18     $sql "select state from wx_turnlight where open_id = '$fromUsername';";
19     $result = execSql($sql);
20     $rownum = mysql_num_rows($result);
21     $state "";
22     if($rownum != 0)
23     {
24         $row = mysql_fetch_array($result);
25         $state $row['state'];
26     }
27     return $state;
28 }
29 function getScore($fromUsername)
30 {
31     $sql "select score from wx_turnlight where open_id = '$fromUsername';";
32     $result = execSql($sql);
33     $rownum = mysql_num_rows($result);
34     $score = 0;
35     if($rownum != 0)
36     {
37         $row = mysql_fetch_array($result);
38         $score $row['score'];
39     }
40     return $score;
41  
42 }
43 function setLightState($fromUsername,$state)
44 {
45     $sql "update wx_turnlight set state = '$state' where open_id = '$fromUsername';";
46     execSql($sql);
47 }
48  
49 function setScore($fromUsername,$score)
50 {
51     $sql "update wx_turnlight set score = $score where open_id = '$fromUsername';";
52     execSql($sql);
53 }
54 function setBestScore($fromUsername,$score)
55 {
56     $sql "update wx_turnlight set best_score = $score where open_id = '$fromUsername';";
57     execSql($sql);
58 }
59  
60 function getBestScore($fromUsername)
61 {
62     $sql "select best_score from wx_turnlight where open_id = '$fromUsername';";
63     $result = execSql($sql);
64     $rownum = mysql_num_rows($result);
65     $score = 0;
66     if($rownum != 0)
67     {
68         $row = mysql_fetch_array($result);
69         $score $row['best_score'];
70     }
71     return $score;
72 }
73 function setSays($fromUsername,$says)
74 {
75     $sql "update wx_turnlight set says = '$says' where open_id = '$fromUsername';";
76     execSql($sql);
77     return "你的宣言已登记,再来一局直接回复1即可!";
78 }
79 function setNickName($fromUsername,$nick_name)
80 {
81     $sql "update wx_turnlight set nick_name = '$nick_name' where open_id = '$fromUsername';";
82     execSql($sql);
83  
84     return "你的大名已经登记在册,请回复你的宣言,当你成为擂主时,这句话会显示在棋盘上方!回复格式如下:\r\n宣言 你要说的话";
85 }

这个游戏的框架就是上面这样,逻辑很简单,如果你有兴趣可以留言索要源码,我很乐意和你讨论这个问题.如果你想先体验这款游戏,可以添加微信号:mylonly123,或者扫描左侧边栏中的二维码.

本文转载自我的博客:http://www.mylonly.com/archives/1220.html

这篇关于利用PHP开发的微信公共平台游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946128

相关文章

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp

一款基于FastAdmin+ThinkPHP+UniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发:控制器、模型、视图、JS一一对应,使用RequireJS进行插件机制,支持插件机制,可以方便地引入第三方插件扩展系统功能。 权限管理:基于完善的Auth权限控制管理,无限父子级权限分组,可自由分配子级权限

视频安防监控EasyCVR视频汇聚管理平台视频播放花屏的原因分析及处理

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中,将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力。 在项目对接过程中,通过GB28181或者ehome这种主动注册是比较常见的接入方式,因为受

Android 开发HTML5应用-总结(不跳转到系统浏览器)

Android开发HTML5应用-总结(在自己aap 里面访问,不跳转到系统浏览器) 时间 2013-01-30 12:02:00   博客园-原创精华区 原文   http://www.cnblogs.com/GhostHorse/archive/2013/01/30/Android_HTML5_WebView.html 主题  Html5  安卓开发 在

中文命名在代码开发中的专业应用:深入探讨与实践指南

在代码开发中,命名是程序员表达思想、组织代码的重要手段。一个好的命名可以提高代码的可读性、理解性和维护性,而一个差的命名则会使代码变得难以理解和维护。 近年来,随着中国软件产业的快速发展,中文编程在国内得到了越来越广泛的应用。使用中文命名可以使代码更加贴近母语使用者,从而提高代码的可读性和理解性。此外,中文命名还可以增强文化自信,并支持软件产品的本地化。 本文将从以下几个方面深入探讨中文命名在

android 安卓开发黄金搭档:android-studio+Genymotion模拟器

安卓开发黄金搭档:android-studio+Genymotion模拟器 目录(?)[+] 转载注明:http://blog.csdn.net/langyuewu/article/details/39196653 最近换了电脑,重新配置安卓开发环境,记录一下: 早期研究安卓开发,用eclipse觉得挺臃肿庞大,后来出了android-studio

Android——开发框架的使用说明

Android开发笔记——android开发框架的使用说明   (2014-06-11 15:43:44) 转载▼ 标签:  android开发   架构   使用说明 分类: Android开发 原文地址:http://www.eoeandroid.com/thread-325185-1-1.html 框架的说明 如果你想看ui方面的东西,这里没有,想要

Android开发:输入法键盘的显示和隐藏

//强制显示键盘 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);   imm.showSoftInput(view,InputMethodManager.SHOW_FORCED);        //强制隐藏键盘 InputMethodManage

Springboot开发 -- Postman 调试 session 验证 接口

当我们在开发Spring Boot应用时,经常会遇到带有Session验证的接口,这些接口需要用户先登录并获取到Session ID(或称为cookie中的JSESSIONID),然后在后续的请求中携带这个Session ID来保持会话状态。下面我将以一个实际的代码案例来展示如何使用Postman来调试这样的接口。 1.浏览器先正常登录系统,获取登录系统中现有请求头中的 Cookie 值 Co

linux下 设置php的环境变量 php: command not found

在自己的根目录进行运行phpinfo();     查看php的根目录。 假如自己查询的目录是/www/wdlinux/apache_php-5.6.21/bin, 查询完成后,先进入linux目录查看下是否存在php文件,如果不存在在附近的相关目录查找一下。肯定可以找到。 在etc/profile文件下增加(查询的路径),例如以下代码 export PATH=$PATH

微信小程序支付中的prepay_id获取方法,以及微信支付统一签名算法闭坑

class Wechat{//公众号的或者小程序支付参数private $appId = "*************";private $appSecret = "*************";//商家的配置信息private $mch_id = "*************";private $mch_key = "*************";//回调地址public $notify_ur