本文主要是介绍利用PHP开发的微信公共平台游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一直想利用微信公告平台提供的接口开发一个文字类型游戏,但是苦于没有什么点子,知道看到redraiment在OSChina上托管的微信游戏--开窗,让我觉得我也可以完成此类文字游戏的开发.redraiment利用的是Emacs Lisp脚本语言完成的,可惜我对这个脚本完全没有了解,而且我的微信接口环境是基于PHP的,所以就没办法参考他的源码了,好在游戏模式十分简单,不必利用redrainment提供的框架也可以完成这样一款文字游戏.
游戏规则很简单,1个5x5(或者其他规格)的棋盘,每改变其中一个棋子的状态(每个棋子都有两种对应的状态,用两种不同的颜色表示),其上,下,左,右四个位置的棋子状态也会跟着改变,如果你能将所有棋子的状态都变成其相对的状态,游戏就结束了.
首先说整个游戏本身,我选择了利用0和1的字符来表示棋子的两种状态,每个棋盘都是1个含有0和1的25个字符(暂时是基于5x5棋盘),写了一个translate函数专门将这个长度未25的字符串转换成表示特殊的棋子(以下代码都是基于PHP)
01 | function translateLight($string) |
06 | $strArray = array_chunk(str_split($string),5); |
08 | for($i = 0;$i < 5;$i++) |
10 | for ($j = 0;$j < 5;$j++) |
12 | if(!strcmp($strArray[$i][$j],"0")) |
16 | elseif(!strcmp($strArray[$i][$j],"1")) |
上述代码中的作为棋子的特殊字符是Mac下的特殊字符,其非标准的ASCII字符,但是在微信上可以显示出如下效果,图中的绿色和紫色圆圈就是代码中的$blue和$purple中保存的字符.

有了基本的状态字符,同时我就需要将状态保存到数据库,每次用户发来指定的游戏消息(本例中游戏指定是数字,只要用户回复了数字类型,就是开始这个游戏),就会从数据库中将这个用户之前的游戏状态取出,然后根据其数字指令区处理整个棋盘的状态,将处理后的棋盘状态再发送给用户.
01 | function turnLight($keyword,$fromUsername) |
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); |
11 | $row = mysql_fetch_array($result); |
12 | $header = $header."擂主:".$row['nick_name']."\r\n总步数:".$row['best_score']."\r\n擂主宣言:".$row['says']; |
19 | if(strlen($keyword) == 1) |
21 | if(!strcmp($keyword,"1")) |
23 | $str = getLightState($fromUsername); |
24 | $response = translateLight($str); |
26 | else if(!strcmp($keyword,"2")) |
28 | $str = "1111111111111111111111111"; |
29 | setLightState($fromUsername,$str); |
30 | setScore($fromUsername,0); |
31 | return "游戏已退出,所有灯的状态恢复初始状态!"; |
34 | else if(strlen($keyword) == 2) |
36 | $str = getLightState($fromUsername); |
37 | $str = processLight($str,$keyword); |
39 | $score = getScore($fromUsername); |
40 | $newScore = (int)$score + 1; |
41 | $footer = "\r\n当前步数:$score"; |
42 | setScore($fromUsername,$newScore); |
46 | $footer .= "\r\n你赢了!恭喜你!请回复您的昵称,格式如下:\r\n昵称 你的大名"; |
47 | setBestScore($fromUsername,$newScore); |
48 | $str = "1111111111111111111111111"; |
49 | setLightState($fromUsername,$str); |
50 | setScore($fromUsername,0); |
52 | setLightState($fromUsername,$str); |
53 | $response = translateLight($str); |
55 | return $header."\r\n".$response.$footer; |
状态的更改算法很简单,又一个二维数组存储棋子的状态,根据用户所给坐标来改变所有5个点的值就可以了.
01 | function processLight($str,$order) |
04 | $array = array_chunk(str_split($str),5); |
06 | if(strlen($order) != 2) |
08 | return "命令有误,必须是两位数字"; |
10 | $ord_array = str_split($order); |
12 | $x = (int)$ord_array[0]; |
13 | $y = (int)$ord_array[1]; |
16 | for($i = 0; $i < 5;$i++) |
18 | for($j = 0;$j < 5;$j++) |
21 | if(($j == $x-1) && ($i == $y)) |
23 | $newStr .= zero2one($array[$i][$j]); |
25 | elseif(($j == $x+1) && ($i == $y)) |
27 | $newStr .= zero2one($array[$i][$j]); |
29 | elseif(($j == $x) && ($i == $y-1)) |
31 | $newStr .= zero2one($array[$i][$j]); |
33 | elseif(($j == $x) && ($i == $y+1)) |
35 | $newStr .= zero2one($array[$i][$j]); |
37 | elseif(($j == $x) && ($i == $y)) |
39 | $newStr .=zero2one($array[$i][$j]); |
43 | $newStr .= $array[$i][$j]; |
这里面同时还需要几个数据库连接的函数,用来将棋盘状态存放进数据库以及从数据库中读取状态,若干函数如下:
01 | function execSql($sql) |
05 | $con = mysql_connect("localhost",$sqluser,$sqlpwd); |
08 | return 'Could not Connect: '.mysql_error(); |
10 | mysql_select_db("wordpress",$con); |
11 | $result = mysql_query($sql); |
16 | function getLightState($fromUsername) |
18 | $sql = "select state from wx_turnlight where open_id = '$fromUsername';"; |
19 | $result = execSql($sql); |
20 | $rownum = mysql_num_rows($result); |
24 | $row = mysql_fetch_array($result); |
25 | $state = $row['state']; |
29 | function getScore($fromUsername) |
31 | $sql = "select score from wx_turnlight where open_id = '$fromUsername';"; |
32 | $result = execSql($sql); |
33 | $rownum = mysql_num_rows($result); |
37 | $row = mysql_fetch_array($result); |
38 | $score = $row['score']; |
43 | function setLightState($fromUsername,$state) |
45 | $sql = "update wx_turnlight set state = '$state' where open_id = '$fromUsername';"; |
49 | function setScore($fromUsername,$score) |
51 | $sql = "update wx_turnlight set score = $score where open_id = '$fromUsername';"; |
54 | function setBestScore($fromUsername,$score) |
56 | $sql = "update wx_turnlight set best_score = $score where open_id = '$fromUsername';"; |
60 | function getBestScore($fromUsername) |
62 | $sql = "select best_score from wx_turnlight where open_id = '$fromUsername';"; |
63 | $result = execSql($sql); |
64 | $rownum = mysql_num_rows($result); |
68 | $row = mysql_fetch_array($result); |
69 | $score = $row['best_score']; |
73 | function setSays($fromUsername,$says) |
75 | $sql = "update wx_turnlight set says = '$says' where open_id = '$fromUsername';"; |
77 | return "你的宣言已登记,再来一局直接回复1即可!"; |
79 | function setNickName($fromUsername,$nick_name) |
81 | $sql = "update wx_turnlight set nick_name = '$nick_name' where open_id = '$fromUsername';"; |
84 | return "你的大名已经登记在册,请回复你的宣言,当你成为擂主时,这句话会显示在棋盘上方!回复格式如下:\r\n宣言 你要说的话"; |
这个游戏的框架就是上面这样,逻辑很简单,如果你有兴趣可以留言索要源码,我很乐意和你讨论这个问题.如果你想先体验这款游戏,可以添加微信号:mylonly123,或者扫描左侧边栏中的二维码.
本文转载自我的博客:http://www.mylonly.com/archives/1220.html
这篇关于利用PHP开发的微信公共平台游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!