利用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

相关文章

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建