鱼C论坛

 找回密码
 立即注册
查看: 1650|回复: 0

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

[复制链接]
发表于 2020-5-12 19:27:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
namespace Paixu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
      
        const int N = 4;//按钮的行数与列数
        Button[,] buttons_creat = new Button[N, N];
        /*规定按钮控件的具体情况,为二维数组
         * new Button[N,N]是表示的个数,不要搞错了!为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[i, j] = btn;
                    //先大组后小组,确定位置,放入按钮
                    //这里的[i,j]不是数量,是确定位置,所以从0起
                    this.Controls.Add(btn);
                    //把按钮加入界面
                   
                }
                buttons_creat[N - 1, N - 1].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[i, j].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[i, j].Visible == false)
                    {
                        return buttons_creat[i, j];
                    }
                
            
            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[a, b], buttons_creat[c, d]);
                //运行交换函数,这个函数需要自己写
            }

        }
        //创建交换函数
        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函数有啥问题...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 10:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表