参考内容网址如下:
https://bbs.egret.com/thread-47694-1-1.html?tdsourcetag=s_pcqq_aiomsg
https://www.jianshu.com/p/9d5f40603d8c
具体解释
1、以麻将为例
玩家A、B、C、D 座位如下
C 2
D 3 B1
A 0
首先获取所有玩家的服务器位置:Index = 0,1,2,3
加入现在是B的视角
则:移位 = B.index 1 - 0 = 1 ,说明移动一个位置
新座位的序号:
B = B.index - 移位 = 1-1 = 0
C = C.index - 移位 = 2-1 = 1
D = D.index - 移位 = 3-1 = 2
A = A.index - 移位 = 0 - 1 = -1,如果是负数,则+总人数4:-1+4=3
同理:C的视角
移位= C.index 2-0 = 2
C = C.index - 移位 = 2-2 = 0
D = D.index - 移位 = 3-2 = 1
A = A.index - 移位 = 0 - 2 = -2,如果是负数,则+总人数4:-2+4=2
B = B.index - 移位 = 1 - 2 = -1,如果是负数,则+总人数4:-1+4=3
同理:D的视角
移位= D.index 3-0 = 3
D = D.index - 移位 = 3 - 3 = 0
A = A.index - 移位 = 0 - 3 = -3,如果是负数,则+总人数4:-3+4=1
B = B.index - 移位 = 1 - 3 = -2,如果是负数,则+总人数4:-2+4=2
C = C.index - 移位 = 2 - 3 = -1,如果是负数,则+总人数4:-1+4=3
2、斗地主位置算法同理
C 2 B 1
A0
首先获取所有玩家的服务器位置:Index = 0,1,2
加入现在是B的视角
则:移位 = B.index 1 - 0 = 1 ,说明移动一个位置
新座位的序号:
B = B.index - 移位 = 1-1 = 0
C = C.index - 移位 = 2-1 = 1
A = A.index - 移位 = 0 - 1 = -1,如果是负数,则+总人数3:-1+3=2
同理:C的视角
移位= C.index 2-0 = 2
C = C.index - 移位 = 2 - 2 = 0
A = A.index - 移位 = 0 - 2 = -2,如果是负数,则+总人数3:-2+3=1
B = B.index - 移位 = 1 - 2 = -1,如果是负数,则+总人数3:-1+3=2
另一种
我也来分享一个位置算法,一半所有的都能适用,思路和楼主的不同~ 假设五人场,服务器会首先返回自己的座位号:
我们的思路是服务器有服务器的座位号,我们客户端有自己的座位号,只要做对应的映射就行。在视图上自己的位置永远是0
只要初始化一次table,然后每次服务器返回座位,根据映射找自己的位置就可以了
C#版
class Program
{
static int[] seatTable = { 0, 1, 2, 3 };
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
string str = "";
for (int i=0;i<seatTable.Length;i++) {
str = "";
seatTalbleInit(i);
for (int j = 0; j < seatTable.Length; j++)
{
str = str + "" + getViewSeat(j) + ',';
}
Console.WriteLine("-->"+ str);
}
}
static void seatTalbleInit(int selfSeat) {
for (int i = 0; i < seatTable.Length; i++)
{
if (i == 0)
{
seatTable[0] = selfSeat;
}
else {
seatTable[i] = seatTable[i - 1] + 1;
seatTable[i] = seatTable[i] % seatTable.Length;
}
}
}
static int getViewSeat(int xyseat) {
for (var i = 0; i < seatTable.Length; i++)
{
if (seatTable[i] == xyseat)
{
return i;
}
}
return -1;
}
}
js版
var seatTable = [0, 1, 2, 3,4]
function seatTalbleInit(selfSeat) {
seatTable.forEach((item, index) => {
if (index == 0) {
seatTable[0] = selfSeat;
} else {
seatTable[index] = seatTable[index - 1] + 1;
seatTable[index] = seatTable[index] % seatTable.length;
}
})
}
function getViewSeat(xyseat) {
for (var i = 0; i < seatTable.length; i++) {
if (seatTable[i] == xyseat) {
return i;
}
}
}
var str = '';
for(let i=0;i<seatTable.length;i++){
str = '';
seatTalbleInit(i)
for(let j=0;j<seatTable.length;j++){
str = str + '' + getViewSeat(j) + ','
}
console.log( '-->' + str );
}
第二种 js版
_maxNum 最大人数
i 自己所在座位
j 服务器座位
ret 本地位置
var seatTable2 = [0, 1, 2, 3]
var _maxNum = seatTable2.length
for(let i=0;i<seatTable2.length;i++){
str = '';
for(let j=0;j<seatTable2.length;j++){
let ret = (j - i + _maxNum) % _maxNum;
str = str + '' + ret + ','
}
console.log( '-->' + str );
}
参考四人
当myChairId == 0 时,// 0123
当myChairId == 1时,// 3012
当myChairId == 2 时,//2301
当myChairId == 3 时,//1230
证明公式是正确的