zoukankan      html  css  js  c++  java
  • 排块游戏

    排块游戏思路

    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 }
    排块游戏代码

  • 相关阅读:
    Java线程
    IO流
    staitc
    权限修饰符
    nexus
    Maven
    Git 常用命令
    获取url参数
    创建存储过程和函数
    三层引号
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/10453324.html
Copyright © 2011-2022 走看看