当前位置: 首页 > news >正文

C#使用随机数模拟英雄联盟S13瑞士轮比赛

 瑞士轮赛制的由来

瑞士制:又称积分循环制,最早出现于1895年在瑞士苏黎世举办的国际象棋比赛中,故而得名。其基本原则是避免种子选手一开始就交锋、拼掉,是比较科学合理、用得最多的一种赛制;英语名称为Swiss System。

欲通过瑞士轮的考验进入淘汰赛,那么需要在此阶段拿下三场胜利,反之遭遇三场失利就会被淘汰。瑞士轮阶段的比赛,包含了五个轮次的比赛,每轮的比赛对阵都由抽签来决定。

第一轮有8场比赛:比赛全部为BO1(同赛区规避),这8场比赛结束之后,16支队伍会按照胜负情况分为两组,1-0战绩的队伍8支,0-1战绩的队伍8支。

第二轮同样也是8场BO1的比赛:抽签后的对阵原则是1-0战绩的队伍和1-0战绩的队伍打(也就是第一轮的胜者打胜者),0-1战绩的队伍和0-1战绩的队伍打(也就是第一轮的败者打败者)。此轮比赛结束后,会有4支2-0的队伍,4支0-2的队伍,8支1-1的队伍。

第三轮的比赛就显得复杂一些了,因为第三轮就会诞生率先晋级淘汰赛以及不得不遗憾出局的队伍了:关乎淘汰和晋级的比赛都将是BO3的设定,2-0的队伍打2场BO3, 1-1的队伍打4场BO1,0-2的队伍打2场BO3。第三轮比赛结束之后,会宣告2支队伍以3-0的成绩晋级淘汰赛,2支队伍以0-3的成绩遗憾出局。

第四轮的比赛最为残酷:2-1的队伍打3场BO3,胜者晋级淘汰赛,1-2的队伍打3场BO3。比赛结束后晋级3支队伍,淘汰3支队伍;留在场上的6支队伍是全部都会是2-2的胜负场情形。

第五轮的比赛是晋级淘汰赛的最后机会,2-2的队伍们打3场BO3,晋级3支队伍淘汰3支队伍。

综上所述:通过五个轮次的比赛,8支队伍得以晋级,8支队伍遭遇淘汰。

一文读懂2023英雄联盟全球总决赛瑞士轮赛制

我们新建一个仿真窗体应用程序LOL_S13Demo。

将默认的Form1重命名为FormLOL_S13

一、新建图片文件夹TeamFlagImage,将各个战队图标导入,并设置为始终复制

二、然后新建随机数类RandomUtil,源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LOL_S13Demo
{public class RandomUtil {private static int[] nums;private static Random rand = new Random();/// <summary>/// 初始化数组索引/// </summary>/// <param name="indexArray"></param>public static void Init(int[] indexArray){nums = indexArray;}/// <summary>/// 洗牌算法,洗牌算法的时间复杂度是 O(N)/// 第一次有N种可能,第二次有N-1种可能,第三次有N-2种可能/// ...最后一次只有一种可能/// </summary>/// <returns></returns>public static int[] Shuffle(){int n = nums.Length;int[] copy = new int[n];Array.Copy(nums, copy, n);for (int i = 0; i < n; i++){// 生成一个 [i, n-1] 区间内的随机数int r = i + rand.Next(n - i);// 交换 nums[i] 和 nums[r],即获取第r个数【放到第i个位置】Swap(copy, i, r);}return copy;}/// <summary>/// 交换数组两个数的值/// </summary>/// <param name="nums"></param>/// <param name="i"></param>/// <param name="j"></param>private static void Swap(int[] nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}

三、新建战队类Team,属性如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LOL_S13Demo
{/// <summary>/// 英雄联盟S13参赛战队/// </summary>class Team{/// <summary>/// 战队名称/// </summary>public string TeamName { get; set; }/// <summary>/// 战队胜率/// </summary>public decimal WinningRatio { get; set; }/// <summary>/// 战队图标/// </summary>public Image TeamFlag { get; set; }}
}

四、新建自定义控件UcTeam,设计器源码如下:

文件 UcTeam.designer.cs

using System.Windows.Forms;namespace LOL_S13Demo
{partial class UcTeam{/// <summary> /// 必需的设计器变量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary> /// 清理所有正在使用的资源。/// </summary>/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region 组件设计器生成的代码/// <summary> /// 设计器支持所需的方法 - 不要修改/// 使用代码编辑器修改此方法的内容。/// </summary>private void InitializeComponent(){this.panel2 = new System.Windows.Forms.Panel();this.lblWinningRatio = new System.Windows.Forms.Label();this.lblTeamName = new System.Windows.Forms.Label();this.picTeamFlag = new System.Windows.Forms.PictureBox();this.panel2.SuspendLayout();((System.ComponentModel.ISupportInitialize)(this.picTeamFlag)).BeginInit();this.SuspendLayout();// // panel2// this.panel2.Controls.Add(this.lblWinningRatio);this.panel2.Controls.Add(this.lblTeamName);this.panel2.Controls.Add(this.picTeamFlag);this.panel2.Location = new System.Drawing.Point(3, 2);this.panel2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.panel2.Name = "panel2";this.panel2.Size = new System.Drawing.Size(257, 127);this.panel2.TabIndex = 2;// // lblWinningRatio// this.lblWinningRatio.AutoSize = true;this.lblWinningRatio.ForeColor = System.Drawing.Color.Green;this.lblWinningRatio.Location = new System.Drawing.Point(155, 5);this.lblWinningRatio.Name = "lblWinningRatio";this.lblWinningRatio.Size = new System.Drawing.Size(29, 12);this.lblWinningRatio.TabIndex = 5;this.lblWinningRatio.Text = "胜率";// // lblTeamName// this.lblTeamName.AutoSize = true;this.lblTeamName.ForeColor = System.Drawing.Color.Blue;this.lblTeamName.Location = new System.Drawing.Point(21, 5);this.lblTeamName.Name = "lblTeamName";this.lblTeamName.Size = new System.Drawing.Size(29, 12);this.lblTeamName.TabIndex = 4;this.lblTeamName.Text = "战队";// // picTeamFlag// this.picTeamFlag.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;this.picTeamFlag.Location = new System.Drawing.Point(21, 21);this.picTeamFlag.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.picTeamFlag.Name = "picTeamFlag";this.picTeamFlag.Size = new System.Drawing.Size(214, 106);this.picTeamFlag.TabIndex = 3;this.picTeamFlag.TabStop = false;// // UcTeam// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.Controls.Add(this.panel2);this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.Name = "UcTeam";this.Size = new System.Drawing.Size(262, 131);this.panel2.ResumeLayout(false);this.panel2.PerformLayout();((System.ComponentModel.ISupportInitialize)(this.picTeamFlag)).EndInit();this.ResumeLayout(false);}#endregionprivate Panel panel2;public PictureBox picTeamFlag;public Label lblWinningRatio;public Label lblTeamName;}
}

UcTeam.cs源程序如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace LOL_S13Demo
{public partial class UcTeam : UserControl{public UcTeam(){InitializeComponent();}}
}

五、新建战队与操作比赛相关类TeamUtil

TeamUtil.cs源程序如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LOL_S13Demo
{internal class TeamUtil{/// <summary>/// 所有参赛的世界杯战队/// </summary>public static List<Team> ListTeam = new List<Team>();/// <summary>/// 初始化世界杯各个参赛战队/// </summary>public static void InitTeam() {ListTeam.Clear();AddTeam(new Team(){TeamName = "JDG",WinningRatio = 90,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\JDG.jpg")});AddTeam(new Team(){TeamName = "LNG",WinningRatio = 85,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\LNG.jpg")});AddTeam(new Team(){TeamName = "BLG",WinningRatio = 80,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\BLG.jpg")});AddTeam(new Team(){TeamName = "WBG",WinningRatio = 75,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\WBG.jpg")});AddTeam(new Team(){TeamName = "GEN",WinningRatio = 90,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\GEN.jpg")});AddTeam(new Team(){TeamName = "T1",WinningRatio = 85,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\T1.jpg")});AddTeam(new Team(){TeamName = "KT",WinningRatio = 80,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\KT.jpg")});AddTeam(new Team(){TeamName = "DK",WinningRatio = 75,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\DK.jpg")});AddTeam(new Team(){TeamName = "FNC",WinningRatio = 80,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\FNC.jpg")});AddTeam(new Team(){TeamName = "BDS",WinningRatio = 70,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\BDS.jpg")});AddTeam(new Team(){TeamName = "C9",WinningRatio = 75,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\C9.jpg")});AddTeam(new Team(){TeamName = "G2",WinningRatio = 70,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\G2.jpg")});AddTeam(new Team(){TeamName = "GAM",WinningRatio = 75,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\GAM.jpg")});AddTeam(new Team(){TeamName = "MAD",WinningRatio = 75,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\MAD.png")});AddTeam(new Team(){TeamName = "NRG",WinningRatio = 65,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\NRG.png")});AddTeam(new Team(){TeamName = "TL",WinningRatio = 85,TeamFlag = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "TeamFlagImage\\TL.png")});}/// <summary>/// 添加一个战队/// </summary>/// <param name="Team"></param>public static void AddTeam(Team Team) {ListTeam.Add(Team);}/// <summary>/// 两个匹配的战队进行比赛,根据胜率,进行随机,返回胜利的战队/// 胜利法则如下:先随机出一个胜率之和之间的随机数,/// 如果随机数小于【最小数的2倍】并且是奇数,则认为 胜率低的战队胜利,否则 胜率高的战队胜利/// </summary>/// <param name="tuple">参赛战队</param>/// <param name="failTeam">失败战队</param>/// <returns></returns>public static Team SoccerGame(Tuple<Team, Team> tuple, out Team failTeam, out int randomNumber) {failTeam = tuple.Item2;randomNumber = -1;if (tuple == null || tuple.Item1 == null) {throw new Exception("世界比赛无参赛的战队或者第一个参赛战队不存在");}if (tuple.Item2 == null) {//无第二个世界参赛战队,直接躺赢【对奇数个参赛战队的特殊处理】return tuple.Item1;}decimal minWinningRatio = Math.Min(tuple.Item1.WinningRatio, tuple.Item2.WinningRatio);Team bigWin = null;//高胜率Team smallWin = null;//低胜率if (tuple.Item1.WinningRatio < tuple.Item2.WinningRatio){bigWin = tuple.Item2;smallWin = tuple.Item1;}else{bigWin = tuple.Item1;smallWin = tuple.Item2;}int total = (int)(tuple.Item1.WinningRatio + tuple.Item2.WinningRatio);Random random = new Random(Guid.NewGuid().GetHashCode());//先随机出一个胜率之和之间的随机数randomNumber = random.Next(total);if (randomNumber < minWinningRatio * 2 && (randomNumber & 1) != 0) {//如果随机数小于【最小数的2倍】并且是奇数,则认为 胜率低的战队胜利,否则 胜率高的战队胜利failTeam = bigWin;return smallWin;}failTeam = smallWin;return bigWin;}}
}

六、窗体FormLOL_S13的设计器程序如下:

FormLOL_S13.designer.cs

using System.Windows.Forms;namespace LOL_S13Demo
{partial class FormLOL_S13{/// <summary>/// Required designer variable./// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// Clean up any resources being used./// </summary>/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows Form Designer generated code/// <summary>/// Required method for Designer support - do not modify/// the contents of this method with the code editor./// </summary>private void InitializeComponent(){this.btnStart = new System.Windows.Forms.Button();this.btnRefresh = new System.Windows.Forms.Button();this.rtxtDisplay = new System.Windows.Forms.RichTextBox();this.pnlTeam = new System.Windows.Forms.Panel();this.SuspendLayout();// // btnStart// this.btnStart.Location = new System.Drawing.Point(871, 5);this.btnStart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.btnStart.Name = "btnStart";this.btnStart.Size = new System.Drawing.Size(152, 28);this.btnStart.TabIndex = 0;this.btnStart.Text = "开始比赛 直到 决出冠军";this.btnStart.UseVisualStyleBackColor = true;this.btnStart.Click += new System.EventHandler(this.btnStart_Click);// // btnRefresh// this.btnRefresh.Location = new System.Drawing.Point(1065, 5);this.btnRefresh.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.btnRefresh.Name = "btnRefresh";this.btnRefresh.Size = new System.Drawing.Size(133, 28);this.btnRefresh.TabIndex = 1;this.btnRefresh.Text = "刷新重新随机分配";this.btnRefresh.UseVisualStyleBackColor = true;this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);// // rtxtDisplay// this.rtxtDisplay.Location = new System.Drawing.Point(854, 37);this.rtxtDisplay.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.rtxtDisplay.Name = "rtxtDisplay";this.rtxtDisplay.Size = new System.Drawing.Size(378, 761);this.rtxtDisplay.TabIndex = 2;this.rtxtDisplay.Text = "";// // pnlTeam// this.pnlTeam.AutoScroll = true;this.pnlTeam.Location = new System.Drawing.Point(1, 1);this.pnlTeam.Name = "pnlTeam";this.pnlTeam.Size = new System.Drawing.Size(847, 797);this.pnlTeam.TabIndex = 3;// // FormLOL_S13// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(1255, 802);this.Controls.Add(this.pnlTeam);this.Controls.Add(this.rtxtDisplay);this.Controls.Add(this.btnRefresh);this.Controls.Add(this.btnStart);this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);this.Name = "FormLOL_S13";this.Text = "英雄联盟S13赛季_瑞士轮随机排名模拟器";this.Load += new System.EventHandler(this.FormTeam_Load);this.ResumeLayout(false);}#endregionprivate Button btnStart;private Button btnRefresh;private RichTextBox rtxtDisplay;private Panel pnlTeam;}
}

窗体FormLOL_S13代码随机匹配如下

FormLOL_S13.cs文件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace LOL_S13Demo
{public partial class FormLOL_S13 : Form{/// <summary>/// 比赛次数/// </summary>private static int matchCount = 0;/// <summary>/// 获胜战队列表,将进入下一轮,瑞士轮胜者组进行比赛/// </summary>private static List<Team> WinTeamList = new List<Team>();/// <summary>/// 失败战队列表,将进入下一轮,瑞士轮败者组进行比赛/// </summary>private static List<Team> FailTeamList = new List<Team>();/// <summary>/// 战队积分,胜利一场积分加1,失败一场积分加0/// </summary>private static Dictionary<Team, int> DictPoint = new Dictionary<Team, int>();public FormLOL_S13(){InitializeComponent();rtxtDisplay.ReadOnly = true;rtxtDisplay.Text = @"英雄联盟全球总决赛S13比赛规则采用瑞士轮:
瑞士轮赛制的由来
瑞士制:又称积分循环制,最早出现于1895年在瑞士苏黎世举办的国际象棋比赛中,故而得名。
其基本原则是避免种子选手一开始就交锋、拼掉,是比较科学合理、用得最多的一种赛制;英语名称为Swiss System。
欲通过瑞士轮的考验进入淘汰赛,那么需要在此阶段拿下三场胜利,反之遭遇三场失利就会被淘汰。
瑞士轮阶段的比赛,包含了五个轮次的比赛,每轮的比赛对阵都由抽签来决定。
第一轮有8场比赛:比赛全部为BO1(同赛区规避),这8场比赛结束之后,16支队伍会按照胜负情况分为两组,1-0战绩的队伍8支,0-1战绩的队伍8支。第二轮同样也是8场BO1的比赛:抽签后的对阵原则是1-0战绩的队伍和1-0战绩的队伍打(也就是第一轮的胜者打胜者),0-1战绩的队伍和0-1战绩的队伍打(也就是第一轮的败者打败者)。
此轮比赛结束后,会有4支2-0的队伍,4支0-2的队伍,8支1-1的队伍。第三轮的比赛就显得复杂一些了,因为第三轮就会诞生率先晋级淘汰赛以及不得不遗憾出局的队伍了:关乎淘汰和晋级的比赛都将是BO3的设定,2-0的队伍打2场BO3, 1-1的队伍打4场BO1,0-2的队伍打2场BO3。
第三轮比赛结束之后,会宣告2支队伍以3-0的成绩晋级淘汰赛,2支队伍以0-3的成绩遗憾出局。第四轮的比赛最为残酷:2-1的队伍打3场BO3,胜者晋级淘汰赛,1-2的队伍打3场BO3。比赛结束后晋级3支队伍,淘汰3支队伍;留在场上的6支队伍是全部都会是2-2的胜负场情形。第五轮的比赛是晋级淘汰赛的最后机会,2-2的队伍们打3场BO3,晋级3支队伍淘汰3支队伍。
综上所述:通过五个轮次的比赛,8支队伍得以晋级,8支队伍遭遇淘汰。
决出八强后,直接进入淘汰赛,决出四强
四强抽签两两比赛,决出胜者组,败者组。败者组决出季军,胜者组决出冠军、亚军";}private void FormTeam_Load(object sender, EventArgs e){TeamUtil.InitTeam();DictPoint.Clear();for (int i = 0; i < TeamUtil.ListTeam.Count; i++){DictPoint.Add(TeamUtil.ListTeam[i], 0);}LoadMatchTeam(TeamUtil.ListTeam);}/// <summary>/// 随机分配参赛战队列表/// </summary>/// <param name="TeamList"></param>private void LoadMatchTeam(List<Team> TeamList){pnlTeam.Controls.Clear();DisplayMessage($"开始加载S13英雄联盟参赛战队.参赛战队[{TeamList.Count}]个.参赛战队:\n{string.Join(",", TeamList.Select(c => c.TeamName))}");Application.DoEvents();//Thread.Sleep(500);int[] indexArray = new int[TeamList.Count];for (int i = 0; i < indexArray.Length; i++){indexArray[i] = i;}RandomUtil.Init(indexArray);int[] destArray = RandomUtil.Shuffle();int rowCount = (destArray.Length + 1) / 2;matchCount = rowCount;string[] matchTeams = new string[rowCount];//比赛对战战队for (int i = 0; i < rowCount; i++){UcTeam ucTeam1 = new UcTeam();ucTeam1.Name = $"ucTeam{i * 2 + 1}";Team Team1 = TeamList[destArray[i * 2]];ucTeam1.lblTeamName.Text = Team1.TeamName;ucTeam1.lblWinningRatio.Text = $"胜率:{Team1.WinningRatio}";ucTeam1.picTeamFlag.BackgroundImage = Team1.TeamFlag;ucTeam1.Tag = Team1;ucTeam1.Location = new Point(5, i * 200 + 5);pnlTeam.Controls.Add(ucTeam1);Button button = new Button();button.Name = $"button{i + 1}";button.Text = "VS";button.Font = new Font("宋体", 30, FontStyle.Bold);button.Size = new Size(100, 100);button.Location = new Point(310, i * 200 + 40);button.Enabled = false;//不允许界面交互pnlTeam.Controls.Add(button);Team item2 = null;if (i * 2 + 1 < destArray.Length){//对奇数个比赛战队特殊处理,最后一个战队直接胜利UcTeam ucTeam2 = new UcTeam();ucTeam2.Name = $"ucTeam{i * 2 + 2}";Team Team2 = TeamList[destArray[i * 2 + 1]];ucTeam2.lblTeamName.Text = Team2.TeamName;ucTeam2.lblWinningRatio.Text = $"胜率:{Team2.WinningRatio}";ucTeam2.picTeamFlag.BackgroundImage = Team2.TeamFlag;ucTeam2.Tag = Team2;ucTeam2.Location = new Point(455, i * 200 + 5);pnlTeam.Controls.Add(ucTeam2);item2 = Team2;}//对按钮进行数据绑定 对应两个参赛战队button.Tag = Tuple.Create(Team1, item2);button.Click += Button_Click;matchTeams[i] = $"【{Team1.TeamName} VS {(item2 == null ? "无" : item2.TeamName)}】";}DisplayMessage($"加载对战战队匹配完成.对战情况\n{string.Join(",\n", matchTeams)}");}/// <summary>/// 淘汰赛,利用胜率获取随机数算法,获取比赛的胜利一方,并将获胜战队插入胜利列表,以便进行下一次的随机分配/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button_Click(object sender, EventArgs e){Button button = sender as Button;if (button == null) {return;}Tuple<Team, Team> tuple = button.Tag as Tuple<Team, Team>;if (tuple == null) {return;}int randomNumber;Team failTeam;Team winTeam = TeamUtil.SoccerGame(tuple, out failTeam, out randomNumber);WinTeamList.Add(winTeam);//将获胜战队插入列表FailTeamList.Add(failTeam);//失败战队DictPoint[winTeam] = DictPoint[winTeam] + 1;DisplayMessage($"参赛战队【{tuple.Item1.TeamName},胜率:{tuple.Item1.WinningRatio}】 VS 【{(tuple.Item2 == null ? "无" : $"{tuple.Item2.TeamName},胜率:{tuple.Item2.WinningRatio}")}】");DisplayMessage($"    胜利战队【{winTeam.TeamName}】,失败战队【{failTeam.TeamName}】,模拟随机数【{randomNumber}】");UcTeam ucTeam = FindWinTeam(button, winTeam);if (ucTeam == null) {return;}Panel panel = new Panel();panel.Name = $"panel{button.Name.Substring(6)}";panel.Location = new Point(ucTeam.Location.X + 250, ucTeam.Location.Y + 10);panel.Size = new Size(100, 100);panel.BackgroundImage = null;Bitmap bitmap = new Bitmap(panel.Width, panel.Height);Graphics graphics = Graphics.FromImage(bitmap);graphics.DrawString("胜 利", new Font("华文楷体", 16), Brushes.Red, 10, 10);graphics.Dispose();panel.BackgroundImage = bitmap;pnlTeam.Controls.Add(panel);}/// <summary>/// 获取两个比赛战队胜利一方对应的控件/// </summary>/// <param name="button"></param>/// <param name="winTeam"></param>/// <returns></returns>private UcTeam FindWinTeam(Button button, Team winTeam) {int index = int.Parse(button.Name.Substring(6)) - 1;Control[] controls = pnlTeam.Controls.Find($"ucTeam{index * 2 + 1}", true);Control[] controls2 = pnlTeam.Controls.Find($"ucTeam{index * 2 + 2}", true);if (controls != null && controls.Length > 0){Team cTemp = ((UcTeam)controls[0]).Tag as Team;if (cTemp.TeamName == winTeam.TeamName){return (UcTeam)controls[0];}else{if (controls2 != null && controls2.Length > 0){cTemp = ((UcTeam)controls2[0]).Tag as Team;if (cTemp.TeamName == winTeam.TeamName){return (UcTeam)controls2[0];}}}}return null;}private void DisplayMessage(string message) {this.BeginInvoke(new Action(() => {if (rtxtDisplay.TextLength >= 40960) {rtxtDisplay.Clear();}rtxtDisplay.AppendText($"{DateTime.Now.ToString("HH:mm:ss")}-->{message}\n");rtxtDisplay.ScrollToCaret();}));}private void btnStart_Click(object sender, EventArgs e){Team[] FinalTwoTeam = new Team[2];//最终决赛的两个战队,分出冠军、亚军do{WinTeamList.Clear();for (int i = 0; i < matchCount; i++){Button button = pnlTeam.Controls.Find($"button{i + 1}", true)[0] as Button;Button_Click(button, null);Application.DoEvents();Thread.Sleep(2000);}if (WinTeamList.Count == 1) {//只有最后一个胜利战队,循环终止,找到亚军Team secondPlace = Array.Find(FinalTwoTeam, c => c.TeamName != WinTeamList[0].TeamName);DisplayMessage($"最终胜利战队,冠军【{WinTeamList[0].TeamName}】,亚军【{secondPlace.TeamName}】");MessageBox.Show($"最终胜利战队,冠军【{WinTeamList[0].TeamName}】,亚军【{secondPlace.TeamName}】", "圆满结束");break;}DisplayMessage($"当前胜利的战队为【{string.Join(",", WinTeamList.Select(Team => Team.TeamName))}】");Application.DoEvents();Thread.Sleep(3000);if (WinTeamList.Count == 2) {WinTeamList.CopyTo(FinalTwoTeam);string TeamBattle = $"决战即将开始,最终决赛双方:【{WinTeamList[0].TeamName} VS {WinTeamList[1].TeamName}】";DisplayMessage(TeamBattle);Application.DoEvents();Thread.Sleep(1000);MessageBox.Show(TeamBattle, "决战");}LoadMatchTeam(WinTeamList);} while (WinTeamList.Count >= 2);}private void btnRefresh_Click(object sender, EventArgs e){rtxtDisplay.Clear();WinTeamList.Clear();FormTeam_Load(null, null);}}
}

七、测试程序运行如图:

相关文章:

C#使用随机数模拟英雄联盟S13瑞士轮比赛

瑞士轮赛制的由来 瑞士制&#xff1a;又称积分循环制&#xff0c;最早出现于1895年在瑞士苏黎世举办的国际象棋比赛中&#xff0c;故而得名。其基本原则是避免种子选手一开始就交锋、拼掉&#xff0c;是比较科学合理、用得最多的一种赛制&#xff1b;英语名称为Swiss System。…...

RabbitMQ(高级特性)利用限流实现不公平分发

在RabbitMQ中&#xff0c;多个消费者监听同一条队列&#xff0c;则队列默认采用的轮询分发。但是在某种场景下这种策略并不是很好&#xff0c;例如消费者1处理任务的速度非常快&#xff0c;而其他消费者处理速度却很慢。此时如果采用公平分发&#xff0c;则消费者1有很大一部分…...

3 网络协议入门

从淘宝买东西举例来说明一次请求中的&#xff0c;网络有关的部分是打开浏览器&#xff0c;输入购物网站的地址&#xff1a; https://www.taobao.com/那么浏览器是怎么打开购物网站的首页的呢&#xff1f; (1)首先受到了一段http报文 HTTP/1.1 200 OK Date: Tue, 27 Mar 2018 …...

【星海出品】VUE(五)

表单 表单输入绑定 只需要v-model声明一下这个变量就可以。 还可以选择不同的类型&#xff0c;例如 type"checkbox“ v-model 也提供了 lazy、number、.trim 功能&#xff0c;只需要在v-model后面加入.lazy 例如&#xff1a;v-model.lazy”message“ <template><…...

项目实战之安装依赖npm install

文章目录 nvmdeasync包和node-gyp报错deasync包node-gyp报错 前言&#xff1a;有些人看着还活着其实已经凉了好一会儿了。 初拿到项目 初拿到项目肯定是先看配置 package.json的啦&#xff0c;看看都需要安装什么依赖&#xff0c;然后 npm install,OK结束 皆大欢喜。 ————…...

Java之图书管理系统

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家分享一下Java实现一个简易的图书管理系统&#xff01; 清风的个人主页&#x1f389;✏️✏️ &#x1f302;c/java领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&…...

用「埋点」记录自己,不妄过一生

最近有朋友问我「埋点怎么做」&#xff0c;给朋友讲了一些互联网广告的案例&#xff0c;从源头的数据采集讲到末尾的应用分析和流量分配等&#xff08;此处省略N多字&#xff09; 解释完以后&#xff0c;我想到一个问题&#xff1a;有了埋点可以做分析&#xff0c;那我们对自己…...

运维知识点-Docker从小白到入土

Docker从小白到入土 安装问题-有podmanCentos8使用yum install docker -y时&#xff0c;默认安装的是podman-docker软件 安装docker启动dockeryum list installed | grep dockeryum -y remove xxxx安装Docker安装配置下载安装docker启动docker&#xff0c;并设置开机启动下载所…...

基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程

一、创建项目 二、创建卡片 三、应用服务代码 Index.ets Entry Component struct Index {State TITLE: string OpenHarmony;State CONTEXT: string 创新召见未来&#xff01;;build() {Row() {Column() {Text(this.TITLE).fontSize(30).fontColor(0xFEFEFE).fontWeight(…...

MySQL和Java程序建立连接的底层原理(JDBC),一个SQL语句是如何执行的呢?

Java程序方面 1. JDBC驱动程序&#xff1a;JDBC驱动程序是连接MySQL数据库的核心组件。它是一组Java类&#xff0c;用于实现与MySQL数据库的通信协议和数据传输。驱动程序负责将Java程序发送的请求转化为MySQL数据库能够理解的格式&#xff0c;并将数据库返回的结果转化为Java…...

uniapp踩坑之项目:uniapp数字键盘组件—APP端

//在components文件夹创建digitKeyboard文件夹&#xff0c;再创建digitKeyboard.vue <!-- 数字键盘 --> <template><view class"digit-keyboard"><view class"digit-keyboard_bg" tap"hide"></view><view clas…...

聊一聊GPT——让我们的写作和翻译更高效

1 介绍 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer的语言生成模型&#xff0c;由OpenAI开发。它采用了无监督的预训练方式&#xff0c;通过处理大量的文本数据进行自我学习&#xff0c;从而提高其语言生成的能力。 GPT在自然语言…...

413 (Payload Too Large) 2023最新版解决方法

文章目录 出现问题解决方法 出现问题 博主在用vue脚手架开发的时候&#xff0c;在上传文件的接口中碰到 这样一个错误&#xff0c;查遍所有csdn&#xff0c;都没有找到解决方法&#xff0c;通过一些方式&#xff0c;终于解决了。 解决方法 1.打开Vue项目的根目录。 2.在根目…...

uboot启动linux kernel的流程

目录 前言流程图autoboot_commandrun_command_listdo_bootmdo_bootm_statesdo_bootm_linuxboot_prep_linuxboot_jump_linux 前言 本文在u-boot启动流程分析这篇文章的基础上&#xff0c;简要梳理uboot启动linux kernel的流程。 流程图 其中&#xff0c; autoboot_command位于…...

垃圾回收系统小程序定制开发搭建攻略

在这个数字化快速发展的时代&#xff0c;垃圾回收系统的推广对于环境保护和可持续发展具有重要意义。为了更好地服务于垃圾回收行业&#xff0c;本文将分享如何使用第三方制作平台乔拓云网&#xff0c;定制开发搭建垃圾回收系统小程序。 首先&#xff0c;使用乔拓云网账号登录平…...

可变参数模板

1. sizeof...计算参数个数 template<typename... Ts> void magic(Ts... args) {std::cout << sizeof...(args) << std::endl; } 2.递归模板函数 template<typename T> void printf1(T value) {std::cout << value << std::endl; }templ…...

坐公交:内外向乘客依序选座(python字典、字符串、元组)

n排宽度不一的座位&#xff0c;每排2座&#xff0c;2n名内外向乘客依序上车按各自喜好选座。 (笔记模板由python脚本于2023年11月05日 21:49:31创建&#xff0c;本篇笔记适合熟悉python列表list、字符串str、元组tuple的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…...

十年老程序员分享13个最常用的Python深度学习库和介绍,赶紧收藏码住!

文章目录 前言CaffeTheanoTensorFlowLasagneKerasmxnetsklearn-theanonolearnDIGITSBlocksdeepypylearn2Deeplearning4j关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…...

【pytorch源码分析--torch执行流程与编译原理】

背景 解读torch源码方便算子开发方便后续做torch 模型性能开发 基本介绍 代码库 https://github.com/pytorch/pytorch 模块介绍 aten: A Tensor Library的缩写。与Tensor相关的内容都放在这个目录下。如Tensor的定义、存储、Tensor间的操作&#xff08;即算子/OP&#xff…...

编辑器报警处理

1、warning CS8600: 将 null 文本或可能的 null 值转换为不可为 null 类型。 原代码 string returnedString Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned); 处理后的代码 string returnedString Marshal.PtrToStringAuto(pReturnedString, (int)bytesR…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

使用ch340继电器完成随机断电测试

前言 如图所示是市面上常见的OTA压测继电器&#xff0c;通过ch340串口模块完成对继电器的分路控制&#xff0c;这里我编写了一个脚本方便对4路继电器的控制&#xff0c;可以设置开启时间&#xff0c;关闭时间&#xff0c;复位等功能 软件界面 在设备管理器查看串口号后&…...