编程一个tic-tac-toe游戏

电脑游戏编程可能是程序员所能做的最具技术挑战性(也可能是薪水最高)的工作。顶级游戏需要程序员和计算机的最佳支持。...

电脑游戏编程可能是程序员所能做的最具技术挑战性(也可能是薪水最高)的工作。顶级游戏需要程序员和计算机的最佳支持。

Children playing tic tac toe on a playground

VisualBasic6现在已经完全被作为游戏编程的平台忽略了。(这从来都不是一个真正的游戏。即使在“好ol”时代,严肃的游戏程序员也不会使用像VB 6这样的高级语言,因为你无法获得大多数游戏所需要的最先进的性能。)但简单的“Tic Tac Toe”游戏是一个很好的编程入门,它比“Hello World”稍微高级一点

这是对编程的许多基本概念的一个很好的介绍,因为它结合了以下技术:

  • 数组的使用。X和O标记保存在单独的数组中,整个数组在函数之间传递,以跟踪游戏的进度。
  • 使用VB6级图形:VB6并没有提供很好的图形功能,但游戏很好地介绍了可用的图形。本系列余下的大部分内容是探索下一代微软图形技术GDI+如何取代VB6级图形技术。
  • 使用数学计算进行程序控制:程序使用巧妙的模(Mod)和整数除法计算,使用两个游戏标记数组来确定何时发生三元素“赢”。

本文中的编程类可能只是刚过初级阶段,但对于“中级”程序员来说应该是好的。但是,让我们从初级阶段开始,来说明一些概念,并让您开始您的Visual Basic游戏编程生涯。即使是比这更高级的学生也可能会发现,让物体的形状恰到好处有些挑战。

如何玩井字游戏

如果你从未玩过井字游戏,以下是规则。两名玩家轮流将Xs和Os放置在3 x 3的运动场中。

在比赛开始之前,两名球员必须就谁将先走以及谁将用哪个符号标记他的动作达成一致。在第一次移动之后,玩家交替地将他们的标记放在任何空单元格中。游戏的目标是成为第一个在水平、对角线或垂直线上有三个标记的玩家。如果没有空单元格,且两名玩家都没有获胜组合,则游戏为平局。

启动程序

在开始任何实际编码之前,最好更改您使用的任何组件的名称。一旦开始编码,Visual Basic将自动使用该名称,因此您希望它是正确的名称。我们将使用表单名frmTicTacToe,并将标题更改为“关于Tic Tac Toe”

建立表单后,使用line工具箱控件绘制一个3 x 3的网格。单击“直线”工具,然后在需要的位置绘制直线。您必须以这种方式创建四条线,并调整它们的长度和位置,使它们看起来正确。VisualBasic在“格式”菜单下还有一些方便的工具,这些工具将有所帮助。这是一个与他们一起练习的好机会。

除了播放网格外,我们还需要一些对象,用于放置在网格上的X和O符号。由于网格中有九个空间,我们将创建一个包含九个空间的对象数组,在Visual Basic中称为元素。

在VisualBasic开发环境中,有几种方法可以完成几乎所有的事情,创建控件数组也不例外。可能最简单的方法是创建第一个标签(像直线工具一样单击并绘制),命名它,设置所有属性(例如字体和前景色),然后复制它。VB6将询问是否要创建控件数组。将名称lblPlayGround用作第一个标签。

要创建网格的其他八个元素,请选择第一个标签对象,将“索引”属性设置为零,然后按CTRL+C(复制)。现在可以按CTRL+V(粘贴)创建另一个标签对象。像这样复制对象时,每个副本都将继承除第一个副本的索引之外的所有属性。每个副本的索引将增加一个。这是一个控制数组,因为它们都有相同的名称,但索引值不同。

如果以这种方式创建阵列,则所有副本将在窗体的左上角相互堆叠。将每个标签拖动到其中一个播放栅格位置。确保索引值在网格中是连续的。程序的逻辑取决于它。索引值为0的标签对象应位于左上角,右下角的标签应具有索引8。如果标签覆盖播放网格,请选择每个标签,单击鼠标右键,然后选择“发送回”。

由于有八种可能的方式赢得比赛,我们需要八条不同的线来显示比赛网格上的胜利。您将使用相同的技术创建另一个控件数组。首先,画一条线,将其命名为linWin,并将Index属性设置为零。然后使用复制粘贴技术再生成七行。下图显示了如何正确设置索引号。

除了标签和线条对象外,您还需要一些命令按钮来玩游戏,并需要更多标签来保持分数。这里不详细介绍创建这些对象的步骤,但这些是您需要的对象。

两个按钮对象:

  • 新游戏
  • cmdResetScore

帧对象首先包含两个选项按钮:

  • 光电倍增管
  • 光电播放器

包含六个标签的框架对象记分板。程序代码中仅更改了lblXScore和lblOScore。

  • lblX
  • lblXScore
  • lblO
  • lblOScore
  • lblMinus
  • lblColon

最后,您还需要标签对象lblStartMsg在不应单击cmdNewGame按钮时“屏蔽”该按钮。这在下图中不可见,因为它在表单中与命令按钮占用相同的空间。您可能需要临时移动命令按钮才能在表单上绘制此标签。

到目前为止,还没有完成VB编码,但我们终于准备好了。

初始化

现在您终于可以开始编写程序了。如果还没有,您可能需要下载源代码,以便在解释程序的操作时继续使用。

首先要做的设计决策之一是如何跟踪游戏的当前“状态”。换句话说,游戏网格上当前的Xs和Os是什么,下一步是谁。“状态”的概念在许多编程中都是至关重要的,尤其是在为web编写ASP和ASP.NET时

有几种方法可以做到这一点,因此这是分析中的一个关键步骤。如果你自己解决这个问题,你可能想画一个流程图,在开始任何编码之前用“草稿纸”尝试不同的选项。

变量

我们的解决方案使用两个“二维数组”,因为这有助于通过简单地更改程序循环中的数组索引来跟踪“状态”。左上角的状态将在索引为(1,1)的数组元素中,右上角的状态将在(1,3)中,右下角的状态将在(3,3)中,依此类推。执行此操作的两个阵列是:

iXPos(x, y)

iOPos(x, y)

有很多不同的方法可以实现这一点,本系列的最终VB.NET解决方案向您展示了如何仅使用单个一维数组来实现这一点。

将这些阵列转换为玩家赢球决策和表单中可见显示的编程将在下一页进行。

您还需要一些全局变量,如下所示。请注意,这些都在表单的常规声明和代码中。这使它们成为“模块级”变量,可以在该表单的代码中的任何位置引用。有关这方面的更多信息,请查看Visual Basic帮助中的了解变量的范围。

在我们的程序中有两个变量被初始化的区域。首先,在加载表单frmTicTacToe时初始化一些变量。

Private Sub Form_Load()

其次,在每个新游戏之前,需要重置为起始值的所有变量都会在初始化子例程中赋值。

Sub InitPlayGround()

请注意,表单加载初始化还调用游乐场初始化。

程序员的一项关键技能是能够使用调试工具来理解代码在做什么。您可以使用此程序尝试:

  • 用F8键单步执行代码
  • 在关键变量上设置监视,例如sPlaySign或iMoveSet设置断点并查询变量值。例如,在初始化的内部循环中:
lblPlayGround((i - 1) * 3 + j - 1).Caption = ""

请注意,这个程序清楚地说明了为什么尽可能将数据保存在数组中是一种良好的编程实践。如果此程序中没有数组,则必须编写如下代码:

Line0.Visible = False Line1.Visible = False Line2.Visible = False Line3.Visible = False Line4.Visible = False Line5.Visible = False Line6.Visible = False Line7.Visible = False

与此相反:

For i = 0 To 7 linWin(i).Visible = False Next i

行动

如果系统的任何部分都可以被认为是“心脏”,那么它就是子程序lblPlayGround\u Click。每当玩家单击播放网格时,就会调用此子例程。(单击必须在九个lblPlayGround元素中的一个元素内。)请注意,此子例程有一个参数:(索引为整数)。大多数其他“事件子例程”,如cmdNewGame_Click(),都没有。索引指示已单击的标签对象。例如,索引将包含网格左上角的值0和右下角的值8。

玩家单击游戏网格中的一个方块后,启动另一个游戏的命令按钮cmdNewGame将被激活“通过使其可见而启用”。此命令按钮的状态具有双重作用,因为它在程序中稍后也用作布尔决策变量。通常不鼓励使用属性值作为决策变量,因为如果有必要更改程序(例如,使cmdNewGame命令按钮始终可见),那么程序将意外失败,因为您可能不记得它也被用作程序逻辑的一部分。因此,搜索程序代码并检查在执行程序维护时所更改的任何内容的使用情况,甚至属性值,始终是一个好主意。这个程序违反了规则,一部分是为了说明这一点,另一部分是因为这是一段相对简单的代码,更容易看到正在做什么,避免以后出现问题。

玩家对游戏方块的选择是通过调用以索引为参数的游戏性子例程来处理的。

处理移动

首先,检查是否单击了未占用的正方形。

If lblPlayGround(xo_Move).Caption = "" Then

一旦我们确定这是合法的移动,移动计数器(iMove)就会增加。接下来的两行非常有趣,因为它们将坐标从一维If lblPlayGround组件数组转换为二维索引,您可以在iXPos或iOPos中使用这些索引。Mod和integer division(“反斜杠”)是您不经常使用的数学运算,但这里有一个很好的示例,说明它们如何非常有用。

 If lblPlayGround(xo_Move).Caption = "" Then iMove = iMove + 1 x = Int(xo_Move / 3) + 1 y = (xo_Move Mod 3) + 1

xo_移动值0将被转换为(1,1),1到(1,2)。。。3至(2,1)。。。8至(3,3)。

sPlaySign中的值是一个具有模块作用域的变量,用于跟踪哪个玩家进行了移动。更新移动阵列后,播放网格中的标签组件可以使用适当的符号进行更新。

If sPlaySign = "O" Then iOPos(x, y) = 1 iWin = CheckWin(iOPos()) Else iXPos(x, y) = 1 iWin = CheckWin(iXPos()) End If lblPlayGround(xo_Move).Caption = sPlaySign

例如,当X播放器单击网格左上角时,变量将具有以下值:

用户屏幕在左上框中仅显示X,而iXPos在左上框中显示1,在所有其他框中显示0。iOPos在每个框中都有0。

当O播放器单击网格的中心正方形时,值会发生变化。现在,th iOPos在中间框中显示1,而用户屏幕在左上角显示X,在中间框中显示O。iXPos仅在左上角显示1,在所有其他框中显示0。

现在,您知道了玩家单击的位置,以及是哪个玩家单击的(使用sPlaySign中的值),您所要做的就是找出是否有人赢得了游戏,并找出如何在显示中显示。

寻找赢家

每次移动后,CheckWin功能都会检查获胜组合。CheckWin的工作原理是将每一行、每一列和每一条对角线相加。使用VisualBasic的调试功能跟踪CheckWin中的步骤非常有教育意义。查找win首先要检查变量iScore中的每个单独检查中是否找到三个1,然后在Checkwin中返回一个唯一的“签名”值,该值用作数组索引,以更改linWin组件数组中一个元素的可见属性。如果没有赢家,CheckWin将包含值-1。如果有赢家,则更新显示,更改记分板,显示祝贺消息,然后重新启动游戏。

让我们详细检查其中一项检查,看看它是如何工作的。其他的都是相似的。

'Check Rows for 3 For i = 1 To 3 iScore = 0 CheckWin = CheckWin + 1 For j = 1 To 3 iScore = iScore + iPos(i, j) Next j If iScore = 3 Then Exit Function End If Next i

首先要注意的是,第一个索引计数器i对行进行计数,而第二个j对列进行计数。然后,外部循环只是从一行移动到下一行。内部循环对当前行中的1进行计数。如果有三个,那么你就有一个赢家。

请注意,您还可以跟踪在变量CheckWin中测试的方块总数,这是此函数终止时传递回的值。每个获胜的组合将在CheckWin中得到一个从0到7的唯一值,用于选择linWin()组件数组中的一个元素。这使得函数CheckWin中的代码顺序也很重要!如果你移动了其中一个循环代码块(如上面的一个),当有人赢了时,将在播放网格上绘制错误的线。试试看!

整理细节

唯一尚未讨论的代码是新游戏的子程序和重置分数的子程序。系统中的其余逻辑使得创建这些代码非常容易。要开始一个新游戏,您只需调用initplayerd子例程。因为玩家可以在游戏的中间点击按钮,所以你可以在前进之前请求确认。在重新启动记分板之前,您还需要确认。

  • 发表于 2021-09-28 16:28
  • 阅读 ( 191 )
  • 分类:数学

你可能感兴趣的文章

10个涉及编程或脚本的有益爱好

这是我多年来一直在挣扎的一个困境:我热爱编程,但我从不想从中获得一份职业。那我该怎么办?我怎样才能在这个活动中获得快乐而不把它作为我生活的中心呢?也许你也有过这样的想法。 ...

  • 发布于 2021-03-14 18:18
  • 阅读 ( 270 )

你应该玩的10个精彩的罗库游戏

... Tic-Tac-Toe、noughts和crosss、Xs和Os——无论你称之为著名的纸质比赛,这个Roku港口在把它带到你附近的电视屏幕上做得很好。这个应用程序可以让你和你的朋友和人工智能一...

  • 发布于 2021-03-16 11:31
  • 阅读 ( 231 )

9个最好的代码游戏,以建立你的编程技能

一旦你知道你在做什么,编程是很有趣的,但达到这一点可能是一个艰苦的旅程。 ...

  • 发布于 2021-03-17 21:19
  • 阅读 ( 447 )

最适合孩子们学习编程的11款编码游戏

你几乎可以在任何年龄开始编程,除了婴儿。不过,如果你想让孩子们进入编码领域,他们越早开始,就越有可能上瘾。诀窍其实是首先让他们感兴趣。 ...

  • 发布于 2021-03-20 06:06
  • 阅读 ( 450 )

为什么python不是适合您的编程语言

Python是近年来最流行的编程语言之一。它清晰的语法和可读性使它成为初学者的完美编码语言。考虑到Python的广泛使用,认为学习Python是必要的是可以原谅的。 ...

  • 发布于 2021-03-23 11:47
  • 阅读 ( 355 )

36款隐藏的谷歌搜索游戏和复活节彩蛋

...则会出现“唯一获胜的一步是不要玩”的消息。 搜索:tic-tac-toe 谷歌另一个隐藏的游戏是tic-tac-toe。当你在Google搜索中搜索“tic-tac-toe”时,一个3×3的面板会出现在搜索结果的顶部。你可以通过点击左上角的下拉菜单来调整游...

  • 发布于 2021-04-01 13:37
  • 阅读 ( 286 )

kodu教你的孩子用视觉方式编写他们自己的视频游戏

Kodu是一种可视化编程语言,适合教孩子们编程的基础知识和培养他们的创造力。在今天的课程中,我们将构建一个简单的游戏,作为Kodu的入门。 科杜的积木 Kodu的世界由可编程对象组成,在这些对象中,我们可以将行为脚本...

  • 发布于 2021-04-13 05:40
  • 阅读 ( 219 )

kickstarter项目“代码英雄”教你在3d虚拟世界中进行游戏编程

...之前,将自己的游戏发布到Kickstarter。这是一种创造性的编程教学方式,随着Kickstarter不断展示其接触大量观众的能力,我们很高兴看到游戏用户提出了什么样的项目。根据Kickstarter的标准,有多种捐赠级别可供选择,目前Windows...

  • 发布于 2021-04-21 09:01
  • 阅读 ( 132 )

坐立不安是谷歌最新推出的复活节彩蛋分心工具

...果它更具交互性,你可能会浪费更多的时间。抽搐输入“tic-tac-toe”作为谷歌对双人棋盘游戏的看法。如果你坐在一个同样没有效率的同事旁边,你可以在同一台机器上以双人模式与他们竞争。吃豆人2010年出现在googledoodle上,搜...

  • 发布于 2021-05-15 22:47
  • 阅读 ( 202 )

玩这个游戏的财务tic-tac-toe来衡量你的预算的健康

在你的财务生活中,有很多框你需要勾选。尽管实现所有目标很重要,但这并不总是对每个预算都现实。然而,这个整洁的井字游戏是一个聪明的方式来激励你做一些事情。该董事会,你可以在下面的源链接找到,有九个单独的...

  • 发布于 2021-05-17 01:56
  • 阅读 ( 81 )
bq4503
bq4503

0 篇文章