带网格/覆盖的C#面板

时间:2015-04-14 11:11:33

标签: c# math grid overlay

您好我想在c#中为小游戏实现一个控件,用户可以点击面板并在迷宫中绘制一条路径。之后我想传输每个"点"的坐标。在某个地方的路上越过了。

为了做到这一点,我尝试实现某种网格,其中每个网格具有相同的大小。然后我想创建某种叠加层,以便用户可以点击网格,然后变成绿色并显示用户选择的方式。

我在下面做了一个小例子,我希望,解释我的意思:

labyrinth

我的问题是我对面板和图形一般不熟练,希望这里有人可能有某种来源或教程来完成我想做的事。

提前致谢!

2 个答案:

答案 0 :(得分:2)

游戏设计包括(至少)三个方面:艺术,技术和战略设计。

我不会深入了解它的外观,它应具有的颜色和效果。

我将向您提供有关技术设计的一些提示,即使用什么平台,控制什么方法以及使用哪种数据结构。

第三个区域是最难的,在你的情况下,主要是因为其他区域相当简单..:战略设计是关于如何创造一个可玩的迷宫。创建一个随机的很简单,但很可能它不可玩。或者一个可玩但很容易的。因此,创造良好的董事会需要良好的判断力和想象力。

Zbig的回答给了你一个WPF程序的例子;我的提示是使用WinForms。

有很多可能的方法,包括

  • 画一切
  • 或使用支持单元格的控件
  • 为每个单元格使用单独的控件。

要绘制所有内容,您可以选择一个控件,可能是PictureBox或Panel,并在Paint事件中将当前状态绘制到它上面。为此,您需要一个数据结构来保存有关电路板及其每个单元的信息:

  • 行和列(x,y)
  • 一组墙(顶部,底部,左侧,右侧)
  • 颜色状态(空或访问)

可以容纳一组单元格的控件是DataGridview,您可以使用它,这是一个不错的选择,特别是如果你的电路板变得非常大......(大于2-3000个单元)

我将坚持第三个选项:创建一个控件数组,每个单元格一个。

以下是我接触技术方面的方法:

  1. 使用单元格的按钮(虽然其他控件也可以使用)并存储游戏数据,如下所示:

    • 状态在BackColor
    • 四面墙位于其ImageIndex
    • 的低四位
    • 行和列位于其名称或标记
  2. 创建一个ImageList,其中包含16个动态绘制的图像:透明,除了墙壁之外什么都没有,一个用于设置索引中的每个位。

  3. 动态创建按钮并将其Clicked事件映射到一个公共事件,其中sender参数用于处理点击。

  4. 游戏规则可能很简单:如果访问了四个邻居之一并且它们之间没有墙,则绘制单击的单元格。一旦访问出口单元,游戏就结束了。

  5. 嗯,我相信你会发现细节比精通编码器更难。建造上述系统最多需要1-2个小时。

    ..但是现在我们遇到了困难的部分:如何布局可玩的电路板?!

    游戏中的一个不错的功能是,它们可以选择游戏玩法的难度。

    以下是董事会创建例程的简单计划:

    • 从随机板开始
    • 为了让更多的墙壁洒在上面
    • 设置外墙
    • 创建开始和退出单元格,也可以设置访问的起始单元格
    • 从开始到退出创建一个随机路径
    • 在随机边框单元格之间创建更多路径,创建的板越多越简单,因为有更多可能的方法来横向移动它。

    请注意,我在每个(内部)墙上设置它的方式隐藏的困难之一确实属于两个单元格,这在播放期间没有问题但是每当你创建一个单元格时都必须考虑它或设置或删除墙。所以有一个可以处理它的setWall(int row,int column,bool wall)函数是个好主意..

    另一个隐藏的问题是如何创建一个随机路径,而不是在角落里自己画画。

    另外,请确保您了解使用4位表示四个墙并使用这些位作为单元格墙图像的索引的技巧。

答案 1 :(得分:1)

很久以前我做过某事。像这样使用来自Primitives的Togglebutton:

  

System.Windows.Controls.Primitives.ToggleButton tb = new ToggleButton();

仅使用网格

创建WPF解决方案
  • Xaml文件:
  

<网格名称=“DynamicGrid”ShowGridLines =“True”>

  • Cs文件:

    public partial class MainWindow : Window
    {
    public MainWindow()
    {
        InitializeComponent();
        fillWithToggles();
    }
    
    public void fillWithToggles()
    {
        for (int i = 0; i < 10; i++)
        {
            ColumnDefinition gridCol = new ColumnDefinition();
            gridCol.Name = "Column" + i.ToString();
            DynamicGrid.ColumnDefinitions.Add(gridCol);
        }
    
        for (int i = 0; i < 10; i++)
        {
            RowDefinition gridRow = new RowDefinition();
            gridRow.Name = "Row" + i.ToString();
            DynamicGrid.RowDefinitions.Add(gridRow);
        }
    
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 10; y++)
            {
                System.Windows.Controls.Primitives.ToggleButton tb = new ToggleButton();
                tb.VerticalAlignment = VerticalAlignment.Stretch;
                tb.HorizontalAlignment = HorizontalAlignment.Stretch;
                Grid.SetColumn(tb, x);
                Grid.SetRow(tb,y);
                DynamicGrid.Children.Add(tb);
            }                
        }
    }}
    

结果:

enter image description here

稍后您可以使用边框和整个逻辑等。