C#实现智能AI五子棋游戏详解
作者:Csharp小记 发布时间:2021-12-10 06:17:38
标签:C#,AI,五子棋,游戏
文章描述
这个程序也记不清是什么时候写的了,犹记得那时我还很年轻,偶然从网上看到了这样一个类似的标题(AI五子棋的实现),进去后看到那个是javascript写的,自己转成了C#,这次又拿出来稍微整理了下,很多人会认为这个标题带点噱头,嗯,我曾经也这么认为。当时写完之后,还在想,这是什么智能AI,不就是换了个算法么。再后来仔细想想,这或许就是现在所说的、智能AI的一个最底层或者说最简单的实现思路,对,是思路。
这篇文章一共分文两篇,这篇不会写关于算法什么的,主要把UI(棋盘绘制)以及页面的相关事件写一下。
开发环境
.NET Framework版本:4.5
开发工具
Visual Studio 2013
实现代码
//棋盘大小
static Size boardSize = new Size(800, 800);
//单元格大小
static Size cellSize = new Size(40, 40);
//棋子大小
static Size chessSize = new Size(25, 25);
int xCellCount = boardSize.Height / cellSize.Height;
int yCellCount = boardSize.Width / cellSize.Width;
Graphics graphics;
GraphicsState graphicsState;
Pen pen = new Pen(Color.Black);
//记录下过的棋子
List<ChessModel> chessList = new List<ChessModel>();
private void Form_Chess_Load(object sender, EventArgs e)
{
Width = boardSize.Width + 100;
Height = boardSize.Height;
panel_board.Width = boardSize.Width;
panel_board.Height = boardSize.Height;
Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - Width) / 2, (Screen.PrimaryScreen.WorkingArea.Height - Height) / 2);
graphics = panel_board.CreateGraphics();
InitData();
}
private void Form_Chess_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
{
graphicsState = graphics.Save();
}
}
/// <summary>
/// 绘制棋盘
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void panel_board_Paint(object sender, PaintEventArgs e)
{
//绘制横线
for (int i = 1; i < xCellCount; i++)
{
Point pt1 = new Point(cellSize.Width, cellSize.Width * i);
Point pt2 = new Point(boardSize.Width - cellSize.Width, cellSize.Width * i);
graphics.DrawLine(pen, pt1, pt2);
}
//绘制竖线
for (int i = 1; i < yCellCount; i++)
{
Point pt1 = new Point(cellSize.Height * i, cellSize.Height);
Point pt2 = new Point(cellSize.Height * i, boardSize.Height - cellSize.Height);
graphics.DrawLine(pen, pt1, pt2);
}
if (graphicsState != null)
{
chessList.ForEach(s =>
{
graphics.DrawImage(s.type ? Properties.Resources.黑棋子 : Properties.Resources.白棋子, s.point.X, s.point.Y, chessSize.Width, chessSize.Height);
});
}
}
private void SetStatus(int x, int y, bool type)
{
if (type)
{
lb_white_status.Text = string.Format("白棋下在了第{0}行第{1}列", y, x);
}
else
{
lb_black_status.Text = string.Format("黑棋下在了第{0}行第{1}列", y, x);
}
}
private void Reset()
{
graphics = panel_board.CreateGraphics();
chessList.Clear();
InitData();
graphicsState = null;
panel_board.Refresh();
panel_board_Paint(null, null);
}
private void btn_min_Click(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
}
private void btn_close_Click(object sender, EventArgs e)
{
Close();
}
private void btn_reset_Click(object sender, EventArgs e)
{
Reset();
}
实现效果
代码解析:棋盘是在Paint事件中动态绘制的,可参考变量boardSize
以及cellSize
,棋子是添加到资源文件中的两个图片。然后就是最小化后对数据进行还原
来源:https://mp.weixin.qq.com/s/yz8vakrjuwNnKmVP1v75dw


猜你喜欢
- @CacheEvict无法解决分页缓存清除当下比较热门的spring缓存就是encache,但是最近在写毕业设计的时候,发现了在缓存分页的时
- 今天学习到了SpringBoot 的属性赋值@Value用法先总结@Value(" 张三 "):直接附在属性名上,在Be
- 前言这是用testng框架加selenium做的一个UI自动化测试的项目Java代码package com.justin;/**?* @au
- Spring @Cacheable指定失效时间新版本配置@Configuration@EnableCachingpublic class R
- //********************************************************** //******主
- 本人新手,有什么问题 还请指出来,大家一起学习进步,话不多说。首先,搭建dubbo项目,要有三个工程。它们分别是:maven java工程
- Java的Arrays类中有一个sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用。但是sort()的参
- 本文实例为大家分享了Java实现医院管理系统的具体代码,供大家参考,具体内容如下1.开发工具NetBeans8.2Mysql5.7mysql
- Android 工程构建的持续集成,需要搭建一套编译和打包自动化流程,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Andro
- #简易版1、客户发送请求经过 DisPatcherServlet 核心过滤器2、DisPatcherServlet 核心控制器在去找一个或多
- 前言RecyclerView是我们常用的列表控件,一般来说当Item的数据改变的时候我们需要刷新当前的Item 。如何刷新 RV 的列表?基
- 在新建Java项目时,run运行main方法时,报错 “java: 错误: 无效的源发行版:16”,
- SQLite 介绍SQLite,是一款轻型的数据库,用于本地的数据储存。先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了
- 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误
- 最近学习了 C#实现文件上传与下载,现在分享给大家。1、C#文件上传创建MyUpload.htm页面,用于测试<form name=&
- 前言众所周知,黄油刀 ButterKnife 已经废弃了,并且已经不再维护了,而一些老项目估计还有一堆这样的代码,相信大家多多少少都有过被
- 前言本文简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。一、抽象类是什么?在 Java 语言中使用 abstract class
- 前言大家应该都用过synchronized 关键字加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允许指定数量的线程执行,有什
- package com.action.android_test;import android.location.Location;impor
- 1. HttpServletRequest包装类因为HttpServletRequest只能读取一次,所以需要对request进行包装,变成