当前位置: 首页 > 编程语言 > C#

为扫雷游戏动态创建游戏板

时间:2023-04-10 18:10:52 C#

为扫雷游戏动态创建游戏板为了学习C#、XAML,尤其是MVVM,我开始编写扫雷游戏。我创建的第一个版本没有MVVM部分,我使用C#代码创建并添加了按钮,而不是使用MVVM方式在XAML中执行。现在我尝试将MVVM模式应用到我的游戏中。我制作了一个自己的用户控件,其中包含一个代表雷区的按钮。这个控件还有一个ViewModel和一个Model类来存储一些状态数据和处理一些命令。在一个测试项目中,我创建了4个自己的用户控件,并尝试将它们放在一个网格中,其中的按钮形成一个2x2按钮的正方形。在后面的代码中,按钮被放置在一个ObservableCollection对象中。我假设此对象中列出的按钮和索引如下:Button1Button2Button3Button4但在演示网格中我希望按钮显示为Button1|Button2------+---------按钮3|Button4问题是:我如何动态地执行此操作?在我的测试项目中我使用4个按钮进行测试,但在我要使用的项目中,按钮的数量可能会根据玩家选择的游戏难度而有所不同。第二个问题是我如何弄清楚按钮的邻居是什么。因此,如果网格是4x5,包含20个按钮。例如,我选择按钮8,它的相邻按钮编号为2、3、4、7、9、12、13和14。列出这些按钮后,如何找到这些相邻按钮?我希望我的问题足够清楚。先感谢您!您可以使用将ItemsPanel设置为Grid或UniformGrid的ItemsControl来显示您的集合。我在这里有一些ItemsControl示例可以帮助您,因为我没有发现MDSN的示例非常有用。如果您可以将Rows和Columns属性绑定到ViewModel的属性,UniformGrid将是最简单的,但这将要求所有单元格的大小相同,而且我不记得Rows和Columns属性是否是参与DependencyProperties绑定的属性系统与否。如果这对您不起作用,您可以将Grid用作Grid.Column,并在ItemContainerStyle中设置Grid.Row和Grid.Column绑定。这将要求您在ObservableCollection中的每个单元格对象上都具有属性,以说明单元格所在的行/列,但我怀疑您无论如何都需要这些属性来确定单击命令和类似内容中的相邻单元格。此外,没有内置的方法来绑定Grid的行/列计数,因此我倾向于使用一些自定义附加属性,这些属性将根据绑定值动态构建Grid的RowDefinitions和ColumnDefinitions。因此,如果您使用网格,您的最终结果可能如下所示:公共诠释高度;公共int宽度;公共ObservableCollection细胞;}publicclassCellModel{//同样的事情,完整的属性w/属性更改通知publicintColumnIndex;公共int行索引;公共布尔是可见的;公共布尔是我的;公共整数;最近我为一种软件开发竞赛解决了扫雷游戏逻辑。我认为他的游戏的主要问题是在物品周围找到相邻的地雷和相邻的空单元格。在这两种情况下,我们都必须考虑到最多每个单元格(项目)可以被八个项目(单元格)包围。如果我们考虑由X,Y坐标定义的单元格C的4×4网格(矩阵),它将被以下单元格包围:C1(X-1,Y-1)C2(X,Y-1)C3(X+1,Y-1)C4(X-1,Y)C5(X+1,Y)C6(X-1,Y+1)C7(X,Y+1)C8(X+1,Y+1)换句话说,我们可以通过平移x和y轴上的点来找到项目的相邻单元格。我通过游戏逻辑(后端)拆分游戏(前端)的渲染来开发集合。事实上,通过使用此策略,您可以在不同的.Net环境中使用它:我们不会“锁定”UI元素或组件。你可以在这里下载我的项目:https://github.com/alchimya/csharp-minesweeper-sdk在我脑海中:ListmyButtons=newList();ButtonmyFirstButton=newButton(/*制作第一个按钮*/);myButtons.Add(myFirstButton);voidaddButtonX(){//沿x轴添加新按钮ButtontempButt=newButton();按钮lastButt=myButtons[myButtons.count-1];tempButt.posX=lastButt.posX+lastButt.sizeX;tempButt.posY=lastButt.posY;//按钮的其他代码myButtons.Add(tempButt);}voidaddButtonY(){//沿y轴添加新按钮ButtontempButt=newButton();按钮lastButt=myButtons[myButtons.count-1];tempButt.posX=lastButt.posX;tempButt.posY=lastButt.posY+lastButt.sizeY;//按钮的其他代码myButtons.Add(tempButt);}要跟踪周围的按钮,您需要知道网格的宽度是多少,例如,如果网格宽度为20个按钮,则按钮将如下所示:[B-20-1][B-20][B-20+1][B-1][B][B+1][B+20-1][B+20][B+20+1]其中B=按钮点击。当然,您必须检查没有值离开网格(例如,B-20-1不小于0,B+20+1不大于按钮数。),但这很容易完毕。以上就是C#学习教程的全部内容:动态创建扫雷游戏的棋盘。侵权请点击右侧联系管理员删除。如需转载请注明出处: