c# 实现3/5/7游戏

规则:

15个任意物品(可以是火柴牙签poker)

以下按牙签为例

将15根牙签

分成三行

每行自上而下(其实方向不限)分别是3、5、7根

安排两个玩家,每人可以在一轮内,在任意行拿任意根牙签,但不能跨行

拿最后一根牙签的人即为输家

 

namespace ThreeFiveSevenGameV2
{
    /// <summary>
    /// 随机选择行,随机取火柴根数(两人同时操作同一行)
    /// </summary>
    public partial class Form1 : Form
    {
        private delegate void setTxtContent(string msg);
        Dictionary<int, List<int>> dicAll;
        Random ran;
        object obj = new object();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dicAll = new Dictionary<int, List<int>>();
            ran = new Random();
        }
        /// <summary>
        /// 按钮点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBegin_Click(object sender, EventArgs e)
        {
            GetAllData();
            GetTakePoker();
        }

        /// <summary>
        /// 初始化357游戏数据(也可以通过抽象出从接口的方式去获取数据,这样数据就可以扩展)
        /// </summary>
        /// <returns></returns>
        private void GetAllData()
        {
            dicAll?.Clear();
            dicAll.Add(1, new List<int>() { 1, 2, 3 });
            dicAll.Add(2, new List<int>() { 4, 5, 6, 7, 8 });
            dicAll.Add(3, new List<int>() { 9, 10, 11, 12, 12, 14, 15 });
        }

        /// <summary>
        /// 拿火柴
        /// </summary>
        private async void GetTakePoker()
        {
            int userSelectedRow = ran.Next(1, dicAll.Count + 1);
            if (dicAll[userSelectedRow] == null || dicAll[userSelectedRow].Count == 0)
            {
                ShowLog($"所提供的源数据异常");
                return;
            }
            while (dicAll[userSelectedRow].Count > 0)
            {
                var taskList = new List<Task<bool>> { userOneTake(userSelectedRow), userTwoTake(userSelectedRow) }; //多线程 减少时间消耗
                await Task.WhenAll(taskList);
            }            
        }
        /// <summary>
        /// 用户一拿火柴
        /// </summary>
        /// <param name="userOneSelectedRow"></param>
        /// <returns></returns>
        private Task<bool> userOneTake(int userOneSelectedRow)
        {
            return Task.Run(() =>
            {
                try
                {
                    GetPokerCaculate(userOneSelectedRow, Operation.userOne);
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            });
        }
        /// <summary>
        /// 用户二拿火柴
        /// </summary>
        /// <param name="userOneSelectedRow"></param>
        /// <returns></returns>
        private Task<bool> userTwoTake(int userOneSelectedRow)
        {
            return Task.Run(() =>
            {
                try
                {
                    GetPokerCaculate(userOneSelectedRow, Operation.userTwo);
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            });
        }

        /// <summary>
        /// 取火柴计算
        /// </summary>
        /// <param name="rowIndex"></param>
        /// <param name="operation"></param>
        private void GetPokerCaculate(int rowIndex, Operation operation)
        {
            lock (obj)
            {
                List<int> lstSelectedRowData = dicAll[rowIndex];
                if (lstSelectedRowData.Count == 0)
                {
                    return;
                }
                int selectCount = ran.Next(1, lstSelectedRowData.Count + 1);
                dicAll[rowIndex].RemoveRange(0, selectCount);
                if (dicAll[rowIndex].Count == 0)//最后一个取完列表中的火柴判定为输
                {
                    string content = string.Empty;
                    if (operation == Operation.userOne)
                    {
                        content = "userOne lose";
                    }
                    else
                    {
                        content = "userTwo lose";
                    }
                    this.Invoke(new setTxtContent(ShowLog), new object[] { content });
                }
            }
        }

        /// <summary>
        /// 界面显示结果
        /// </summary>
        /// <param name="msg"></param>
        private void ShowLog(string msg)
        {
            if (!string.IsNullOrEmpty(txtInfo.Text))
            {
                txtInfo.AppendText("\r\n");
                txtInfo.AppendText("\r\n");
            }
            txtInfo.AppendText(msg);
        }

    }
    /// <summary>
    /// 操作人枚举
    /// </summary>
    public enum Operation
    {
        userOne,
        userTwo
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值