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开发简单的在线五子棋对战相关推荐

  1. php workman游戏,利用workerman+html开发简单的在线五子棋对战

    一.workerman下载,地址:https://github.com/walkor/workerman 二.cd到workerman项目根目录下,在workerman根目录下新建game.php,然 ...

  2. 在线五子棋对战测试用例

    文章目录 在线五子棋对战测试用例 自动化测试地址 在线五子棋对战测试用例 自动化测试地址 自动化测试地址

  3. 利用JavaScript写一个简单的在线秒表

    HTML代码如下: <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  4. react + nodejs 在线五子棋对战平台

    gitee地址:https://gitee.com/alen_ou/Gobang 在线对战地址:http://106.52.176.106:8099/ 核心代码: server.js var expr ...

  5. Node.js+Socket.io实现双人在线五子棋对战

    笔者建议读者在尝试写程序之前要先确保电脑已经安装了Node.js和NPM,一般两者都是在一块安装,五子棋程序的服务器端使用Node.js写的,不多说了,直接上代码. 服务器端代码:socket.js ...

  6. 在线五子棋对战 --- 人机对战的实现

    文章目录 1. 人机对战 1.1 演示 1.2 评分表 1.3 算法思路 1.4 具体代码 1.4.1 评分表方法 1.4.2 横向得分方法 1.4.3 纵向得分方法 1.4.4 左斜得分方法 1.4 ...

  7. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计(附源码)

    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦. 基于安卓app开发项目(在线数独对战游戏平台)的毕业设计 目录 一.项目简介 二.系统核心功能模块部分截图 2.1用户登陆的设计与实现 2.2 ...

  8. 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline

    使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...

  9. Android 开发--利用android studio 制作简单文字打怪升级游戏(伪地牢类)1.开始

    本人目前是大三考研党,之前有学过一些杂七杂八的知识,但是没有办法利用这些知识制作一些真正有用的东西出来.后来自学了android开发,学会使用了android studio,终于决定利用android ...

最新文章

  1. 在 VC6 中使用 GdiPlus-使用
  2. 灯泡亮度控制单片机_如何延长投影机灯泡使用寿命 延长投影机灯泡使用寿命方法【介绍】...
  3. html视频海报代码,如何在网站头部添加视频海报?添加视频海报的方法(代码示例)...
  4. 嵌入式培训学习历程第二十二天
  5. php无法查询mysql字母,php – 无法在Multi MYSQL查询语句中获取结果
  6. Apache 工作模式配置优化
  7. easyui 添加下拉框数据_功能更新:熟用仪表盘这个功能,你可以少建90%的数据报表...
  8. SQLite第九课 sqlite3_set_authorizer案例
  9. js学习笔记——函数定义
  10. 武大计算机考研 932教材,2018武汉大学考研官方指定参考书目
  11. 招生报名小程序开发笔记二:功能需求设计
  12. linux中屏蔽定时任务,linux中的定时任务
  13. 广州大学--金融股票数据分析
  14. 柯西定理与留数定理的应用总结
  15. 使用CSS达到阴阳八卦图等图形
  16. (个人)太极拳学习系统创新实训第一周(一)
  17. 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库
  18. mp4文档ISO/IEC 14496 part 12解读
  19. 转:加密的惨剧!慎用文件夹加密软件!
  20. C语言中特殊浮点数:-1.#IND00和NAN

热门文章

  1. mysql union order by_MySQL order by 在 union 中使用实例分析
  2. 一文攻破枚举类型-C语言
  3. 蛋白提取纯化的方法、注意事项及常见问题解答
  4. Android studio | From Zero To One ——初级控件(屏幕显示)
  5. tcc(tiny cc)的作者是谁,对tcc的特点做描述?
  6. VC编写的程序不能在其他机器上运行的解决方案(续)
  7. 关于计算机和人物的英语短文,人脑和电脑英语作文
  8. 如何成为android开发工程师,android开发工程师薪资 如何成为一名合格的android开发工程师?...
  9. TensorFlow 笔记4--使用tensorboard
  10. 第四范式陈雨强:做机器学习平台天然就是新基建丨新基建50人