简单游戏的合约

  1. 代码

    // 简单的游戏,剪子布包锤
    contract Game
    {
        // 游戏者结构体
        struct Voter
        {
            string name; // 游戏者的名字
            uint vote;   // 游戏者选择出的类型(即出剪子(0),布(1)或者锤(2)的索引0,1,2)
            uint contrastIndex; // 想和谁进行对比
        }
    
        // 可供选择的类型
        struct Type
        {
            string name; // 选择的类型
            uint index;  // 对应的索引 
        }
        
        // 提案创建者地址
        address public chairperson;
        // 这里声明一个状态变量,保存每个独立地址的Voter结构
        mapping(address => Voter) public voters;
        // 一个存储Type结构的动态数组
        Type[] public types;
        // 存储参加游戏的人的地址
        address[] public gameAddress;
        // 游戏类型数组
        string[] public gameTypes;
        string temp;
    
        // 初始化函数
        function Game() public
        {
            // 剪子-Scissors, 布-Cloth, 锤子-Hammer
            gameTypes = ['Scissors', 'Cloth', 'Hammer'];
            // 游戏创建者
            chairperson = msg.sender;
    
            // 根据游戏类型创建Type类型数组数据
            for (uint i = 0; i < gameTypes.length; i++)
                // 添加到数组
                types.push(
                    // 创建了一个临时的提案对象
                    Type({
                        name: gameTypes[i],
                        index: i
                    })
                );
        }
    
        // 给出你的信息,选择index,对比index,name
        function vote(uint vot, uint contrastIndex, string name) public
        {
            // 选择的如果大于2小于0,则无意义
            if (vot > 2) {
                vot = 2;
            } else if (vot < 0) {
                vot = 0;
            }
            voters[msg.sender].vote = vot;
            voters[msg.sender].contrastIndex = contrastIndex;
            voters[msg.sender].name = name;
            gameAddress.push(msg.sender);
        }
    
        // 得出与你对比后的结果
        function winningVoter() public constant
                returns (string myResult)
        {
            // 调用者
            Voter sender = voters[msg.sender];
            uint index = 0;
            if (sender.contrastIndex > gameAddress.length) {
                index = gameAddress.length - 1;
            } else {
                index = sender.contrastIndex;
            }
            // 对比者
            Voter contrastVoter = voters[gameAddress[index]];
            Type senderType = types[sender.vote];
            Type contrastType = types[contrastVoter.vote];
            
            // 判断输赢
            if ((sender.vote - contrastVoter.vote) == 0) {
                myResult = '平局';
            } else if ((contrastVoter.vote - sender.vote) == 1 || (sender.vote - contrastVoter.vote) == 2) {
                myResult = '赢了';
            } else if ((sender.vote - contrastVoter.vote) == 1 || (contrastVoter.vote - sender.vote) == 2) {
                myResult = '输了';
            }
            
            // 拼接返回的结果
            temp = strConcat('your name:', sender.name, ' ,your choose:', senderType.name);
            temp = strConcat(temp, ' ,other name:', contrastVoter.name);
            temp = strConcat(temp, ' ,other choose:', contrastType.name);
            myResult = strConcat(temp, ' ,Result:', myResult);
        }
    
        // 2个字符拼接
        function strConcat(string _a, string _b) internal returns (string) {
            return strConcat(_a, _b, "", "", "");
        }
    
        // 3个字符拼接
        function strConcat(string _a, string _b, string _c) internal returns (string) {
            return strConcat(_a, _b, _c, "", "");
        }
    
        // 4个字符拼接
        function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
            return strConcat(_a, _b, _c, _d, "");
        }
        
        // 5个字符拼接
        function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string){
                bytes memory _ba = bytes(_a);
                bytes memory _bb = bytes(_b);
                bytes memory _bc = bytes(_c);
                bytes memory _bd = bytes(_d);
                bytes memory _be = bytes(_e);
                string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
                bytes memory babcde = bytes(abcde);
                uint k = 0;
                for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
                for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
                for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
                for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
                for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
                return string(babcde);
            }
        }
    }
    
  2. 注意事项

    • 一些基本的操作,处理的比较复杂,建议多谷歌
    • 例如字符的拼接
    • 不允许存在负数
  3. 结果图

    image

    image

你可能感兴趣的:(简单游戏的合约)