当前位置: 首页 > news >正文

C# Winform实现五子棋游戏(代完善)

实现了基本的玩法。

BoardController.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) || // HorizontalCheckDirection(i, j, 0, 1, player) || // VerticalCheckDirection(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

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

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

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

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

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

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

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

http://www.lryc.cn/news/353273.html

相关文章:

  • 文档档案管理系统整体建设方案书(实际项目原件word2024)
  • React与Vue的区别?
  • leetcode 2115.从给定原材料中找到所有可以做出的菜
  • Opencompass模型评测教程
  • 什么是安全测试,如何进行安全测试?
  • ros的pcl库中对于自己定义的消息,调用pcl库时总是报错 c++
  • DataFrame—数据汇总6
  • Java入门基础学习笔记41——实体类
  • 【Linux】信号之信号的保存和处理详解
  • 基于Django的图书管理系统
  • js实现元素根据鼠标滚轮滚动向左右上下滑动着从模糊到清楚显示出来
  • yocto学习
  • 【IC设计】牛客网-序列检测习题总结
  • python爬虫登录到海康相机管理页面
  • 9.Docker网络
  • Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库
  • java库和包的概念
  • mysql内存结构
  • Python | Leetcode Python题解之第111题二叉树的最小深度
  • c++二进制输出
  • 5. C++网络编程-UDP协议的实现
  • Altium Designer 中键拖动,滚轮缩放,并修改缩放速度
  • python从入门到精通04
  • tomcat三级指导
  • 不知道是该怎么引用多个函数片段?具体示例如代码
  • P3128 [USACO15DEC] Max Flow P题解(树上差分,最近公共祖先,图论)
  • 在Linux上面部署ELK
  • Langchain-Chatchat的markdownHeaderTextSplitter使用
  • 掩码生成蒸馏——知识蒸馏
  • 【C#实战】Newtonsoft.Json基类子类解析