用c#程序编写舒尔特方格的窗体程序: (1) 初始化:设定边长n,取值范围[3, 10],默认值自定。初始化一个方阵,方阵中内容为空。例如当n=5时,显示一个5*5的空白方阵(可用按钮模拟单元格)。 勾选是否选用消除模式(消除模式时,用户按顺序正确点击数字之后,数字立刻消失)。 (2) 专注力训练:点击开始按钮,用n*n个数字填满方阵中的每个位置,数字取值范围[1, n*n],数字所在位置随机。例如当n=5时,用[1, 25]之间的数字随机放到方格中。 计时开始,并显示所用时间。 用户从1开始按数列升序依次点击方格中的数字,如果点击正确,则该数字字体加粗(消除模式时,该数字消失)。 当所有方格中的数字均被正确点击后,训练结束,计时同时结束,提示用户本次所用时长。记录本次成绩,包括n和训练完成时长。 (3) 历史记录:查询不同n时,历史最好成绩。查询某一n时,所有的历史成绩。
时间: 2024-02-01 21:15:32 浏览: 167
C#语言编写的窗体小程序
很高兴为您提供帮助,以下是基于WinForm的C#程序编写舒尔特方格的窗体程序:
```csharp
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 SchulteGrid
{
public partial class Form1 : Form
{
private int n = 5; // 方阵边长,默认为5
private bool isEliminationMode = false; // 是否消除模式,默认不选用
private int[,] grid; // 方阵
private int currentNum = 1; // 当前应该点击的数字
private int correctCount = 0; // 正确点击的数字个数
private DateTime startTime; // 训练开始时间
private DateTime endTime; // 训练结束时间
private List<int> records; // 历史成绩
public Form1()
{
InitializeComponent();
InitializeGrid();
}
// 初始化方阵
private void InitializeGrid()
{
grid = new int[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
grid[i, j] = -1; // -1表示未填数字
}
}
DrawGrid();
}
// 绘制方阵
private void DrawGrid()
{
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.ColumnStyles.Clear();
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.ColumnCount = n;
tableLayoutPanel1.RowCount = n;
for (int i = 0; i < n; i++)
{
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F / n));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F / n));
for (int j = 0; j < n; j++)
{
Button button = new Button();
button.Dock = DockStyle.Fill;
button.Font = new Font(button.Font.FontFamily, 12);
button.Click += new EventHandler(Button_Click);
tableLayoutPanel1.Controls.Add(button, j, i);
}
}
}
// 开始训练
private void btnStart_Click(object sender, EventArgs e)
{
InitializeGrid();
ResetGame();
Random random = new Random();
List<int> nums = new List<int>();
for (int i = 1; i <= n * n; i++)
{
nums.Add(i);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int index = random.Next(nums.Count);
grid[i, j] = nums[index];
nums.RemoveAt(index);
}
}
DrawGridNumbers();
startTime = DateTime.Now;
}
// 重置游戏
private void ResetGame()
{
currentNum = 1;
correctCount = 0;
lblTime.Text = "00:00:00";
timer1.Enabled = true;
}
// 绘制数字
private void DrawGridNumbers()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Control control = tableLayoutPanel1.GetControlFromPosition(j, i);
Button button = (Button)control;
button.Text = isEliminationMode ? "" : grid[i, j].ToString();
button.Tag = new Point(i, j);
button.Font = new Font(button.Font, FontStyle.Regular);
button.Enabled = true;
}
}
}
// 点击数字按钮
private void Button_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
if (int.TryParse(button.Text, out int num))
{
if (num == currentNum)
{
button.Font = new Font(button.Font, FontStyle.Bold);
button.Enabled = !isEliminationMode;
grid[(int)button.Tag.X, (int)button.Tag.Y] = -1;
currentNum++;
correctCount++;
if (currentNum > n * n)
{
timer1.Enabled = false;
endTime = DateTime.Now;
MessageBox.Show("你用时" + (endTime - startTime).ToString(@"hh\:mm\:ss") + "完成训练!");
records.Add((int)(endTime - startTime).TotalSeconds);
SaveRecords();
}
}
}
}
// 计时器
private void timer1_Tick(object sender, EventArgs e)
{
lblTime.Text = (DateTime.Now - startTime).ToString(@"hh\:mm\:ss");
}
// 保存历史成绩
private void SaveRecords()
{
Properties.Settings.Default.Records = string.Join(",", records);
Properties.Settings.Default.Save();
}
// 加载历史成绩
private void LoadRecords()
{
records = new List<int>();
string[] recordStrings = Properties.Settings.Default.Records.Split(',');
foreach (string recordString in recordStrings)
{
if (int.TryParse(recordString, out int record))
{
records.Add(record);
}
}
}
// 窗体加载时加载历史记录
private void Form1_Load(object sender, EventArgs e)
{
LoadRecords();
}
// 查询历史最好成绩
private void btnBest_Click(object sender, EventArgs e)
{
int bestRecord = -1;
foreach (int record in records)
{
if (bestRecord == -1 || record < bestRecord)
{
bestRecord = record;
}
}
if (bestRecord == -1)
{
MessageBox.Show("没有历史记录!");
}
else
{
MessageBox.Show("历史最好成绩是" + bestRecord + "秒。");
}
}
// 查询某一n时的历史成绩
private void btnHistory_Click(object sender, EventArgs e)
{
int n = (int)numN.Value;
List<int> history = new List<int>();
foreach (int record in records)
{
if (record != -1 && GetGridSize(record) == n)
{
history.Add(record);
}
}
if (history.Count == 0)
{
MessageBox.Show("没有历史记录!");
}
else
{
string message = "共" + history.Count + "条历史记录:\r\n";
foreach (int record in history)
{
message += record + "秒\r\n";
}
MessageBox.Show(message);
}
}
// 根据用时计算方阵边长
private int GetGridSize(int time)
{
for (int i = 3; i <= 10; i++)
{
if (i * i == time)
{
return i;
}
}
return -1;
}
// 边长改变时重新初始化方阵
private void numN_ValueChanged(object sender, EventArgs e)
{
n = (int)numN.Value;
InitializeGrid();
}
// 是否选用消除模式改变时重置游戏
private void cbElimination_CheckedChanged(object sender, EventArgs e)
{
isEliminationMode = cbElimination.Checked;
ResetGame();
}
}
}
```
在窗体设计器中添加一个 TableLayoutPanel 控件,设置其 Dock 属性为 Fill,然后在代码中添加按钮事件处理程序。其中,菜单栏上的“开始”按钮点击事件处理程序为 btnStart_Click,计时器每秒触发一次的 Tick 事件处理程序为 timer1_Tick,查询历史最好成绩的按钮点击事件处理程序为 btnBest_Click,查询某一n时的历史成绩的按钮点击事件处理程序为 btnHistory_Click,边长改变时的事件处理程序为 numN_ValueChanged,是否选用消除模式改变时的事件处理程序为 cbElimination_CheckedChanged。同时,还需要添加窗体加载时的事件处理程序 Form1_Load,以便加载历史记录。在窗体设计器中添加一个 Label 控件和两个 CheckBox 控件,用来显示用时、选择消除模式和查询历史成绩。最后,在应用程序的属性设置中添加一个名为 Records 的用户设置,用来保存历史成绩。
阅读全文