问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

有人用php实现文本相似度算法吗

发布网友 发布时间:2022-04-20 03:57

我来回答

2个回答

懂视网 时间:2022-05-10 05:33

本文主要介绍了关于PHP如何实现我们大家都知道的开心消消乐的算法。

推荐:《PHP视频教程》

一、需求描述:
1、在一个8*8的矩阵方格中随机出现5种颜色的色块。
2、当有三个或以上色块在横向或纵向上相连,则消除这些色块。
3、色块消除后,上方色块往下平移,并掉下颜色随机的色块填充矩阵空缺。
4、重复2、3步骤。
5、消除3个相同色块加10分,4个加15分,5个加20分,6个加30分,7个加40分,8个加70分,9个加100分,10个加150分,再往后每增加一个就比上一个多加50分。

二、上代码

<?php
//所有图形初始化数据,key代表位置,value代表颜色
$xxl = array(
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
 array('', '', '', '', '', '', '', ''),
);
$point = play($xxl, $point);//开始游戏
echo "
共获得积分数量:{$point}";

/*开始消除
 *$xxl array 所有图形集合
 *$point int 获得积分数量
*/
$bu = 0;
function play($xxl, $point){
 global $bu;
 $bu ++;
 echo '=================================开始第'.$bu.'步==================================';
 $color = array(1 => 'red',2 => 'green',3 => 'yellow',4 => 'blue',5 => 'black');//代表5种颜色
 $samCol = array();//列上相连色块集合
 $nowCol = array();//列上相连色块指针
 $samArr = array();//相连色块总集合
 $group = 1;//组指针

 //随机填充颜色,并获得行上相连色块start
 foreach($xxl as $k1 => $v1){
 $sam = array();//行上相连色块集合
 $now = 1;//行上相连色块指针
 foreach($v1 as $k2 => $v2){
 if(empty($v2) || $v2 == ' '){
 $v2 = $xxl[$k1][$k2] = array_rand($color);//随机填充颜色
 }
 if(!isset($nowCol[$k2])){
 $nowCol[$k2] = 1;
 }
 if($k1 === 0){
 $samCol[$k2][$nowCol[$k2]][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2);
 }else{
 if($v2 != $xxl[$k1-1][$k2]){//同一列上和前一个颜色不一样
 $nowCol[$k2] ++;
 }
 $samCol[$k2][$nowCol[$k2]][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2);
 }


 if($k2 === 0){
 $sam[$now][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2);
 }else{
 if($v2 != $xxl[$k1][$k2-1]){//同一行上和前一个颜色不一样
 $now++;
 }
 $sam[$now][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2);
 }
 }
 //获得行上相连色块start
 foreach($sam as $x => $y){
 if(count($y) > 2){
 $key = 'R-'.$group;
 foreach($y as $x2 => $y2){
 $y[$x2]['group']['r'] = $key;
 }
 $samArr += $y;
 $group ++;
 }
 }
 //获得行上相连色块end
 }
 //随机填充颜色,并获得行上相连色块end

 //获得列上相连色块start
 $group = 1;
 foreach($samCol as $k => $v){
 foreach($v as $x => $y){
 if(count($y) > 2){
 $key = 'L-'.$group;
 foreach($y as $x2 => $y2){
 $y[$x2]['group']['l'] = $key;
 if(isset($samArr[$x2]['group']['r'])){//判断本点是否已出现在横向组里
 $samArr[$x2]['group']['l'] = $key;
 }
 }
 $samArr += $y;
 $group ++;
 }
 }
 }
 //获得列上相连色块end

 //查找相连色块start
 $res = array();//相连色块集合
 $hasRes = array();
 foreach($samArr as $k => $v){
 if(isset($hasRes[$k])){
 continue;
 }
 $arr = array();
 seek($samArr, $v, $arr);
 $res[] = array_keys($arr);
 $hasRes += $arr;
 }
 //查找相连色块end
 show($xxl);//打印消除前的图形
 if(empty($res)){//如果没有相连色块则退出递归
 echo '=================================消除完毕!==================================';
 return $point;
 }
 $thisPoint = countPoint($res);//计算本次消除获得积分
 $point += $thisPoint;//累计到总积分

 //消除相连色块start
 $next = $xxl;
 foreach($res as $k => $v){
 foreach($v as $k2 => $v2){
 $y = $samArr[$v2][0];
 $x = $samArr[$v2][1];
 $xxl[$y][$x] = '*';
 unset($next[$y][$x]);
 }
 }
 //消除相连色块end

 show($xxl);//打印消除时的图形
 $next = step($next);
 show($next);//打印消除后的图形
 echo "本次消除获得积分数量:{$thisPoint}
";
 return play($next, $point);
}

/*计算获得积分数量
 *$xxl array 相连色块集合
 */
function countPoint($xxl){
 //初始化积分配置start
 $config = array(3 => 10, 4 => 15, 5 => 20, 6 => 30, 7 => 40, 8 => 70, 9 => 100);
 for($i = 10; $i <= 64; $i++){
 $config[$i] = 100 + ($i - 9) * 50;
 }
 //初始化积分配置end
 $point = 0;
 foreach($xxl as $v){
 $key = count($v);
 $point += $config[$key];
 }
 return $point;
}

/*消掉并左移
 *$xxl array 所有图形集合
 */
function step($xxl){
 foreach($xxl as $k => $v){
 $temp = array_merge($v);
 $count = count($temp);
 if($count == 8){
 continue;
 }
 for($i = $count; $i <= 7; $i++){
 $temp[$i] = ' ';
 }
 $xxl[$k] = $temp;
 }
 return $xxl;
}

/*找相邻点
 *$xxl array 相连图形集合
 *$one array 某一个点
 *$arr array 图形集合里的相邻的点
*/
function seek($xxl, $one, &$arr){
// global $i;
 $near = array();
 $near['up'] = ($one[0] - 1).'-'.$one[1];//上面的点
 $near['down'] = ($one[0] + 1).'-'.$one[1];//下面的点
 $near['left'] = $one[0].'-'.($one[1] - 1);//左面的点
 $near['right'] = $one[0].'-'.($one[1] + 1);//右面的点
 foreach($near as $v){
 if(isset($xxl[$v]) && $xxl[$v][2] == $one[2]){//找到相邻点
 $xj = array_intersect($one['group'], $xxl[$v]['group']);
 if(empty($xj)){//如果相邻的点不是本组的就跳过
 continue;
 }
 if(isset($arr[$v])){//如果该点已被遍历过则跳过
 continue;
 }
 $arr[$v] = $xxl[$v];
 seek($xxl, $xxl[$v], $arr);//继续找相邻的点
 }
 }
}

/*打印图形
 *$xxl array 所有图形集合
 */
function show($xxl){
 //顺时针旋转矩阵start
 $arr = array();
 foreach($xxl as $k => $v){
 foreach($v as $k2 => $v2){
 $arr[7-$k2][$k] = $v2;
 }
 }
 ksort($arr);
 //顺时针旋转矩阵end
 $str = '';
 foreach($arr as $v){
 foreach($v as $v2){
 $str .= ' '.$v2;
 }
 $str .= "
";
 }
 echo "
".$str;
}

运行结果如下:

12345分别代表5种颜色。

=================================开始第1步==================================
 3 3 2 2 1 1 1 4
 4 3 4 3 4 1 1 3
 3 1 4 1 1 4 1 2
 2 3 4 3 1 2 4 4
 4 2 4 2 2 2 1 4
 3 3 2 1 2 3 1 1
 5 2 1 3 2 1 4 5
 3 4 5 1 3 2 3 3

 3 3 2 2 * * * 4
 4 3 * 3 4 1 * 3
 3 1 * 1 1 4 * 2
 2 3 * 3 1 2 4 4
 4 2 * * * * 1 4
 3 3 2 1 * 3 1 1
 5 2 1 3 * 1 4 5
 3 4 5 1 3 2 3 3

 3 3 4
 4 3 2 3
 3 1 3 1 2
 2 3 1 4 4 4
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3
本次消除获得积分数量:55
=================================开始第2步==================================
 3 3 2 2 3 3 2 4
 4 3 3 2 1 3 3 3
 3 1 3 3 4 1 4 2
 2 3 5 1 2 4 4 4
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3

 3 3 2 2 3 3 2 4
 4 3 3 2 1 * * *
 3 1 3 3 4 1 4 2
 2 3 5 1 2 * * *
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3

 3 3 2 2 3
 4 3 3 2 1
 3 1 3 3 4 3 2 4
 2 3 5 1 2 1 4 2
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3
本次消除获得积分数量:20
=================================开始第3步==================================
 3 3 2 2 3 4 1 3
 4 3 3 2 1 4 2 5
 3 1 3 3 4 3 2 4
 2 3 5 1 2 1 4 2
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3
=================================消除完毕!==================================
共获得积分数量:75

热心网友 时间:2022-05-10 02:41

本文实例讲述了PHP简单实现文本计数器的方法。分享给大家供大家参考,具体如下:
<?php if (file_exists('count_file.txt')) { $fil = fopen('count_file.txt', r); $dat = fread($fil, filesize('count_file.txt')); echo $dat+1; fclose($fil); $fil = fopen('count_file.txt', w); fwrite($fil, $dat+1); } else { $fil = fopen('count_file.txt', w); fwrite($fil, 1); echo '1'; fclose($fil); } ?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php正则表达式用法总结》、《PHP+ajax技巧与应用小结》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
“泛览周王传”的出处是哪里 避事的意思是什么 怠息的意思是什么 “偷闲来此一嚬呻”的出处是哪里 怠息意思和来源是什么 客厅中间沙发旁旁边放什么 客厅沙发旁边放什么合适 沙发左右摆什么位置 淘宝网无法注册邮箱验证 谁能帮我注册一个谷歌帐号,我一直注册不成功,淘宝上也买不到,在线等... 求3个开黑的游戏名字 8字以内就好了 一定要骚 3个... 如何通过词向量技术来计算2个文档的相似度? 五人开黑骚气游戏名字怎么取? 如何用python计算文本的相似度 三人开黑骚气的名字有哪些? 请问下面相似度计算公式代表什么意思,他是如何计... 王者荣耀两个基友取什么名字好,要搞笑的 如何计算多个文本的相似度java程序,利用向量 王者荣耀霸气双人名字基友 如何用wordnet计算 文本相似度 算法实现 如何计算两个文档的相似度 如何计算文档相似性 怎样用python或者是java计算文本相似度 如何计算两个文本内容的相似度? 双语文本相似度计算的工具有哪些 笔记本电脑好几天没用,今天用的时候开不了机,插上电源线,电源指示灯也不亮,这是什么原因?能修吗?... 10篇100~200字的暑假日记 求16篇50-100字暑假日记 中学生暑假周记,100字。谁能给我? 小学生暑假日记100字 (五则) 求lol三人开黑名字 骚气的那种 Excel文本相似度 三人开黑独特好听的名字有哪些? 如何用深度学习更好的的解一个短文本相似度计算问题 求两个LOL的开黑名字,不要非主流的,古风一点的,... lol开黑名字4个 中文短句相似度匹配方法? 怎样计算两篇文档的相似度 小米移动电源2代和小米移动电源1有什么区别 小米移动电源有哪些型号? 小米移动电源说明书 小米的移动电源怎么样?好用吗?质量怎么样? 小米移动电源第一次怎么充电 小米移动电源共有哪几款? 小米移动电源第一次充电要充多久? 小米移动电源电源开关键有什么用? 小米移动电源无法为手机充电 2×DC 5.1V/2.1A MAX3.6A什么意思,只给一个手机充... 小米移动电源给手机充电冲一下断一下怎么解决? 小米移动电源为什么充不了电? 情况如下点击电源指...