本文主要是介绍利用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开发的微信公共平台游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!