【水汐のC#】2048

C#实现控件数组
DotNet里取消了控件数组,这让习惯了使用VB控件的程序员非常不适应。有什么办法能够实现控件数组的功能吗?答案是肯定的。

   众所周知,控件数组最主要的两个优点:可以循环附值;可以响应同一个事件。从而大大简化了代码。下面根据这两个方面,举一个例子。

   新建一个工程,在窗体上添加5个textbox(textBox1...textBox5)和2个button (button1、button2)。

   1.循环附值

      总的来说,有两种实现方法:

      1.1 定义动态的控件数组。因为DotNet里支持动态的控件数组,所以我们可以把已设计好的控件,附给动态的数组,这样就可以任意的使用了。代码如下:

           private void button1_Click(object sender, System.EventArgs e)

           {
                  TextBox[] myTextBox = new TextBox[5];
                  myTextBox[0] = textBox1;
                   myTextBox[1] = textBox2;
                  myTextBox[2] = textBox3;
                  myTextBox[3] = textBox4;
                  myTextBox[4] = textBox5;

                 for ( int i=0;i< 5;i++)
                 {
                        myTextBox[i].Text = "fill_1";
                 }
            }
   来源         https://www.cnblogs.com/tanding/archive/2012/07/16/2593289.html

4.13更新
费堵塞延时

public static void Delay(int milliSecond)
{
   
    int start = Environment.TickCount;
    while (Math.Abs(Environment.TickCount - start) < milliSecond)
    {
   
        Application.DoEvents();
    }
}
https://www.csdn.net/gather_2c/MtTagg3sODctYmxvZwO0O0OO0O0O.html


Application.DoEvents();+sleep()
如果没有加上 DoEvents的话,由于循环时间会比较久就会出现假死的状态,而且程序不能处理其他的事件。而如果加上DoEvents的话就会对文本框的值实时响应,给用户带来较好的用户体验,可是DoEvents也带来了效率上的问题,处理同样的一个事件调用了DoEvents后效率降低了好几倍,这也是为什么要慎用的原因了。

线程和Application.DoEvents()
创建辅助线程
应用程序可以创建一个或多个线程以执行方法。创建辅助(或从属)线程的第一个步骤是创建 ThreadStart 代理,指定要由该线程执行的方法。然后将 ThreadStart 代理传递给 Thread 类的构造函数。例如,要启动新的线程并执行 MyFunction 方法,请调用 Thread 类的 Start 方法,如下所示:

ThreadStart starter = new ThreadStart(MyFunction);
Thread t = new Thread(starter);
t.Start();
从辅助线程更新用户界面
您可以使用 Control.Invoke 从 UI 线程以外的其他线程更新用户界面 (UI)。此方法在 UI 线程上的控件线程上下文中执行代理。.NET Framework 精简版只支持 .NET Framework 完整版中的重载 Control.Invoke 方法。Control.Invoke 只使用一个参数:一个指定在 UI 线程上执行哪个方法的代理。该代理的类型必须为 EventHandler,并且具有以下签名:

void MyFunctionName(object sender, EventArgs e)
需要注意的一点是,如果要在辅助线程中更新 UI,就必须在代码中调用 Application.DoEvents()。调用 Application.DoEvents() 可确保辅助线程激发的任何事件都由该 UI 线程处理。

下面的示例代码说明如何创建辅助线程,然后从 UI 线程和辅助线程更新名为 listBox1 的 ListBox 控件:

// 此变量将保留辅助线程设置的一些文本
public string Message = "";
// 创建辅助线程,然后将项目从 UI 线程添加到
// ListBox 中
public void DoThreading()
{
   
// 创建并启动辅助线程
ThreadStart starter = new ThreadStart(this.UpdateListBox);
Thread t = new Thread(starter);
t.Start();
// 循环 4 次,每次都向 ListBox 中添加一条消息
for(int i = 0; i < 4; i++);
{
   
this.listBox1.Items.Add("来自 UI 线程的消息");
this.listBox1.Update();
// 处理 UI 线程中排队的事件
Application.DoEvents();
// 将进程挂起一秒钟
Thread.Sleep(1000);
}
this.listBox1.Items.Add("来自 UI 线程的上一条消息");
this.listBox1.Update();
}
public void UpdateListBox()
{
   
for(int j = 0; j < 5; j++)
{
   
// 设置要从辅助线程添加到 ListBox 中的
// 消息
this.Message = "辅助线程的循环数 = " + j.ToString();
// 在 ListBox 的线程上下文中调用 WorkerUpdate
// 方法
this.listBox1.Invoke(new EventHandler(WorkerUpdate));
Thread.Sleep(700);
}
}
// 为更新 ListBox 从辅助线程中
// 调用的代理
public void WorkerUpdate(object sender, EventArgs e)
{
   
this.listBox1.Items.Add(this.Message);
this.listBox1.Update();
}

https://www.cnblogs.com/jxnclyk/archive/2010/08/06/1794473.html
https://blog.csdn.net/wjhl04/article/details/82620358
https://www.cnblogs.com/rainbow70626/p/4739161.html

2048 代码 4.7更新(未完成)

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;
using System.Threading;

namespace _2048
{
   
	public partial class Form1 : Form
	{
   
		public int[,] map = new int[4, 4];
		RichTextBox[,] mapp = new RichTextBox[4, 4];
		bool died()
		{
   
			for (int i = 0; i < 4; i++)
				for (int j = 0; j < 4; j++)
				{
   
					if (map[i, j] == 0) return true;
				}
			return false;
		}
		void clearmap()
		{
   
			for (int i = 0; i < 4; i++)
				for (int j = 0; j < 4; j++)
					map[i, j] = 0;
		}
		void clearmapp()
		{
   
			for (int i = 0; i < 4; i++)
				for (int j = 0; j < 4; j++)
				{
    mapp[i, j].Text = "";
				  mapp[i, j].BackColor = Color.White;
				}
		}
		bool notfull()
		{
   
			for (int i = 0; i < 4; i++)
				for (int j = 0; j < 4; j++)
					if (map[i, j] == 0) return true;
			return false;
		}
		void setnew(int b)
		{
   
			Random rd = new Random();
			for (int a = 0; a < b;)
			{
   
				int i = rd.Next(0, 4);
				int j = rd.Next(0, 4);
				if (map[i, j] == 0) {
    map[i, j] = 2; a++; }
				if (!notfull()) break;
			}

		}
		void rdsetnew()
		{
   
			
			Random rd = new Random();
			int a = rd.Next(1, 3);
			setnew(a);
			drawmap();
		}
		void drawmap()
		{
   
			clearmapp();
			for (int i = 0; i < 4; i++)
				for (int j = 0; j < 4; j++)
					if (map[i, j] != 0)
					{
   
						switch (map[i, j])
						{
   
							case 2:
								{
   
									mapp[i, j].BackColor = Color.LightYellow;
									mapp[i, j].Text = Convert.ToString(map[i, j]);									
									break;
								}
							case 4:
								{
   
									mapp[i, j].BackColor = Color.Aqua;
									mapp[i, j].Text = Convert.ToString(map[i, j]);
									
									break;
								}
							case 8:
								{
   
									mapp[i, j].BackColor = Color.DeepPink;
									mapp[i, j].Text = Convert.ToString(map[i, j]);									
									break;
								}
							case 16:
								{
   
									mapp[i, j].Text = Convert.ToString
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值