利用workerman+html开发简单的在线五子棋对战
2019独角兽企业重金招聘Python工程师标准>>>
一、workerman下载,地址:https://github.com/walkor/workerman
二、cd到workerman项目根目录下,在workerman根目录下新建game.php,然后编写五子棋服务端交互代码,最后命令启动已经写好的五子棋服务器
sudo php game.php start
game.php的代码如下:
<?php
use Workerman\Worker;require_once __DIR__ . '/Autoloader.php';$global_uid = 0;
//棋盘大小,默认15行15列
$global_i = 15;
$global_j = 15;// 当客户端连上来时分配uid
function handle_connection($connection)
{global $text_worker, $global_uid, $global_i, $global_j;// 为这个链接分配一个uid$connection->uid = ++$global_uid;$text_worker->uidConnections[$connection->uid] = array('cons' => $connection);$text_worker->user_data[$connection->uid] = array('playing' => 0, 'name' => 'player' . $connection->uid, 'qipan' => array(), 'type' => 0, 'move' => 0);$json = array('status' => 1, 'msg' => '', 'data' => array());$json['data']['name'] = $text_worker->user_data[$connection->uid]['name'];$connection->send(json_encode($json)); //生成玩家昵称echo "player {$connection->uid} connected!\n";//分配对手foreach ($text_worker->user_data as $k => $val) {/*var_dump($val['playing']);*/if ($val['playing'] == 0 && $k != $connection->uid) {//初始化棋盘$init_data = array();for ($i = 0; $i <= $global_i; $i++) {for ($j = 0; $j <= $global_j; $j++) {$init_data[$i][$j] = 0;}}$text_worker->user_data[$k]['qipan'] = $init_data;$text_worker->user_data[$connection->uid]['qipan'] = $init_data;$text_worker->user_data[$k]['playing'] = $connection->uid;$text_worker->user_data[$connection->uid]['playing'] = $k;//分配红黑方$text_worker->user_data[$k]['type'] = 1;$text_worker->user_data[$k]['move'] = 1;$text_worker->user_data[$connection->uid]['type'] = 2;$text_worker->user_data[$connection->uid]['move'] = 0;$json = array('status' => 2, 'msg' => '初始化棋盘...', 'data' => array());$json['data']['qipan'] = $init_data;$text_worker->uidConnections[$k]['cons']->send("为你匹配到对手{$text_worker->user_data[$connection->uid]['name']}!");$text_worker->uidConnections[$connection->uid]['cons']->send("为你匹配到对手{$val['name']}!");break;}}/*var_dump($text_worker->user_data);*/
}// 当客户端发送消息过来时
function handle_message($connection, $data)
{global $text_worker, $global_i, $global_j;$data = json_decode($data, true);if ($data['status'] == 2 && $text_worker->user_data[$connection->uid]['playing'] > 0 && $text_worker->user_data[$connection->uid]['move'] == 1) {$my_uid = $connection->uid;$your_uid = $text_worker->user_data[$my_uid]['playing'];$qipan = $text_worker->user_data[$your_uid]['qipan'];$press = explode('_', $data['data']);if (!empty($press)) {$press_val = $qipan[$press[0]][$press[1]];if ($press_val != 0) {return;} else {$qipan[$press[0]][$press[1]] = $text_worker->user_data[$my_uid]['type'];$text_worker->user_data[$my_uid]['qipan'] = $qipan;$text_worker->user_data[$your_uid]['qipan'] = $qipan;$text_worker->user_data[$your_uid]['move'] = 1;$text_worker->user_data[$my_uid]['move'] = 0;$json = array('status' => 2, 'msg' => '', 'data' => array());$json['data']['type'] = $text_worker->user_data[$my_uid]['type'];$json['data']['press_i'] = $press[0];$json['data']['press_j'] = $press[1];$text_worker->uidConnections[$my_uid]['cons']->send(json_encode($json));$text_worker->uidConnections[$your_uid]['cons']->send(json_encode($json));$count = get_who_win($qipan, $press[0], $press[1], $text_worker->user_data[$my_uid]['type'], $global_i, $global_j);file_put_contents('./qipan', json_encode($qipan));if ($count >= 5) { //分出胜负$json = array('status' => 3, 'msg' => $text_worker->user_data[$my_uid]['name'] . ' Win !', 'data' => array());$json['data']['type'] = $text_worker->user_data[$my_uid]['type'];$text_worker->uidConnections[$my_uid]['cons']->send(json_encode($json));$text_worker->uidConnections[$your_uid]['cons']->send(json_encode($json));}}}}}// 当客户端断开时,广播给所有客户端
function handle_close($connection)
{global $text_worker;/*foreach ($text_worker->connections as $conn) {$conn->send("user[{$connection->uid}] logout");}*/
}/*** 判断输赢* $qipan 棋盘数据* $i 下子时的横坐标* $i 下子时的纵坐标* $type 1黑方 2红方* $global_i 棋盘边界值* $global_j 棋盘边界值*/
function get_who_win($qipan = array(), $i = -1, $j = -1, $type = 0, $global_i = 0, $global_j = 0)
{$count = 0;$temp_type = $type;if (empty($qipan) || $i < 0 || $j < 0 || $type <= 0) {return $count;}echo json_encode($qipan)."\n";echo 'i=' . $i . '|j=' . $j . '|type=' . $type . '|gi=' . $global_i . '|gj=' . $global_j . "\n";/*左右上下的判断*/$count = 1;$a = array(0 => array('index' => $j, 'border' => $global_j), //左右,1 => array('index' => $i, 'border' => $global_i) //上下);for ($round = 0; $round <= 1; $round++) {$mov1_num = 1;$mov2_num = 1;while (true) {$mov1 = $a[$round]['index'] + $mov1_num;$mov2 = $a[$round]['index'] - $mov2_num;$temp_mov1 = $temp_mov2 = -1;if ($mov1_num > 0) {if ($round == 0 && $mov1 <= $global_j) {$temp_mov1 = $qipan[$i][$mov1];var_dump($i.','.$mov1.','.$temp_mov1);} elseif ($round == 1 && $mov1 <= $global_i) {$temp_mov1 = $qipan[$mov1][$j];}if ($temp_mov1 == $temp_type) {$count++;var_dump('count='.$count);$mov1_num++;} else {$mov1_num = 0;}} else {$mov1_num = 0;}if ($mov2 >= 0 && $mov2_num > 0) {if ($round == 0) {$temp_mov2 = $qipan[$i][$mov2];var_dump($i.','.$mov2.','.$temp_mov1);} elseif ($round == 1) {$temp_mov2 = $qipan[$mov2][$j];}if ($temp_mov2 == $temp_type) {$count++;$mov2_num++;} else {$mov2_num = 0;}} else {$mov2_num = 0;}if ($count >= 5) {return $count;}if (($mov1_num == 0 && $mov2_num == 0)) {break;}}}/*斜角的判断*/$count = 1;for ($round = 0; $round <= 1; $round++) {$mov1_num = 1;$mov2_num = 1;while (true) {$temp_mov1 = $temp_mov2 = -1;if (($i - $mov1_num) >= 0 && ($j - $mov1_num) >= 0 && ($j + $mov1_num) <= $global_j && $mov1_num > 0) {if ($round == 0) {$temp_mov1 = $qipan[$i - $mov1_num][$j + $mov1_num];} elseif ($round == 1) {$temp_mov1 = $qipan[$i - $mov1_num][$j - $mov1_num];}if ($temp_mov1 == $temp_type) {$count++;$mov1_num++;} else {$mov1_num = 0;}} else {$mov1_num = 0;}if (($i + $mov2_num) <= $global_i && ($j - $mov2_num) >= 0 && ($j + $mov2_num) <= $global_j && $mov2_num > 0) {if ($round == 0) {$temp_mov2 = $qipan[$i + $mov2_num][$j - $mov2_num];} elseif ($round == 1) {$temp_mov2 = $qipan[$i + $mov2_num][$j + $mov2_num];}if ($temp_mov2 == $temp_type) {$count++;$mov2_num++;} else {$mov2_num = 0;}} else {$mov2_num = 0;}if ($count >= 5) {return $count;}if (($mov1_num == 0 && $mov2_num == 0)) {break;}}}return $count;
}// 创建一个文本协议的Worker监听2347接口
$text_worker = new Worker("websocket://0.0.0.0:2347");// 只启动1个进程
$text_worker->count = 1;
$text_worker->uidConnections = array();
$text_worker->user_data = array();
$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';Worker::runAll();
三、编写web端客户端代码,这里报存为client.php
<!DOCTYPE html>
<html>
<head><title></title><script type="text/javascript" src="./js/jquery.min.js"></script>
</head>
<body>
<h3 class="player">玩家</h3>
<table border="1"><?phpfor ($i = 0;$i <= 15; $i++) {?><tr><?phpfor ($j = 0; $j <= 15; $j++) {?><td style="width: 40px;height: 40px;position: relative;" id="<?php echo $i;?>_<?php echo $j;?>"onclick="press_on(this)"><div style="background:#000000;width: 20px;height: 20px;position: absolute;border-radius: 50%;display: none;left: 10px;bottom: 10px"id="div_<?php echo $i;?>_<?php echo $j;?>"></div></td><?php}}?></table><script>ws = new WebSocket("ws://127.0.0.1:2347");ws.onopen = function () {// alert("连接成功");//ws.send('tom');//alert("给服务端发送一个字符串:tom");};ws.onmessage = function (e) {//alert("收到服务端的消息:" + e.data);var jsonobj = eval('(' + e.data + ')');if (jsonobj.status == 1 && jsonobj.data.name != null) {//初始化名字alert(jsonobj.data.name);$('.player').html(jsonobj.data.name);}if (jsonobj.status == 2) {//var type = jsonobj.data.type;var press_i = jsonobj.data.press_i;var press_j = jsonobj.data.press_j;id = '#div_' + press_i + '_' + press_j;$(id).css('display', 'block');if (type == 1) {$(id).css('background', '#000000');}if (type == 2) {$(id).css('background', '#ffbc00');}}if (jsonobj.status == 3) {//var msg = jsonobj.msg;var r = confirm(msg + ',play again?');if (r) {window.location.reload(true);return;} else {return;}}};function press_on(value) {var send = '{"status":2,"data":"' + value.id + '"}';ws.send(send);}
</script></body>
</html>
四,最后在浏览器地址访问client.php,进入游戏。
服务器截图:
转载于:https://my.oschina.net/u/2394701/blog/860269
利用workerman+html开发简单的在线五子棋对战相关推荐
- php workman游戏,利用workerman+html开发简单的在线五子棋对战
一.workerman下载,地址:https://github.com/walkor/workerman 二.cd到workerman项目根目录下,在workerman根目录下新建game.php,然 ...
- 在线五子棋对战测试用例
文章目录 在线五子棋对战测试用例 自动化测试地址 在线五子棋对战测试用例 自动化测试地址 自动化测试地址
- 利用JavaScript写一个简单的在线秒表
HTML代码如下: <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
- react + nodejs 在线五子棋对战平台
gitee地址:https://gitee.com/alen_ou/Gobang 在线对战地址:http://106.52.176.106:8099/ 核心代码: server.js var expr ...
- Node.js+Socket.io实现双人在线五子棋对战
笔者建议读者在尝试写程序之前要先确保电脑已经安装了Node.js和NPM,一般两者都是在一块安装,五子棋程序的服务器端使用Node.js写的,不多说了,直接上代码. 服务器端代码:socket.js ...
- 在线五子棋对战 --- 人机对战的实现
文章目录 1. 人机对战 1.1 演示 1.2 评分表 1.3 算法思路 1.4 具体代码 1.4.1 评分表方法 1.4.2 横向得分方法 1.4.3 纵向得分方法 1.4.4 左斜得分方法 1.4 ...
- 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计(附源码)
大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计 目录 一.项目简介 二.系统核心功能模块部分截图 2.1用户登陆的设计与实现 2.2 ...
- 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline
使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...
- Android 开发--利用android studio 制作简单文字打怪升级游戏(伪地牢类)1.开始
本人目前是大三考研党,之前有学过一些杂七杂八的知识,但是没有办法利用这些知识制作一些真正有用的东西出来.后来自学了android开发,学会使用了android studio,终于决定利用android ...
最新文章
- 在 VC6 中使用 GdiPlus-使用
- 灯泡亮度控制单片机_如何延长投影机灯泡使用寿命 延长投影机灯泡使用寿命方法【介绍】...
- html视频海报代码,如何在网站头部添加视频海报?添加视频海报的方法(代码示例)...
- 嵌入式培训学习历程第二十二天
- php无法查询mysql字母,php – 无法在Multi MYSQL查询语句中获取结果
- Apache 工作模式配置优化
- easyui 添加下拉框数据_功能更新:熟用仪表盘这个功能,你可以少建90%的数据报表...
- SQLite第九课 sqlite3_set_authorizer案例
- js学习笔记——函数定义
- 武大计算机考研 932教材,2018武汉大学考研官方指定参考书目
- 招生报名小程序开发笔记二:功能需求设计
- linux中屏蔽定时任务,linux中的定时任务
- 广州大学--金融股票数据分析
- 柯西定理与留数定理的应用总结
- 使用CSS达到阴阳八卦图等图形
- (个人)太极拳学习系统创新实训第一周(一)
- 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库
- mp4文档ISO/IEC 14496 part 12解读
- 转:加密的惨剧!慎用文件夹加密软件!
- C语言中特殊浮点数:-1.#IND00和NAN
热门文章
- mysql union order by_MySQL order by 在 union 中使用实例分析
- 一文攻破枚举类型-C语言
- 蛋白提取纯化的方法、注意事项及常见问题解答
- Android studio | From Zero To One ——初级控件(屏幕显示)
- tcc(tiny cc)的作者是谁,对tcc的特点做描述?
- VC编写的程序不能在其他机器上运行的解决方案(续)
- 关于计算机和人物的英语短文,人脑和电脑英语作文
- 如何成为android开发工程师,android开发工程师薪资 如何成为一名合格的android开发工程师?...
- TensorFlow 笔记4--使用tensorboard
- 第四范式陈雨强:做机器学习平台天然就是新基建丨新基建50人