基于C#的winform实现数字华容道游戏

数字华容道游戏类似于拼图游戏,只需将数字1~15按顺序排好即可。该游戏逻辑比较简单,易于编程实现。

游戏界面如图:

编程准备:

所需控件:label 用于显示时间, 一个重新开始的button,一个panel容器来存放数字块(按钮),再加一个timer来计时及判断游戏是否结束。

主要代码:

variables类:

class variables
    {
        public static int[] a = new int[16] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
             14, 15,16 };
        public static Button[,] buttons = new Button[4, 4];
    }

数组a用于存放数字,随机打乱顺序并分配给buttons。buttons即游戏中的方块。

Methods类:

 class Method
    {
        //数组打乱顺序
        public int[] NewSorting(int[]a)
        {
            Random r = new Random();
            for(int i=0;i<a.Length;i++)
            {
                int temp = a[i];
                int randomindex = r.Next(0, a.Length);
                a[i] = a[randomindex];
                a[randomindex] = temp;
            }
            return a;
        }
 
        //向容器中添加16个按钮
        public void AddButtons(Panel panel,Button[,] buttons)
        {
            //数组随机打乱顺序
            int[] s = NewSorting(a);
            //每个按钮的宽度及高度
            int width = 32;
            int height = 32;
            int x0 = panel.Location.X;
            int y0 = panel.Location.Y;
            for(int i=0;i<buttons.GetLength(0);i++)
                for(int j=0;j<buttons.GetLength(1);j++)
                {
                    Button butt = new Button();
                    //设置按钮相关属性
                    butt.Size = new System.Drawing.Size(width, height);
                    butt.Location = new System.Drawing.Point(x0 + (j + 1) * width, y0 + (i + 1) * height);
                    butt.Visible = true;
                    //打乱顺序的数组分配给每个button
                    butt.Text = s[i * buttons.GetLength(0) + j].ToString();
                    if (butt.Text=="16")
                     {
                        butt.Hide();
                      }
                    variables.buttons[i, j] = butt;
                    
                    //手动添加点击事件
                    butt.Click += new EventHandler(butt_Click);
                    //按钮添加到容器
                    panel.Controls.Add(butt);
                }
        }
 
        //自定义点击事件
        public void butt_Click(Object sender,EventArgs e)
        {
            Button butt = sender as Button;
            Button butt_16 = Find_Button16();
 
            //判断是否相邻,如果相邻则交换
            if(Neighboor(butt,butt_16))
            {
                swap(butt, butt_16);
                butt_16.Focus();
            }
        }
 
        //找出隐藏的按钮 即16所在的按钮
        public Button Find_Button16()
        {
            for(int i=0;i<buttons.GetLength(0);i++)
                for(int j=0;j<buttons.GetLength(1);j++)
                {
                    if (buttons[i, j].Visible == false)
                        return buttons[i, j];
                }
            return null;
        }
 
        //判断两个按钮是否相邻   即两个按钮的坐标位置是否差一个宽度或者高度
        public bool Neighboor(Button butt1, Button butt2)
        {
            int x1 = butt1.Location.X;
            int y1 = butt1.Location.Y;
 
            int x2 = butt2.Location.X;
            int y2 = butt2.Location.Y;
 
            if(((x1==x2)&&(Math.Abs(y1-y2)==butt1.Height))||((y1==y2)&&(Math.Abs(x1-x2)==butt1.Width)))
             {
                return true;
              }
            return false;
        }
 
        //交换两个按钮   交换text 与visible
        public void swap(Button butt1,Button butt2)
        {
            string s = butt1.Text;
            butt1.Text = butt2.Text;
            butt2.Text = s;
 
            bool a = butt1.Visible;
            butt1.Visible = butt2.Visible;
            butt2.Visible = a;
        }
 
        //判断游戏是否完成
        public bool GameoverOrNot()
        {
            for (int i = 0; i < buttons.GetLength(1); i++)
                for (int j = 0; j < buttons.GetLength(0); j++)
                {
                    if (int.Parse(variables.buttons[i, j].Text) != (i * buttons.GetLength(0) + j + 1))
                        return false;
                }
            return true;
        }
    }

游戏中的数字方块为Methods类中的AddButtons方法自动生成的,数字方块总共有16个,其中15个的visible属性为true,1个为false。

窗体界面代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
                   
        Method method = new Method();
        int count;
        private void Form1_Load(object sender, EventArgs e)
        {
            method.AddButtons(panel1, buttons);
            label2.Text = "0"+"S";  //初始时间
            timer1.Start();  //启动计时器
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            //默认100毫秒刷新一次
            count += 1;
            label2.Text = (count/10).ToString()+"S";
            if (method.GameoverOrNot())
            {
                timer1.Stop();
                MessageBox.Show("挑战成功!");
            }
        }
 
        private void ButtonR_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            for (int i = 0; i < buttons.GetLength(0); i++)
                for (int j = 0; j < buttons.GetLength(1); j++)
                {
                    buttons[i, j].Hide();
                }
 
            method.AddButtons(panel1, buttons);
            count = 0;
            timer1.Start();
        }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#实现数字华容道游戏

    本文实例为大家分享了C#实现数字华容道游戏的具体代码,供大家参考,具体内容如下 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windo

  • 基于C#的winform实现数字华容道游戏

    数字华容道游戏类似于拼图游戏,只需将数字1~15按顺序排好即可.该游戏逻辑比较简单,易于编程实现. 游戏界面如图: 编程准备: 所需控件:label 用于显示时间, 一个重新开始的button,一个panel容器来存放数字块(按钮),再加一个timer来计时及判断游戏是否结束. 主要代码: variables类: class variables     {         public static int[] a = new int[16] { 1, 2, 3, 4, 5, 6, 7, 8,

  • 基于Vue3实现数字华容道游戏的示例代码

    目录 前言 环境 思路 实现 GameCnt GameTool GamePass GameTip Menu 最后 前言 恰逢春之四月,天气忽热忽凉,遇游戏大赛,以笨拙之技,书一篇小文. 游戏规则:存在n*n的格子,需要将它们按数字顺序或图片顺序一一还原即可. 环境 主要环境: vue3 version:3.2.4 vite version:2.5.0 vue-router version:4.0.14 注:这个游戏的路由使用的是自动路由插件 主要插件: windicss version:3.5.

  • 基于PyQt5制作一个猜数字小游戏

    开始之前,直接来看一下实现后的效果.想自己实现或者需要源码的童鞋直接进场... 将PyQt5的相关模块直接导入即可. from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * 为了照顾一下新关注的童鞋,这里介绍一下PyQt5的安装,还是采用pip的安装方式. pip install PyQt5 将准备好的样式导入到代码块中. # 主题样式模块引用 from QCandyUi import

  • 39条Python语句实现数字华容道

    原以为用Python编写"数字华容道"游戏可能需要很多代码,完成后发现只用了39条语句,可见Python的强大. 编程的思路如下,使用9个tkinter库的Button按钮,按3行3列排列,每个按钮的标题是1到8和空白中的一个,初始标题所显示的数字和空白随机排列.当一个按钮被单击后,调用事件函数,该函数有两个参数,该按钮的所在位置的行列号.在函数中首先判断该按钮(行号为x,列号为y)是否和标题为空白的按钮(行号为x0,列号为y0)相邻,相邻条件是(x-x0)绝对值+(y-y0)绝对值=

  • Android数字华容道小游戏开发

    目的 上周新一期的最强大脑出来了,虽然上季被称为最强黑幕,不过呢.我决定还是看看= =.它里面第一关是叫做数字华容道.说白了,就是和拼图差不多.一开始我准备下一个玩玩的.结果没搜到.所以决定写了一个.最后效果差不多是这样: 思路以及实现 首先,我们应该考虑如何去实现这个效果.细想一下,其实和之前的2048有点像,但是又不是完全一直.于是,便又折腾了一波.这次布局和内容项参考之前2048的,下面放上代码: 自定义一个frame layout,我们先绘制里面的数字: private void ini

  • jQuery实现数字华容道小游戏(实例代码)

    <!DOCTYPE html> <html> <head><meta charset="utf-8"> <title>数字华容道</title> <script type="text/javascript" src="jquery.min.js"></script> <style type="text/css"> *{

  • C#基于正则表达式删除字符串中数字或非数字的方法

    本文实例讲述了C#基于正则表达式删除字符串中数字或非数字的方法.分享给大家供大家参考,具体如下: /// 去掉字符串中的数字 public static string RemoveNumber(string key) { return Regex.Replace(key, @"\d", ""); } //去掉字符串中的非数字 public static string RemoveNotNumber(string key) { return Regex.Replace

  • Python基于Tkinter模块实现的弹球小游戏

    本文实例讲述了Python基于Tkinter模块实现的弹球小游戏.分享给大家供大家参考,具体如下: #!usr/bin/python #-*- coding:utf-8 -*- from Tkinter import * import Tkinter import random import time #创建小球的类 class Ball: def __init__(self,canvas,paddle,color): #参数:画布,球拍和颜色 self.canvas = canvas self

  • python实现数字华容道

    制作Python数字华容道(可选择关卡),供大家参考,具体内容如下 由于比赛需要,我这边制作了一份数字华容道,内含有3,4,5阶的数字华容道,开头在壳窗口内选择,运用了随机数模块(random)和图形化用户界面(tkinter) 下面是程序完整代码 # coding:utf-8 # """ #============================================================ 作者:@Qss 2021年3月20日起草 2021年3月21日完

随机推荐