标题:初学者,想要Winform实例的进来!
只看楼主
木却
Rank: 1
来 自:武汉
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-5-17
得分:0 
很不错了
2010-05-17 15:52
宇电
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-8-7
得分:0 
学习了
2010-08-07 20:25
swtlss
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-10-15
得分:0 
我下了 不会打开 谁能教教我
2010-10-15 11:09
zuie6812
Rank: 1
等 级:新手上路
帖 子:8
专家分:2
注 册:2009-11-2
得分:0 
八数码问题还是很简单的。
一:游戏
Form1视图添加tableLayoutPanel控件:tableLayoutPanel1
初始化://生成随机数列
        private List<int> RandomNumber()
        {
            List<int> array = new List<int>();
            Random rand = new Random();
            int x;
            while (array.Count < 9)
            {
                x = rand.Next(9);
                if (array.IndexOf(x) == -1)
                    array.Add(x);
            }
            return array;
        }

//判断是否有解
        private bool IsPass(List<int> a)
        {
            int sum = 0;
            for (int i = 0; i < 9; i++)
            {
                int s = 0;
                if (a[i] == 0)
                    continue;
                for (int j = 0; j < i; j++)
                {
                    if (a[j] == 0)
                        continue;
                    if (a[i] > a[j])
                        s++;
                }
                sum += s;
            }
            if (sum % 2 == 0)
                return true;
            else
                return false;
        }
private void Create()
        {
            LabelList.Clear();
            DataList.Clear();
            tableLayoutPanel1.Controls.Clear();
            
            while (true)
            {
                if (IsPass(RandomNumber()))
                {
                    DataList = RandomNumber();
                    break;
                }
                else
                {
                    continue;
                }
            }
            Font m_font = new Font("宋体", 20, FontStyle.Bold);
            Label m_label;
            for (int i = 0; i < 9; i++)
            {
                m_label = new Label();
                m_label.AutoSize = false;
                m_label.Font = m_font;
                m_label.Size = new Size(40, 40);
                m_label.TextAlign = ContentAlignment.MiddleCenter;
                if (DataList[i] == 0)
                {
                    m_label.Text = " ";
                    pi = i;
                }
                else
                {
                    m_label.Text = DataList[i].ToString();
                }
                LabelList.Add(m_label);
                tableLayoutPanel1.Controls.Add(m_label);
            }
           
        }
 private bool MoveUp()
        {
            int i = pi + 3;
            if (i >= 0 && i <= 8)
            {
                Sweap(i);
                return true;
            }
            else
                return false;
        }
        private bool MoveDown()
        {
            int i = pi - 3;
            if (i >= 0 && i <= 8)
            {
                Sweap(i);
                return true;
            }
            else
                return false;
        }
        private bool MoveLeft()
        {
            int i = pi + 1;
            if (i <= 8 && i%3!=0)
            {
                Sweap(i);
                return true;
            }
            else
                return false;
 
        }
        private bool MoveRight()
        {
            int i = pi -1; ;
            if (i >= 0 &&i%3!=2)
            {
                Sweap(i);
                return true;
            }
            else
                return false;
 
        }
private void Sweap(int i)
        {
            label1.Text = (++step).ToString();
            int inttemp;
            string strtemp;
            inttemp = DataList[pi];
            DataList[pi] = DataList[i];
            DataList[i] = inttemp;
            strtemp = LabelList[pi].Text;
            LabelList[pi].Text = LabelList[i].Text;
            LabelList[i].Text = strtemp;
            pi = i;
            if (CheckOver())
                MessageBox.Show("恭喜过关");
        }
        private bool CheckOver()
        {
            int i = 1;
            foreach (int l in DataList)
            {
                if (l != i++ % 9)
                    return false;
            }
            return true;

        }
==================打完收工。
二:求最短路径
最短路径用int表示数据。
移动的算法有点麻烦。用树状图理解比较容易。
        初始状态
          |
初始状态可生成的N种状态
          |
N=1时的N种状态 …… N=N时的N种状态
这样分析。就需要有一个哈希表,存放已经生成的状态。
一个队列,存放将要生成的状态。
while(i++<362880)
{
    int newcode=出队元素。
for(int i=0;i<4;i++)  //每一个编码最多可以生成四种状态 :上下左右
{
    if(……)  //判断是否可以上(i=0) 下(i=1) 左(i=2) 右(i=3)移动。并且移动后的编码不存在于哈希表中
else   
   …… //哈希表.add(newcode,i);
if(newcode = endcode)   //也就是通常的132456780
return;
}
}
如果要输出路径
从哈希表中返回就可以了。 不过因为是逆向的,方向应该是正好相反。

这种算法,应该就是广度优先搜索了。
2010-11-30 04:46
zuie6812
Rank: 1
等 级:新手上路
帖 子:8
专家分:2
注 册:2009-11-2
得分:0 
上面的代码是随手写的,可能有错误。
但是思路就是这样了。
不过,要实现最短路径。不能用list<int> 表示编码(会很慢)。
最好使用int表示,只是移动的算法会比较复杂一点。
2010-11-30 04:50
shenjitianti
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-11-30
得分:0 
学习下
2010-12-01 22:10
ixiaoxiang
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-2-10
得分:0 
我来学一下
2011-02-15 15:53
ixiaoxiang
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-2-10
得分:0 
请问楼主:窗体设计器中 this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);这行代码是自动生成的吗?该如何自动生成?谢谢!
2011-02-16 08:30
ixiaoxiang
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-2-10
得分:0 
也就是问:1~9那些键,是label还是button?
2011-02-17 16:19
lary0501
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-8-4
得分:0 
谢谢分享
2011-08-04 10:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-283073-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.159359 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved