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
相关文章:
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…...

文档档案管理系统整体建设方案书(实际项目原件word2024)
1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 数据备份技术 3.系统功能设计 3.1.功能清单列表 3.2.基础数据管理 3.3.位置管理 3.4.文档使用 3.5.文档管理 软件全套资料包获取方式①:软件项…...
React与Vue的区别?
一、区别: 1. 语法 Vue采用自己特有的模板语法; React是单向的,采用jsx语法创建react元素。 2.监听数据变化的实现原理不同 Vue2.0 通过Object.defineproperty()方法的getter/setter属性, 实现数据劫持, 每次修改完数据会触发diff算法(双端对比) …...
leetcode 2115.从给定原材料中找到所有可以做出的菜
思路:拓补排序,哈希表 在思路上其实很好发现,我们需要有一个明确的做菜顺序,也就是说需要定下来我们根据原材料先做哪些菜,然后做完该做的菜之后,后来又能做哪些菜。 你也发现了,这个顺序其实…...

Opencompass模型评测教程
模型评测 模型评测非常关键,目前主流的方法主要可以概括为主观评测和客观评测,主观评测又可以分为两种形式:人工判断或者和模型竞技场。客观评测一般采用评测数据集的形式进行模型评测。本教程使用Opencompass工具进行对Internlm2-7b模型进行…...
什么是安全测试,如何进行安全测试?
什么是安全测试? 概述 安全测试是一种旨在识别系统、网络或应用程序中的安全漏洞的测试方法。其目标是确保系统能够抵御恶意攻击,保护数据的机密性、完整性和可用性。安全测试通常包括漏洞扫描、渗透测试、代码审计和安全评估等多个方面。 安全测试的…...
ros的pcl库中对于自己定义的消息,调用pcl库时总是报错 c++
首先定义自己的消息类型 struct CustomPoint { // 定义点类型结构PCL_ADD_POINT4D; // 该点类型有4个元素float intensity 0.0;uint32_t zone;uint32_t ring;uint32_t sector;EIGEN_MAKE_ALIGNED_OPERATOR_NEW // 确保new操作符对齐操作 } EIGEN_ALIGN16; // 强制SSE对齐POIN…...
DataFrame—数据汇总6
文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…...

Java入门基础学习笔记41——实体类
实体JavaBean/实体类: 就是一种特殊形式的类。 1)这个类中的成员变量都要私有,并且要对外提供相应的getXXX,setXXX的方法。 2)类中必须要有一个公共的无参的构造器。其他的构造器可写可不写。 右键菜单中࿰…...

【Linux】信号之信号的保存和处理详解
🤖个人主页:晚风相伴-CSDN博客 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 🙏如果内容有误或者有写的不好的地方的话&…...

基于Django的图书管理系统
文章目录 前言一、页面展示1.登录2.前端页面3.后端页面 二、项目上传(1)导入数据库(2)导入项目(3)数据库密码修改(4)进入网站 总结 前言 本网站调用Django编写了图书管理网站&#…...
js实现元素根据鼠标滚轮滚动向左右上下滑动着从模糊到清楚显示出来
html代码 <div ref{test} id"animatedElement" className"not-animated"> <div style{{width:"100px",height:"50px",backgroundColor:"red"}}> </div> </div> JS代码 const te…...
yocto学习
bitbake命令单独编译u-boot: $ bitbake -c compile -f u-boot-imx $ bitbake -c deploy -f u-boot-imx //部署编译生成的u-boot镜像到deploy bitbake命令单独编译kernel: bitbake -c compile -f linux-imx //编译内核 bitbake -c deploy -f linux-imx /…...

【IC设计】牛客网-序列检测习题总结
文章目录 状态机基础知识VL25 输入序列连续的序列检测VL26 含有无关项的序列检测VL27 不重叠序列检测VL28 输入序列不连续的序列检测参考资料 状态机基础知识 VL25 输入序列连续的序列检测 timescale 1ns/1ns module sequence_detect(input clk,input rst_n,input a,output re…...

python爬虫登录到海康相机管理页面
简述 1.最近接到个任务是在管理页面更改相机的某个参数,下载官方的sdk貌似没有提供这个接口,所以只能自己写爬虫登录发请求了。 1.主要步骤 1.1 发送get请求获取到salt,sessionID,challenge等信息 http://admin:123456192.168.…...

9.Docker网络
文章目录 1、Docker网络简介2、常用基本命令3、网络模式对比举例3.1、bridge模式3.2、host模式3.3、none模式3.4、container模式3.5、自定义网络 1、Docker网络简介 作用: 容器间的互联和通信以及端口映射容器IP变动时候可以通过服务名直接进行网络通信而不受到影…...

Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库
今天接到一个学生C语言访问SQLite数据库的的需求: 第一步,SQLite Download Page下载 sqlite3.dll 库 下载解压,发现只有两个文件: 于是使用x64 Native Tools Command Prompt 终端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…...
java库和包的概念
在Java中,"库"和"包"是两个不同的概念,但它们之间存在着密切的关联。 库(Library) 定义:库是一组已经编写好的代码和资源,用于解决特定的问题或提供特定的功能。它可以包含一个或多个…...
mysql内存结构
一:逻辑存储结构:表空间->段->区->页->行、 表空间:一个mysql实例对应多个表空间,用于存储记录,索引等数据。 段:分为数据段,索引段,回滚段。innoDB是索引组织表&…...

Python | Leetcode Python题解之第111题二叉树的最小深度
题目: 题解: class Solution:def minDepth(self, root: TreeNode) -> int:if not root:return 0que collections.deque([(root, 1)])while que:node, depth que.popleft()if not node.left and not node.right:return depthif node.left:que.appen…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...

Axure零基础跟我学:展开与收回
亲爱的小伙伴,如有帮助请订阅专栏!跟着老师每课一练,系统学习Axure交互设计课程! Axure产品经理精品视频课https://edu.csdn.net/course/detail/40420 课程主题:Axure菜单展开与收回 课程视频:...