Visual Basic中的图形Tic Tac Toe

时间:2014-04-06 22:08:16

标签: vb.net graphics multidimensional-array

我正在为我的Visual Basic类开发一个程序,该程序应该创建一个由人和计算机播放的Tic-Tac-Toe游戏。

以下是说明:

  1. 创建两个视图(一个用作GUI视图,另一个用作使用控制台的文本视图)。
  2. 使用两个控制器(一个用户点击GUI,另一个用户使用键盘上的数字1-9。
  3. 使用一种型号。
  4. 使用模块将游戏状态保持在2D阵列中。应用于模型的所有逻辑都将在模块中(例如,只允许模块更改2D阵列)。
  5. 网格将以图形方式绘制(不使用标签,按钮等)
  6. 以下是我目前遇到的一些问题:

    1. 我知道如何创建GUI视图,但不知道如何使用控制台创建文本视图?
    2. 不太确定2D阵列在这种情况下应该如何工作(我已经声明如下,但不确定从那里开始)。

      Module Module1
          Dim game(2, 2) As String
      End Module
      
    3. 我已经绘制了网格的一部分,但在完成其余工作时遇到了麻烦。我还需要一条垂直线和一条水平线,需要正确划分。这是我到目前为止绘制的内容:

      Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
          Dim blackBrush As New Drawing.SolidBrush(Color.Black)
          Dim xBase As Integer = 50
          Dim yBase As Integer = 10
          Dim width As Integer = 200
      
          e.Graphics.DrawRectangle(Pens.Green, xBase, 10, 200, 200)
          Dim third As Integer = yBase + width / 3
          e.Graphics.DrawLine(Pens.Black, xBase, third, xBase + width, third)
          e.Graphics.DrawLine(Pens.Black, 100, 5, 100, 220)
      End Sub
      

1 个答案:

答案 0 :(得分:1)

我给你一半的解决方案,但在C#:D

将它转换为VB应该不是很难,它是完全相同的框架。

希望你能理解这些机制,而不是简单地转储我的代码,事实上它真的很简单。

(首先将PictureBox放到您的表单上)

网格:

这里我正在绘制正方形,但这应该很容易画线。

enter image description here

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        pictureBox1.Paint += pictureBox1_Paint;
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        int columns = 3;
        int rows = 3;
        Graphics graphics = e.Graphics;
        graphics.Clear(Color.White);
        RectangleF bounds = graphics.VisibleClipBounds;
        var cellWidth = (int)((bounds.Width - 1) / columns);
        var cellHeight = (int)((bounds.Height - 1) / rows);

        for (int x = 0; x < columns; x++)
        {
            for (int y = 0; y < rows; y++)
            {
                graphics.DrawRectangle(Pens.Black, new Rectangle(x * cellWidth, y * cellHeight, cellWidth, cellHeight));
            }
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        pictureBox1.Invalidate();
    }
}

这是一个非常简单的主板:

internal class TicTacToe
{
    public TicTacToe()
    {
        Grid = new Piece[3, 3];
    }

    public Piece[,] Grid { get; private set; }

    public void SetPiece(int x, int y, Piece value)
    {
        if (x < 0 || x > 2) throw new ArgumentOutOfRangeException("x");
        if (y < 0 || y > 2) throw new ArgumentOutOfRangeException("y");

        Piece piece = Grid[y, x];
        if (piece == Piece.None)
        {
            Grid[y, x] = value;
        }
    }

    public Piece GetPiece(int x, int y)
    {
        if (x < 0 || x > 2) throw new ArgumentOutOfRangeException("x");
        if (y < 0 || y > 2) throw new ArgumentOutOfRangeException("y");

        return Grid[y, x];
    }
}

internal enum Piece
{
    None = 0,
    Cross = 1,
    Circle = 2
}

您可以返回boolean或抛出异常,我只是默默地在我的示例中更新游戏。

剩下什么?

  • 如果有人赢了,实施起来可能会很棘手:D 真的
  • 以控制台模式绘制

我会给你一些控制台的伪代码:

Do
  Get user input
  Update the grid
  Check if someone wins
  Clear console
  Draw current game or game over screen
Loop until ESC (quit) is pressed

为了在控制台中绘制网格基本上是上面的代码,只是尺寸要小得多,而像素则是字符。

http://msdn.microsoft.com/en-us/library/System.Console(v=vs.110).aspx

正如我所说,转换它应该是微不足道的,因为MSDN文档确实在每个文档页面中都提供了VB和C#示例。

祝你好运!