鱼C论坛

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

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

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

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

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

x
  1. namespace Paixu
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.         }
  9.       
  10.         const int N = 4;//按钮的行数与列数
  11.         Button[,] buttons_creat = new Button[N, N];
  12.         /*规定按钮控件的具体情况,为二维数组
  13.          * new Button[N,N]是表示的个数,不要搞错了!为4*4的按钮阵列
  14.          */

  15.         private void Form1_Load(object sender, EventArgs e)
  16.         {
  17.             GenerateAllButtons();
  18.         }
  19.         
  20.         void GenerateAllButtons()
  21.         {
  22.             int x = 100, y = 10, w = 45, d = 50;
  23.             for (int i = 0; i < N; i++)
  24.             //先出的循环,i必然是大组级的个数
  25.                 for (int j = 0; j < N; j++)
  26.                
  27.                 {//后出的循环,j小组级的个数
  28.                     int num = i * N + j;
  29.                     Button btn = new Button();
  30.                     btn.Text = (num + 1).ToString();
  31.                     btn.Top = y + d * i;
  32.                     btn.Left = x + d * j;//j+1,left增加50
  33.                     btn.Width = w;
  34.                     btn.Height = w;//方形按钮
  35.                     btn.Visible = true;//按钮设为可见
  36.                     btn.Tag = i * N + j;//这里把所有的按钮打上行列位置的标签
  37.                     btn.Click += new EventHandler(Btn_Click);
  38.                     //注册事件,点击btn就会触发btn_click事件
  39.                     buttons_creat[i, j] = btn;
  40.                     //先大组后小组,确定位置,放入按钮
  41.                     //这里的[i,j]不是数量,是确定位置,所以从0起
  42.                     this.Controls.Add(btn);
  43.                     //把按钮加入界面
  44.                   
  45.                 }
  46.                 buttons_creat[N - 1, N - 1].Visible = false;
  47.         }
  48.         //创建点击数字按钮,其与临近的空白交换的函数
  49.         private void Btn_Click(object sender, EventArgs e)
  50.         {
  51.             Button btn = sender as Button;//事件发出者,被点击的按钮?
  52.             Button blank = hidden_button();//调用空白按钮

  53.             //调用临近函数
  54.             if(neighbor(btn,blank))
  55.             {
  56.                 Swap(btn, blank);//交换
  57.                 blank.Focus();//锁定blank
  58.             }
  59.             //判断是否完成?调用函数
  60.             if(ok_no())
  61.             {
  62.                 MessageBox.Show("OK");
  63.             }
  64.         }
  65.         //创建Game win函数
  66.         bool ok_no()
  67.         {
  68.             for (int i = 0; i < N; i++)
  69.                 //先出的循环,i必然是大组级的个数
  70.                 for (int j = 0; j < N; j++)
  71.                 {//后出的循环,j小组级的个数
  72.                     if (buttons_creat[i, j].Text != (i * N + j + 1).ToString()) ;
  73.                     {
  74.                         return false;
  75.                     }

  76.                 }
  77.             return true;
  78.         }

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

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

  88.             if ((i1 == i2 && (j1 == j2 - 1 || j1 == j2 + 1))
  89.                 || (j1 == j2 && (i1 == i2 - 1 || i1 == i2 + 1)));
  90.                 return true;
  91.             return false;
  92.         }

  93.         //创建调用空白的函数,遍历16个按钮,
  94.         //返回不可见的按钮或null
  95.         Button hidden_button()
  96.         {
  97.            for(int i=0;i<N;i++)
  98.             
  99.                 for(int j=0;j<N;j++)
  100.                
  101.                     if(buttons_creat[i, j].Visible == false)
  102.                     {
  103.                         return buttons_creat[i, j];
  104.                     }
  105.                
  106.             
  107.             return null;
  108.         }
  109.         //创建打乱顺序这个函数
  110.         void Daluan_shunxun()
  111.         {
  112.             //多次随机交换
  113.             Random rnd = new Random();
  114.             for (int i =0; i <100;i++)
  115.             {
  116.                 int a = rnd.Next(N);
  117.                 /* random.Next()返回非负的一个随机数
  118.                    random.Next(MaxValue)返回小于最大值的随机数
  119.                    (minValue , maxValue )*/
  120.                 int b = rnd.Next(N);
  121.                 int c = rnd.Next(N);
  122.                 int d = rnd.Next(N);
  123.                 Swap(buttons_creat[a, b], buttons_creat[c, d]);
  124.                 //运行交换函数,这个函数需要自己写
  125.             }

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

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

  137.         }
  138.         
  139.         
  140.         private void button1_Click(object sender, EventArgs e)
  141.         {
  142.             //运行打乱顺序
  143.             Daluan_shunxun();
  144.         }

  145.       
  146.     }
  147. }
复制代码


其他都没有啥问题,但就是,现在任何按钮都可以和隐藏按钮交换,自己查了几遍没有看出neighbor函数有啥问题...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 03:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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