排块游戏

Posted on 2019-02-28 21:35  金色的省略号  阅读(220)  评论(0编辑  收藏  举报

排块游戏思路

1.代码,创建N*N个按键,采取窗体装载事件,自动生成
一、创建N*N个按键二维数组
二、窗体装载事件,生成N*N个按键
三、生成所有按键,采取二重循环依次产生每个按键
  1.设置按键Text,Top,Left,Width,Heigh,Visible,Tag属性
  2.注册按键Click事件//*
  3.按键加到按键数组并加到界面上
  最后一个按键的Visible属性为false
四、按键Click事件处理//*
  1.当前Button对象,sender
  2.查找隐藏按键,Visible属性为false的按键
  3.判断两个按键是否相邻,是左右还是上下关系,
  4.相邻交换,隐藏按键设焦点
  5.判断是否完成
五、查找隐藏按键
  行列循环查找按键数组属性,不是Visible就返回该按键的坐标
六、判断按键是否相邻
  依据按键Tag属性,确定两按键是否相邻
七、两按键交换
  1.交换两按键的Text属性
  2.交换两按键的Visible属性
八、判断是否完成
  查看按键数组与行列数是否相符,相符即完成

2.创建开始按键,打乱按键顺序
多次随机产生两个按键的行列坐标并交换按键

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9 using System.Windows.Forms;
 10 
 11 namespace Buttons
 12 {
 13     public partial class Form1 : Form
 14     {
 15         public Form1()
 16         {
 17             InitializeComponent();
 18         }
 19 
 20         const int N = 4;
 21         Button [,]buttons = new Button[N,N];
 22 
 23         private void Form1_Load(object sender, EventArgs e)
 24         {
 25             //产生所有按钮
 26             GenerateAllButtons();
 27         }
 28         //生成所有的按钮
 29         void GenerateAllButtons()
 30         {   //按钮组的左上角坐标,宽width,高depth
 31             int x0 = 55, y0 = 25, w = 45, d = 50;
 32             for (int r = 0; r < N; r++) //row 行
 33                 for (int c = 0; c < N; c++)//column 列
 34                 {   
 35                     int num = r * N + c; //第几行几列的数字
 36                     Button btn = new Button();//创建一个按钮
 37                     btn.Text = (num + 1).ToString();//按钮上的text
 38                     btn.Top = y0 + r * d;//按钮的top 行*高
 39                     btn.Left = x0 + c * d;//按钮的left 列*高
 40                     btn.Width = w; //按钮的宽
 41                     btn.Height = w;//按钮的高
 42 
 43                     btn.Visible = true;//按钮可见
 44 
 45                     btn.Tag = r * N + c; //这个数据用来表示它所在行列位置
 46 
 47                     //注册事件
 48                     btn.Click += new EventHandler(btn_Click);
 49                     buttons[r, c] = btn; //放到数组中
 50                     this.Controls.Add(btn); //加到界面上
 51                 }
 52             buttons[N - 1, N - 1].Visible = false; //最后一个不可见
 53         }
 54 
 55         //按钮点击事件处理
 56         void btn_Click(object sender, EventArgs e)
 57         {
 58             Button btn = sender as Button; //当前点中的按钮
 59             Button blank = FindHiddenButton(); //空白按钮
 60 
 61             //判断是否与空白块相邻,如果是,则交换
 62             if (IsNeighbor(btn, blank))
 63             {
 64                 Swap(btn, blank);
 65                 blank.Focus();
 66             }
 67 
 68             //判断是否完成了
 69             if (ResultIsOk())
 70             {
 71                 MessageBox.Show("ok");
 72             }
 73         }
 74 
 75         //查找隐藏的按钮
 76         Button FindHiddenButton()
 77         {
 78             for (int r = 0; r < N; r++)
 79                 for (int c = 0; c < N; c++)
 80                 {
 81                     if (!buttons[r, c].Visible)//如找到隐藏的按钮 返回坐标
 82                     {
 83                         return buttons[r, c];
 84                     }
 85                 }
 86             return null;//否则,返回null
 87         }
 88 
 89         //判断是否相邻
 90         bool IsNeighbor(Button btnA, Button btnB)
 91         {
 92             int a = (int)btnA.Tag; //Tag中记录是行列位置
 93             int b = (int)btnB.Tag;
 94 
 95             int r1 = a / N, c1 = a % N;//btnA所在行列
 96             int r2 = b / N, c2 = b % N;//btnB所在行列
 97 
 98             if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1) //左右相邻
 99                 || c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1))//上下相邻
100                 return true;
101             return false;
102         }
103 
104         //交换两个按钮
105         void Swap(Button btna, Button btnb)
106         {
107             string t = btna.Text; //butna butnb的Text交换
108             btna.Text = btnb.Text;
109             btnb.Text = t;
110 
111             bool v = btna.Visible;//butna butnb的Visible交换
112             btna.Visible = btnb.Visible;
113             btnb.Visible = v;
114         }
115 
116         //检查是否完成
117         bool ResultIsOk()
118         {
119             for (int r = 0; r < N; r++)
120                 for (int c = 0; c < N; c++)
121                 {   //一旦发现按钮的Text与所在行列不符,返回false
122                     if (buttons[r, c].Text != (r * N + c + 1).ToString())
123                     {
124                         return false;
125                     }
126                 }
127             return true;
128         }
129 
130         private void button1_Click(object sender, EventArgs e)
131         {
132             //打乱顺序
133             Shuffle();
134         }
135 
136         //打乱顺序
137         void Shuffle()
138         {
139             //多次随机交换两个按钮
140             Random rnd = new Random();
141             for (int i = 0; i < 100; i++)
142             {
143                 int a = rnd.Next(N);
144                 int b = rnd.Next(N);
145                 int c = rnd.Next(N);
146                 int d = rnd.Next(N);
147                 Swap(buttons[a, b], buttons[c, d]);
148             }
149         }
150     }
151 }
排块游戏代码