ghsydota 发表于 2020-5-12 19:27:52

十五指游戏的问题,相邻函数不起作用

namespace Paixu
{
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
      }
      
      const int N = 4;//按钮的行数与列数
      Button[,] buttons_creat = new Button;
      /*规定按钮控件的具体情况,为二维数组
         * new Button是表示的个数,不要搞错了!为4*4的按钮阵列
         */

      private void Form1_Load(object sender, EventArgs e)
      {
            GenerateAllButtons();
      }
      
      void GenerateAllButtons()
      {
            int x = 100, y = 10, w = 45, d = 50;
            for (int i = 0; i < N; i++)
            //先出的循环,i必然是大组级的个数
                for (int j = 0; j < N; j++)
               
                {//后出的循环,j小组级的个数
                  int num = i * N + j;
                  Button btn = new Button();
                  btn.Text = (num + 1).ToString();
                  btn.Top = y + d * i;
                  btn.Left = x + d * j;//j+1,left增加50
                  btn.Width = w;
                  btn.Height = w;//方形按钮
                  btn.Visible = true;//按钮设为可见
                  btn.Tag = i * N + j;//这里把所有的按钮打上行列位置的标签
                  btn.Click += new EventHandler(Btn_Click);
                  //注册事件,点击btn就会触发btn_click事件
                  buttons_creat = btn;
                  //先大组后小组,确定位置,放入按钮
                  //这里的不是数量,是确定位置,所以从0起
                  this.Controls.Add(btn);
                  //把按钮加入界面
                  
                }
                buttons_creat.Visible = false;
      }
      //创建点击数字按钮,其与临近的空白交换的函数
      private void Btn_Click(object sender, EventArgs e)
      {
            Button btn = sender as Button;//事件发出者,被点击的按钮?
            Button blank = hidden_button();//调用空白按钮

            //调用临近函数
            if(neighbor(btn,blank))
            {
                Swap(btn, blank);//交换
                blank.Focus();//锁定blank
            }
            //判断是否完成?调用函数
            if(ok_no())
            {
                MessageBox.Show("OK");
            }
      }
      //创建Game win函数
      bool ok_no()
      {
            for (int i = 0; i < N; i++)
                //先出的循环,i必然是大组级的个数
                for (int j = 0; j < N; j++)
                {//后出的循环,j小组级的个数
                  if (buttons_creat.Text != (i * N + j + 1).ToString()) ;
                  {
                        return false;
                  }

                }
            return true;
      }

      //创建相邻函数
      bool neighbor(Button btn_a,Button btn_b)
      {
            int a = (int)btn_a.Tag;//Tag=i * N + j,i是行,j为列
            int b = (int)btn_b.Tag;
            int i1 = a / N, j1 = a % N;
            int i2 = b / N, j2 = b % N;

            //如何判断相邻呢,行号相等,列号差1
            //或列号相等,行号差1

            if ((i1 == i2 && (j1 == j2 - 1 || j1 == j2 + 1))
                || (j1 == j2 && (i1 == i2 - 1 || i1 == i2 + 1)));
                return true;
            return false;
      }

      //创建调用空白的函数,遍历16个按钮,
      //返回不可见的按钮或null
      Button hidden_button()
      {
         for(int i=0;i<N;i++)
            
                for(int j=0;j<N;j++)
               
                  if(buttons_creat.Visible == false)
                  {
                        return buttons_creat;
                  }
               
            
            return null;
      }
      //创建打乱顺序这个函数
      void Daluan_shunxun()
      {
            //多次随机交换
            Random rnd = new Random();
            for (int i =0; i <100;i++)
            {
                int a = rnd.Next(N);
                /* random.Next()返回非负的一个随机数
                   random.Next(MaxValue)返回小于最大值的随机数
                   (minValue , maxValue )*/
                int b = rnd.Next(N);
                int c = rnd.Next(N);
                int d = rnd.Next(N);
                Swap(buttons_creat, buttons_creat);
                //运行交换函数,这个函数需要自己写
            }

      }
      //创建交换函数
      void Swap(Button btn_a,Button btn_b)
      {
            string t = btn_a.Text;//存储a值
            btn_a.Text = btn_b.Text;//把b值附给a
            btn_b.Text = t;//把a值赋给b

            //考虑16号的隐藏情况,可见性也要进行调换
            bool v = btn_a.Visible;
            btn_a.Visible = btn_b.Visible;
            btn_b.Visible = v;

      }
      
      
      private void button1_Click(object sender, EventArgs e)
      {
            //运行打乱顺序
            Daluan_shunxun();
      }

      
    }
}

其他都没有啥问题,但就是,现在任何按钮都可以和隐藏按钮交换,自己查了几遍没有看出neighbor函数有啥问题...
页: [1]
查看完整版本: 十五指游戏的问题,相邻函数不起作用