本页主题: [游戏四十一]抽签器算法检查 打印 | 加为IE收藏 | 复制链接 | 收藏主题 | 上一主题 | 下一主题

[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 [游戏四十一]抽签器算法检查

Copy code
function calcuate() {
  var roles = document.getElementById("roles").value.split("\n").removeAll("");
  var players = document.getElementById("players").value.split("\n").removeAll("");
  if (roles.length == players.length) {
    document.getElementById("result").value = "";
    var count = roles.length;
    for (var i = 0; i < count; i++) {
      // Math.random range[0,1)
      // Math.random() * players.length range [0, length)
      // Math.floor(Math.random() * players.length) range [0, 1, 2, ... range-1]
      var player = players[Math.floor(Math.random() * players.length)];
      var role = roles[i];
      players.remove(player);
      document.getElementById("result").value += player + " ---------- " + role + " \n";
    }
  } else {
    document.getElementById("result").value = "角色与身份数量不符。"
  }
}


地址:http://www.jithee.name/lot/
代码地址:https://github.com/JiYouMCC/JiYouMCC.github.io/blob/master/js/lot.js

现在情况就是出现了连刀,我无法接受!

Copy code
var a=0;
var b=10000000;
for (var i =0;i<b;i++) {
a += Math.random()*7;
}
console.log(a/b)
VM307:6 3.5001398964456847


本身math.random得问题我觉得没有问题

求各种鸡毛等等review 代码
Posted: 2016-09-10 13:46 | [楼 主]
mecyl
清香白莲
杀人游戏MVP大师勋章I 杀人游戏MVP大师勋章II 杀人游戏MVP勋章I
级别: 管理员


精华: 12
发帖: 3868
威望: 2673 点
金钱: 390 静电币
支持度: 21840 点
在线时间:3212(小时)
注册时间:2005-07-28
最后登录:2024-06-24

 

这个抽签器猫命规则用不了,猫命需要一个抽牌发牌机
Posted: 2016-09-10 15:02 | 1 楼
mecyl
清香白莲
杀人游戏MVP大师勋章I 杀人游戏MVP大师勋章II 杀人游戏MVP勋章I
级别: 管理员


精华: 12
发帖: 3868
威望: 2673 点
金钱: 390 静电币
支持度: 21840 点
在线时间:3212(小时)
注册时间:2005-07-28
最后登录:2024-06-24

 

我试着抽了好多次,发现好像只有第一把的时候会连刀,多点几下就不会了
Posted: 2016-09-10 15:11 | 2 楼
[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 

我可以考虑多算一次

猫命我可以研究下,弄个专用发牌器
Posted: 2016-09-10 15:43 | 3 楼
[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 

Copy code
enum CardType {
    Privilege = 1,
    Common
}

interface Card {
    name: string;
    type: CardType;
}

class Player {
    name: string;
    cards: Card[];
    constructor(public playerName) {
        this.name = playerName;
        this.cards = [];
    }
}

let cards: Array<Card> = [
    { name: "杀手牌", type: CardType.Privilege },
    { name: "狼人牌", type: CardType.Privilege },
    { name: "狙击手牌", type: CardType.Privilege },
    { name: "狙击手牌", type: CardType.Privilege },
    { name: "束魂牌", type: CardType.Privilege },
    { name: "束魂牌", type: CardType.Privilege },
    { name: "巫医牌", type: CardType.Privilege },
    { name: "巫医牌", type: CardType.Privilege },
    { name: "防弹衣/狼毒牌", type: CardType.Privilege },
    { name: "防弹衣/狼毒牌", type: CardType.Privilege },
    { name: "禁锢/反狙击牌", type: CardType.Privilege },
    { name: "禁锢/反狙击牌", type: CardType.Privilege },
    { name: "绝杀/特赦牌", type: CardType.Privilege },
    { name: "绝杀/特赦牌", type: CardType.Privilege },
    { name: "诅咒/庇佑牌", type: CardType.Privilege },
    { name: "诅咒/庇佑牌", type: CardType.Privilege },
    { name: "纵火/圣人牌", type: CardType.Privilege },
    { name: "纵火/圣人牌", type: CardType.Privilege },
    { name: "保镖牌", type: CardType.Privilege },
    { name: "保镖牌", type: CardType.Privilege },
    { name: "保镖牌", type: CardType.Privilege },
    { name: "阿米巴变形牌", type: CardType.Privilege },
    { name: "阿米巴变形牌", type: CardType.Privilege },
    { name: "阿米巴变形牌", type: CardType.Privilege },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common },
    { name: "庶民牌", type: CardType.Common }
];


let players: Array<Player> = [
    new Player("玩家1"),
    new Player("玩家2"),
    new Player("玩家3"),
    new Player("玩家4"),
    new Player("玩家5"),
    new Player("玩家6"),
    new Player("玩家7")
];

function hasCard(cardName: string, player: Player) {
    for (var i = player.cards.length - 1; i >= 0; i--) {
        if (player.cards[i].name == cardName) {
            return true;
        }
    }
    return false;
}

function hasCardCount(cardName: string, player: Player) {
    let result = 0;
    for (var i = player.cards.length - 1; i >= 0; i--) {
        if (player.cards[i].name == cardName) {
            result++;
        }
    }
    return result;
}

function doing(outCount: number) {
    let tempCards = [];
    let tempPlayers = [];
    for (var i = cards.length - 1; i >= 0; i--) {
        tempCards.push(cards[i]);
    }
    for (var i = players.length - 1; i >= 0; i--) {
        tempPlayers.push(players[i]);
    }

    //决定弃牌
    let out = [];
    for (var i = outCount - 1; i >= 0; i--) {
        let card = undefined;
        let cardId = undefined;
        do {
            cardId = Math.floor(Math.random() * tempCards.length);
            card = tempCards[cardId];
        } while (card.name == "杀手牌" || card.name == "狼人牌");
        out.push(card);
        tempCards.splice(cardId, 1);
    }
    console.log("【弃牌如下】");
    for (var i = out.length - 1; i >= 0; i--) {
        console.log(out[i].name);
    }

    //庶民牌
    let waterCards = [];
    for (var i = tempCards.length - 1; i >= 0; i--) {
        if (tempCards[i].name == "庶民牌") {
            waterCards.push(tempCards[i]);
            tempCards.splice(i, 1);
        }
    }

    for (var i = players.length - 1; i >= 0; i--) {
        players[i].cards.push(waterCards.pop());
    }

    while (waterCards.length > 0) {
        let playerId = Math.floor(Math.random() * tempPlayers.length);
        let player = tempPlayers[playerId];
        if (hasCardCount("庶民牌", player) < 2) {
            player.cards.push(waterCards.pop());
        }
    }

    let currentPID = 0;
    for (; tempCards.length > 0;) {
        let cardId = Math.floor(Math.random() * tempCards.length);
        let card = tempCards[cardId];
        let player: Player = tempPlayers[currentPID];

        if (player.cards.length == 5) {
            currentPID ++;
            continue;
        }

        if (card.name == "杀手牌") {
            if (hasCard("狼人牌", player)) {
                continue;
            }
        }

        if (card.name == "狼人牌") {
            if (hasCard("杀手牌", player)) {
                continue;
            }
        }

        if (card.name == "狙击手牌") {
            if (hasCard("狙击手牌", player)) {
                continue;
            }
        }

        if (card.name == "束魂牌") {
            if (hasCard("束魂牌", player)) {
                continue;
            }
        }

        if (card.name == "巫医牌") {
            if (hasCard("巫医牌", player)) {
                continue;
            }
        }

        if (card.name == "防弹衣/狼毒牌") {
            if (hasCard("防弹衣/狼毒牌", player)) {
                continue;
            }
        }

        if (card.name == "禁锢/反狙击牌") {
            if (hasCard("禁锢/反狙击牌", player)) {
                continue;
            }
        }

        if (card.name == "绝杀/特赦牌") {
            if (hasCard("绝杀/特赦牌", player)) {
                continue;
            }
        }

        if (card.name == "诅咒/庇佑牌") {
            if (hasCard("诅咒/庇佑牌", player)) {
                continue;
            }
        }

        if (card.name == "纵火/圣人牌") {
            if (hasCard("纵火/圣人牌", player)) {
                continue;
            }
        }

        if (card.name == "保镖牌") {
            if (hasCard("保镖牌", player)) {
                continue;
            }
        }

        if (card.name == "阿米巴变形牌") {
            if (hasCard("阿米巴变形牌", player)) {
                continue;
            }
        }

        player.cards.push(card);
        tempCards.splice(cardId, 1);
        currentPID++;
        if (currentPID == tempPlayers.length) {
            currentPID = 0;
        }
    }

    return { out: out, players: tempPlayers };
}

let result = doing(1);
for (var i = result.players.length - 1; i >= 0; i--) {
    document.body.innerHTML += "<h2>【" + result.players[i].name + "】</h2>";
    for (var j = result.players[i].cards.length - 1; j >= 0; j--) {
        document.body.innerHTML += "<h3>" + result.players[i].cards[j].name + "</h3>";
    }
}


Quote:
【玩家1】

束魂牌

巫医牌

保镖牌

庶民牌

庶民牌

【玩家2】

保镖牌

纵火/圣人牌

诅咒/庇佑牌

阿米巴变形牌

庶民牌

【玩家3】

阿米巴变形牌

保镖牌

禁锢/反狙击牌

庶民牌

庶民牌

【玩家4】

禁锢/反狙击牌

狙击手牌

防弹衣/狼毒牌

绝杀/特赦牌

庶民牌

【玩家5】

狼人牌

束魂牌

巫医牌

庶民牌

庶民牌

【玩家6】

杀手牌

阿米巴变形牌

诅咒/庇佑牌

防弹衣/狼毒牌

庶民牌

【玩家7】

纵火/圣人牌

狙击手牌

绝杀/特赦牌

庶民牌

庶民牌
Posted: 2016-09-12 17:50 | 4 楼
[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 

回头优化下,顺手写的
Posted: 2016-09-12 17:51 | 5 楼
[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 




目前碰到的问题是发牌有几率卡住,我知道为什么,就是最后一张特权怎么都发不出去了
附件: 本地下载:cats.zip (5 K) 下载次数:0
Posted: 2016-09-12 23:15 | 6 楼
K40-程心
级别: 平民


精华: 0
发帖: 88
威望: 88 点
金钱: 880 静电币
支持度: 0 点
在线时间:29(小时)
注册时间:2016-07-23
最后登录:2016-12-07

 

天神发工资啦!!!!!!!!!!!!!!!!!!!!!!!!!!
Posted: 2016-09-12 23:38 | 7 楼
[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 

修改了一版,基本不会卡住了,但是代码太丑了




Quote:
enum CardType {
    身份牌 = 1,
    特权牌,
    庶民牌
}

enum PlayerCamp {
    杀手阵营,
    狼人阵营,
    平民阵营,
    自选阵营,
    Unknow
}

interface Card {
    name: string;
    type: CardType;
}

interface CardTableItem {
    card: Card;
    count: number;
}

let players: Array<Player> = [];

let cardTable: Array<CardTableItem> = [
    { card: { name: "杀手牌", type: CardType.身份牌 }, count: 1 },
    { card: { name: "狼人牌", type: CardType.身份牌 }, count: 1 },
    { card: { name: "狙击手牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "束魂牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "巫医牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "防弹衣/狼毒牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "禁锢/反狙击牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "绝杀/特赦牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "诅咒/庇佑牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "纵火/圣人牌", type: CardType.特权牌 }, count: 2 },
    { card: { name: "保镖牌", type: CardType.特权牌 }, count: 3 },
    { card: { name: "阿米巴变形牌", type: CardType.特权牌 }, count: 3 },
    { card: { name: "庶民牌", type: CardType.庶民牌 }, count: 12 }
];

let cards: Array<Card> = getCards(cardTable);

class Player {
    name: string;
    cards: Card[];
    camp: PlayerCamp;
    constructor(public playerName) {
        this.name = playerName;
        this.cards = [];
        this.camp = PlayerCamp.Unknow;
    }
}

function showCardTable(cardTable: Array<CardTableItem>) {
    for (var i = 0; i < cardTable.length; ++i) {
        document.getElementById("cardTable").innerHTML += "<tr>\
          <td><input name='card_item_" + i + "' type='text' value='" + cardTable.card.name + "'/></td>\
          <td>\
          " + cardTypeSelect(cardTable.card) + "\
          </td>\
          <td><input name='' type='number' value='"+ cardTable.count + "'/></td>\
        </tr>";
    }
}

function cardTypeSelect(card: Card) {
    let result = "<select>";
    for (var i = 1; i < 4; ++i) {
        let selected = (card.type == i) ? "selected" : "";
        result += "<option value='" + i + "' " + selected + ">" + CardType + "</option>";
    }

    result += "</select>";
    return result;
}

function getCards(cardTable: Array<CardTableItem>) {
    let cards: Array<Card> = [];

    for (var i = 0; i < cardTable.length; ++i) {
        let cardTableItem = cardTable;
        for (var j = 0; j < cardTableItem.count; j++) {
            cards.push(cardTableItem.card);
        }
    }

    return cards;
}

function updatePlayers() {
    let playerstrings = (<HTMLInputElement>document.getElementById("players")).value;
    let playerarray = playerstrings.split("\n");
    for (var i = playerarray.length - 1; i >= 0; i--) {
        if (playerarray == "") {
            playerarray.slice(i, 1);
        }
    }
    if (playerarray.length == 7) {
        players = [];
        for (var i = 0; i < playerarray.length; i++) {
            players.push(new Player(playerarray));
        }
    }
}

function hasCard(cardName: string, player: Player) {
    for (var i = player.cards.length - 1; i >= 0; i--) {
        if (player.cards.name == cardName) {
            return true;
        }
    }
    return false;
}

function hasCardCount(cardName: string, player: Player) {
    let result = 0;
    for (var i = player.cards.length - 1; i >= 0; i--) {
        if (player.cards.name == cardName) {
            result++;
        }
    }
    return result;
}

function doing(outCount: number) {
    let tempCards = undefined;
    let tempPlayers = undefined;
    let blocktime = undefined;
    let out = undefined;
    let limits = getCardOfType(cards, CardType.特权牌);

    while (true) {
        out = [];
        blocktime = 0;
        tempPlayers = [];
        tempCards = [];


        for (var i = cards.length - 1; i >= 0; i--) {
            tempCards.push(cards);
        }
        for (var i = 0; i < players.length; i++) {
            tempPlayers.push(players);
            players.cards = [];
        }

        //决定弃牌
        for (var i = outCount - 1; i >= 0; i--) {
            let card = undefined;
            let cardId = undefined;
            do {
                cardId = Math.floor(Math.random() * tempCards.length);
                card = tempCards[cardId];
            } while (card.name == "杀手牌" || card.name == "狼人牌");
            out.push(card);
            tempCards.splice(cardId, 1);
        }

        //庶民牌
        let waterCards = [];
        for (var i = tempCards.length - 1; i >= 0; i--) {
            if (tempCards.name == "庶民牌") {
                waterCards.push(tempCards);
                tempCards.splice(i, 1);
            }
        }

        for (var i = players.length - 1; i >= 0; i--) {
            players.cards.push(waterCards.pop());
        }

        while (waterCards.length > 0) {
            let playerId = Math.floor(Math.random() * tempPlayers.length);
            let player = tempPlayers[playerId];
            if (hasCardCount("庶民牌", player) < 2) {
                player.cards.push(waterCards.pop());
            }
        }

        // 身份牌和特权牌
        let currentPID = 0;
        let blockCheck = false;
        while (tempCards.length > 0) {
            if (blocktime > 20) {
                blockCheck = true;
                console.log("发牌无解,重发");
                break;
            }
            let cardId = Math.floor(Math.random() * tempCards.length);
            let card = tempCards[cardId];
            let player: Player = tempPlayers[currentPID];

            if (player.cards.length == 5) {
                currentPID++;
                if (currentPID == tempPlayers.length) {
                    currentPID = 0;
                }
                continue;
            }

            if (card.name == "杀手牌") {
                if (hasCard("狼人牌", player)) {
                    blocktime++;
                    continue;
                }
            }

            if (card.name == "狼人牌") {
                if (hasCard("杀手牌", player)) {
                    blocktime++;
                    continue;
                }
            }

            let checkLimit = false;
            for (var i = limits.length - 1; i >= 0; i--) {
                let limit = limits;
                if (card.name == limit) {
                    if (hasCard(limit, player)) {
                        checkLimit = true;
                        break;
                    }
                }
            }

            if (checkLimit) {
                blocktime++;
                continue;
            }

            player.cards.push(card);
            tempCards.splice(cardId, 1);
            currentPID++;
            if (currentPID == tempPlayers.length) {
                currentPID = 0;
            }
        }

        if (blockCheck) {
            continue;
        }

        //阵营判断
        let unknowPlay = [];
        for (var i = tempPlayers.length - 1; i >= 0; i--) {
            let player: Player = tempPlayers;
            if (hasCard("杀手牌", player)) {
                player.camp = PlayerCamp.杀手阵营;
            } else if (hasCard("狼人牌", player)) {
                player.camp = PlayerCamp.狼人阵营;
            } else {
                unknowPlay.push(player);
            }
        }

        let sel = Math.floor(Math.random() * unknowPlay.length);
        let selplayer: Player = unknowPlay[sel];
        selplayer.camp = PlayerCamp.自选阵营;
        unknowPlay.splice(sel, 1);

        for (var i = unknowPlay.length - 1; i >= 0; i--) {
            unknowPlay.camp = PlayerCamp.平民阵营;
        }
        break;
    }

    return { out: out, players: tempPlayers };
}

function getCardOfType(cards: Array<Card>, cardType: CardType) {
    let result = [];
    for (var i = cards.length - 1; i >= 0; i--) {
        let card = cards;
        if (card.type == cardType) {
            if (result.indexOf(card.name) == -1) {
                result.push(card.name);
            }
        }
    }
    return result;
}

function showPlayerTable(result) {
    document.getElementById("playerTable").innerHTML = "";
    for (var i = 0; i < result.players.length; ++i) {
        let player: Player = result.players;
        let cards: string = "";
        for (var j = player.cards.length - 1; j >= 0; j--) {
            cards += player.cards[j].name + " ";
        }
        document.getElementById("playerTable").innerHTML += "<tr>\
          <td>" + player.name + "</td>\
          <td>" + PlayerCamp[player.camp] + "</td>\
          <td>" + cards + "</td>\
        </tr>";
    }
    let outstring: string = ""
    for (var i = result.out.length - 1; i >= 0; i--) {
        outstring += result.out.name;
    }
    document.getElementById("playerTable").innerHTML += "<tr>\
          <td></td>\
          <td>弃牌</td>\
          <td>" + outstring + "</td>\
        </tr>";
}

function refresh() {
    updatePlayers();
    let result = doing(1);
    showPlayerTable(result);
}

refresh();
附件: 本地下载:cats-不卡.zip (5 K) 下载次数:3
Posted: 2016-09-12 23:45 | 8 楼
K40-程心
级别: 平民


精华: 0
发帖: 88
威望: 88 点
金钱: 880 静电币
支持度: 0 点
在线时间:29(小时)
注册时间:2016-07-23
最后登录:2016-12-07

 

表示不是很确定.push的作用
Posted: 2016-09-12 23:47 | 9 楼
K40-程心
级别: 平民


精华: 0
发帖: 88
威望: 88 点
金钱: 880 静电币
支持度: 0 点
在线时间:29(小时)
注册时间:2016-07-23
最后登录:2016-12-07

 

嗷呜!又多了一大堆。。。想死。。。
Posted: 2016-09-12 23:48 | 10 楼
[041]尼克
级别: 光明使者


精华: 0
发帖: 1112
威望: 1113 点
金钱: 30 静电币
支持度: 0 点
在线时间:326(小时)
注册时间:2016-08-26
最后登录:2016-09-21

 

Quote:
引用第9楼K40-程心于2016-09-12 23:47发表的  :
表示不是很确定.push的作用

push就是入栈,反正顺序不重要,就等于是往数组里面加东西

js的array操作太难受了,然后typescript又不太熟悉,为了方便实现就先这样了
Posted: 2016-09-12 23:51 | 11 楼
帖子浏览记录 版块浏览记录
狗狗静电BBS - wwW.DoGGiEhoMe.CoM » [游戏四十一]疯狂动物城

沪ICP备05008186号
Powered by PHPWind Styled by MagiColor