实现了基本的玩法。
BoardController.cs
cs
using System;
namespace GomokuGame
{
public class BoardController
{
private static BoardController instance;
private readonly int[,] board;
private const int boardSize = 15;
private BoardController()
{
board = new int[boardSize, boardSize];
}
public static BoardController Instance
{
get
{
if (instance == null)
{
instance = new BoardController();
}
return instance;
}
}
public int[,] GetBoard() => board;
public bool PlacePiece(int x, int y, int player)
{
if (board[x, y] == 0)
{
board[x, y] = player;
return true;
}
return false;
}
public bool CheckWin(int player)
{
for (int i = 0; i < boardSize; i++)
{
for (int j = 0; j < boardSize; j++)
{
if (board[i, j] == player)
{
if (CheckDirection(i, j, 1, 0, player) || // Horizontal
CheckDirection(i, j, 0, 1, player) || // Vertical
CheckDirection(i, j, 1, 1, player) || // Diagonal \
CheckDirection(i, j, 1, -1, player)) // Diagonal /
{
return true;
}
}
}
}
return false;
}
private bool CheckDirection(int startX, int startY, int dx, int dy, int player)
{
int count = 0;
for (int i = 0; i < 5; i++)
{
int x = startX + i * dx;
int y = startY + i * dy;
if (x >= 0 && x < boardSize && y >= 0 && y < boardSize && board[x, y] == player)
{
count++;
}
else
{
break;
}
}
return count == 5;
}
}
}
BoardView.cs
cs
using System;
using System.Drawing;
using System.Windows.Forms;
namespace GomokuGame
{
public class BoardView : Panel
{
private const int cellSize = 30;
private const int boardSize = 15;
private int[,] board;
private int currentPlayer;
public BoardView()
{
this.DoubleBuffered = true;
this.Size = new Size(boardSize * cellSize, boardSize * cellSize);
board = BoardController.Instance.GetBoard();
currentPlayer = 1;
this.Paint += BoardView_Paint;
this.MouseClick += BoardView_MouseClick;
}
private void BoardView_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
for (int i = 0; i < boardSize; i++)
{
for (int j = 0; j < boardSize; j++)
{
g.DrawRectangle(Pens.Black, i * cellSize, j * cellSize, cellSize, cellSize);
if (board[i, j] == 1)
{
g.FillEllipse(Brushes.Black, i * cellSize, j * cellSize, cellSize, cellSize);
}
else if (board[i, j] == 2)
{
g.FillEllipse(Brushes.Black, i * cellSize, j * cellSize, cellSize, cellSize);
g.FillEllipse(Brushes.White, i * cellSize + 2, j * cellSize + 2, cellSize - 4, cellSize - 4);
}
}
}
}
private void BoardView_MouseClick(object sender, MouseEventArgs e)
{
int x = e.X / cellSize;
int y = e.Y / cellSize;
if (BoardController.Instance.PlacePiece(x, y, currentPlayer))
{
this.Invalidate();
if (BoardController.Instance.CheckWin(currentPlayer))
{
MessageBox.Show($"Player {currentPlayer} wins!");
}
// 交换玩家
currentPlayer = currentPlayer == 1 ? 2 : 1;
}
}
}
}
Form1.cs
cs
using System;
using System.Windows.Forms;
namespace GomokuGame
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitializeGame();
}
private void InitializeGame()
{
BoardView boardView = new BoardView();
boardView.Dock = DockStyle.Fill;
this.Controls.Add(boardView);
IGameStrategy strategy = new PvPStrategy();
strategy.Execute();
}
}
}
Form1.Designer.cs
cs
using System;
using System.Windows.Forms;
namespace GomokuGame
{
partial class Form1 : Form
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// Form1
//
this.ClientSize = new System.Drawing.Size(800, 450);
this.Name = "Form1";
this.ResumeLayout(false);
}
}
}
GameStrategy.cs
cs
using System;
public interface IGameStrategy
{
void Execute();
}
public class PvPStrategy : IGameStrategy
{
public void Execute()
{
Console.WriteLine("Player vs Player mode.");
}
}
public class PvAIStrategy : IGameStrategy
{
public void Execute()
{
Console.WriteLine("Player vs AI mode.");
}
}
PieceFactory.cs
cs
using System;
public abstract class Piece
{
public abstract void Place(int x, int y);
}
public class BlackPiece : Piece
{
public override void Place(int x, int y)
{
Console.WriteLine($"Placed black piece at ({x}, {y})");
}
}
public class WhitePiece : Piece
{
public override void Place(int x, int y)
{
Console.WriteLine($"Placed white piece at ({x}, {y})");
}
}
public class PieceFactory
{
public static Piece CreatePiece(int player)
{
return player == 1 ? new BlackPiece() : (Piece)new WhitePiece();
}
}
PlacePieceCommand.cs
cs
using GomokuGame;
public interface ICommand
{
void Execute();
}
public class PlacePieceCommand : ICommand
{
private readonly int x;
private readonly int y;
private readonly int player;
public PlacePieceCommand(int x, int y, int player)
{
this.x = x;
this.y = y;
this.player = player;
}
public void Execute()
{
BoardController.Instance.PlacePiece(x, y, player);
PieceFactory.CreatePiece(player).Place(x, y);
}
}
Program.cs
cs
using System;
using System.Windows.Forms;
namespace GomokuGame
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
完整代码下载:https://download.csdn.net/download/exlink2012/89317787