C#围棋游戏
龍木 人气:0之所以选择围棋作为大作业一方面是想挑战一下,另一方面是由于从6岁学围棋到11岁放下,再到今天已将近8年了,也算是回味一下童年吧,毕竟,曾梦想执子走天涯。
这是效果图:
这个程序除了一开始参考了中国象棋,其他的都是自己完成的。
不说了,上代码!!!
这个是主窗口代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Media; //该产品归属****大学18级信息工程学院计算机系王**所有,如需转载,请注明原作者及出处:https://blog.csdn.net/Luoriliming namespace AlphaGo { public partial class FormMain : Form { //加载围棋类 private PlayChess playchess = new PlayChess(); public FormMain() { InitializeComponent(); //根据屏幕分辨率调整大小 playchess._rowHeight = Screen.PrimaryScreen.Bounds.Size.Height / 25; playchess._colWidth = playchess._rowHeight; playchess._lefttop.Y = 2* playchess._rowHeight; playchess._lefttop.X = playchess._lefttop.Y; } //绘制 private void FormMain_Paint(object sender, PaintEventArgs e) { playchess.Drawboard(e.Graphics); playchess.DrawPiece(e.Graphics); } //开局 private void toolStripMenuItemBegin_Click(object sender, EventArgs e) { timer1.Enabled = true; timer2.Enabled = false; playchess. PlaySound("begin.wav"); playchess.Begin(Player.白); Invalidate(); } //计时器 private void timer1_Tick(object sender, EventArgs e) { if (playchess._time1 <= 0) { if (playchess._curPlayer == Player.黑) playchess._curPlayer = Player.白; else playchess._curPlayer = Player.黑; if (playchess._pickChess == Piece.黑子) playchess._pickChess = Piece.白子; else playchess._pickChess = Piece.黑子; if (playchess._timeColor == Color.Yellow) playchess._timeColor = Color.Red; else playchess._timeColor = Color.Yellow; playchess._time2 = 60; playchess._time1 = 60; timer1.Enabled = !timer1.Enabled; timer2.Enabled = !timer2.Enabled; } else { playchess._time1 = playchess._time1 - 1; Invalidate(); } } //鼠标移动 private void FormMain_MouseMove(object sender, MouseEventArgs e) { playchess._curMousePoint = e.Location; Invalidate(); } private void FormMain_MouseDown(object sender, MouseEventArgs e) { //若单击右键 if (e.Button == MouseButtons.Left) { int row, col; //输出此时鼠标位置,并判断是否在范围内 bool valid = playchess.ConvertPointToRowCol(new Point(e.X, e.Y), out row, out col); playchess._dropRow = row; playchess._dropCol = col; if (valid == true) { if (playchess._chess[playchess._dropRow, playchess._dropCol] == Piece.无子) { playchess.PlaySound("drop.wav"); if (timer2.Enabled == false) timer2.Enabled = true; else timer2.Enabled = false; if (timer1.Enabled == false) timer1.Enabled = true; else timer1.Enabled = false; playchess.DropPiece(playchess._dropRow, playchess._dropCol); } Invalidate(); } } } //计时器 public void timer2_Tick(object sender, EventArgs e) { if (playchess._time2 <= 0) { if (playchess._curPlayer == Player.黑) playchess._curPlayer = Player.白; else playchess._curPlayer = Player.黑; if (playchess._pickChess == Piece.黑子) playchess._pickChess = Piece.白子; else playchess._pickChess = Piece.黑子; playchess._time2 = 60; playchess._time1 = 60; timer1.Enabled = !timer1.Enabled; timer2.Enabled = !timer2.Enabled; } else { playchess._time2 = playchess._time2 - 1; Invalidate(); } } //判断胜负 private void ToolStripMenuItemEnd_Click(object sender, EventArgs e) { if (playchess.IsOver() == Player.黑) { MessageBox.Show("黑棋获胜!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); playchess . _black++; } else if (playchess.IsOver() == Player.白) { MessageBox.Show("白棋获胜!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); playchess._white++; } else if (playchess.IsOver() == Player.无) { MessageBox.Show("和棋!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification); } timer1.Enabled = false; timer2.Enabled = false; playchess._pickChess = Piece.无子; } private void ToolStripMenuItemSave_Click(object sender, EventArgs e) { //显示保存残局对话框 if (saveFileDialog1.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); playchess.WriteTo(bw); bw.Close(); fs.Close(); } } private void ToolStripMenuItemOpen_Click(object sender, EventArgs e) { //显示打开残局对话框 if (openFileDialog1.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); playchess.ReadFrom(br); br.Close(); fs.Close(); Invalidate(); } } } }
这个是围棋类代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Media; //该产品归属****大学18级信息工程学院计算机系王**所有,如需转载,请注明原作者及出处:https://blog.csdn.net/Luoriliming namespace AlphaGo { //枚举类型:棋子 public enum Piece { 无子 = 0, 黑子 = 1, 白子 = 2 } //枚举类型:双方棋手 public enum Player { 无 = 0, 黑 = 1, 白 = 2 } //类:走棋步骤 public class Step { public Player _player;//走棋方 public int _dropRow;//落下棋子行号 public int _dropCol;//落下棋子列号 public Piece _dropPiece;//落下位置棋子 } //类:围棋 class PlayChess { //类字段:棋子 public Piece[,] _chess = new Piece[25, 25]; //初始化执子为无子 public Piece _pickChess = Piece.无子; //落下棋子的位置 public int _dropRow = 0; public int _dropCol = 0; //闪烁 public Color _timeColor = Color.Yellow; //类字段:走棋方 public Player _curPlayer = Player.无; //鼠标移动位置 public Point _curMousePoint = new Point(0, 0); //类字段:设置走棋步骤表 public List<Step> _listStep = new List<Step>(); //保存棋盘左上角坐标 public Point _lefttop = new Point(100, 100); //棋子半径 public int _pieceR = 10; //保存行高和列宽 public int _rowHeight = 30; public int _colWidth = 30; //加载图像 //导入各种图片 Bitmap deskbmp = new Bitmap("desktop.jpg"); public Bitmap _redbmp = new Bitmap("黑方头像.jpg"); public Bitmap _bluebmp = new Bitmap("白方头像.jpg"); //设置是否遍历数组 public bool[,] _bianli = new bool[25, 25]; //设置气的数组 public int[,] _qi = new int[20, 20]; //设置白棋黑棋个数 public int _Whitechess; public int _Blackchess; //计时 public int _time1 = 60; public int _time2 = 60; //黑白子各胜局数 public int _black = 0; public int _white = 0; //劫 private bool[,] _jie = new bool[25, 25]; public int _lastrow = 0; public int _lastcol = 0; public int _chessnumber = 0; //类 最后一次走棋步骤 public Step _LastStep { get { int stepCount = _listStep.Count; if (stepCount > 0) return _listStep[stepCount - 1]; else return null; } } //类构造方法 public PlayChess() { //初始化围棋 Initialize(); } //类:初始化围棋 public void Initialize() { for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { _chess[j, i] = Piece.无子; } } _listStep.Clear(); } //类:围棋开局 public void Begin(Player FirstPlayer) { //初始化围棋 Initialize(); //初始化开局棋子布局 for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { _chess[j, i] = Piece.无子; } } //初始化时间 _time1 = 60; _time2 = 60; //初始化当前走棋方 _curPlayer = Player.白; _pickChess = Piece.白子; //初始化遍历条件 for (int i = 1; i <= 20; i++) { for (int j = 1; j <= 20; j++) { _bianli[i, j] = false; } } //初始化劫 for (int i = 1; i <= 20; i++) { for (int j = 1; j <= 20; j++) { _jie[i, j] = false; } } for (int i = 1; i <= 20; i++) { for (int j = 1; j <= 20; j++) { _jie[i, j] = false; } } //初始化落子属性 _dropCol = 0; _dropRow = 0; _chessnumber = 0; } //类:落下棋子 public bool DropPiece(int dropRow, int dropCol) { if (_curPlayer != Player.无 && MatchRules(_curPlayer, _dropRow, _dropCol) == true&&_jie[dropRow,dropCol]==false) { //保存走棋步骤到_listStep中 Step step = new Step(); step._player = _curPlayer; step._dropRow = dropRow; step._dropCol = dropCol; step._dropPiece = _chess[dropRow, dropCol]; _listStep.Add(step); _chess[dropRow, dropCol] = _pickChess; //播放落子声音 PlaySound("drop.wav"); //从左上角开始判断所有棋子,为了避免像虚竹一样自杀的存在 EatChess(1, 1); //重置遍历 for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { _bianli[i, j] = false; } } //判断劫 for (int i = 1; i <= 20; i++) { for (int j = 1; j <= 20; j++) { _jie[i, j] = false; } } _jie[_lastrow, _lastcol] = true; //交换走棋方 if (_pickChess == Piece.黑子) _pickChess = Piece.白子; else if (_pickChess == Piece.白子) _pickChess = Piece.黑子; else return false; if (_curPlayer == Player.黑) _curPlayer = Player.白; else _curPlayer = Player.黑; //重置时间 _time2 = 60; _time1 = 60; //步数加一 _chessnumber = _chessnumber + 1; //添加上一步的存入 _dropCol = dropCol; _dropRow = dropRow; _lastcol = _dropCol; _lastrow = _dropRow; return true; } else return false; } //类:判断胜负 public Player IsOver() { //初始化黑白棋子所围的子 _Blackchess = 0; _Whitechess = 0; for (int i = 1; i <= 20; i++) { for (int j = 1; j <= 20; j++) { for (int l = 1; l <= 20; l++) { for (int k = 1; k <= 20; k++) { _bianli[l, k] = false; } } //查找该子属于黑子还是白子 int x = SearchChess(i, j); if (x == 2) _Whitechess++; else if (x == 1) _Blackchess++; } } //如果黑子多于白子,则黑方获胜;如果白子多于黑子,则白方获胜;如果双方棋子数相同,则平局 if (_Blackchess > _Whitechess) { return Player.黑; } else if (_Whitechess > _Blackchess) { return Player.白; } else return Player.无; } //类:围棋规则 public bool MatchRules(Player player, int dropRow, int dropCol) { bool matchflag = false; { //只能下在无子的位置 if (_chess[dropRow, dropCol] == Piece.无子 ) { matchflag = true; } return matchflag; } } //保存残局 public void WriteTo(BinaryWriter binaryWriter) { binaryWriter.Write(_curPlayer.ToString()); for (int j = 1; j <= 10; j++) { for (int i = 1; i <= 10; i++) { binaryWriter.Write(_chess[i, j].ToString()); } } binaryWriter.Write(_listStep.Count); for (int i = 0; i <= _listStep.Count - 1; i++) { binaryWriter.Write(_listStep[i]._player.ToString()); binaryWriter.Write(_listStep[i]._dropRow); binaryWriter.Write(_listStep[i]._dropPiece.ToString()); binaryWriter.Write(_listStep[i]._dropCol); } } //读取残局 public void ReadFrom(BinaryReader binaryReader) { Initialize(); _curPlayer = (Player)Enum.Parse(typeof(Player), binaryReader.ReadString()); for (int j = 1; j <= 10; j++) { for (int i = 1; i <= 10; i++) { _chess[i, j] = (Piece)Enum.Parse(typeof(Piece), binaryReader.ReadString()); } } int stepCount = binaryReader.ReadInt32(); for (int i = 0; i <= _listStep.Count - 1; i++) { Step step = new Step(); step._player = (Player)binaryReader.ReadInt32(); step._dropRow = binaryReader.ReadInt32(); step._dropPiece = (Piece)binaryReader.ReadInt32(); step._dropCol = binaryReader.ReadInt32(); _listStep.Add(step); } _pickChess = Piece.无子; } public void Drawboard(Graphics g) { //绘制桌面 g.DrawImage(deskbmp, new Point(0, 0)); //创建粗笔和细笔 Pen thickPen = new Pen(Color.Black, 6); Pen thinPen = new Pen(Color.Black, 2); //绘制粗外边框 int gap = (int)(_rowHeight * 0.25); g.DrawRectangle(thickPen, new Rectangle(_lefttop.X - gap, _lefttop.Y - gap, _colWidth * 18 + 2 * gap, _rowHeight * 18 + 2 * gap)); //绘制横轴竖轴 for (int i = 1; i <= 19; i++) { g.DrawLine(thinPen, new Point(_lefttop.X, _lefttop.Y + (i - 1) * _rowHeight), new Point(_lefttop.X + 18 * _colWidth, _lefttop.Y + (i - 1) * _rowHeight)); } for (int i = 1; i <= 19; i++) { g.DrawLine(thinPen, new Point(_lefttop.X + _colWidth * (i - 1), _lefttop.Y), new Point(_lefttop.X + (i - 1) * _colWidth, _lefttop.Y + 18 * _rowHeight)); } SolidBrush Brush = new SolidBrush(Color.Black); SolidBrush white = new SolidBrush(Color.White); SolidBrush num = new SolidBrush(Color.Blue); //书写坐标 Font font2 = new Font("黑体", (float)(_rowHeight * 0.6), FontStyle.Regular, GraphicsUnit.Pixel); for (int i = 1; i <= 19; i++) { g.DrawString(i.ToString(), font2, Brush, new Point((int)(_lefttop.X - _colWidth * 1.1), (int)(_lefttop.Y - _rowHeight * 0.4 + _rowHeight * (i - 1)))); } string[] colNumber = new string[19] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S" }; Font font3 = new Font("华文行楷", (float)(_rowHeight * 1.5), FontStyle.Regular, GraphicsUnit.Pixel); for (int i = 1; i <= 19; i++) { g.DrawString(colNumber[i - 1], font2, Brush, new Point((int)(_lefttop.X - _colWidth * 0.3 + _colWidth * (i - 1)), (int)(_lefttop.Y - _rowHeight * 1.1))); } //绘制黑白双方 g.DrawString("黑方", font3, Brush, new Point((int)(_lefttop.X + _colWidth * 19), (int)(_lefttop.Y + _rowHeight * 2.2))); g.DrawString("白方", font3, white, new Point((int)(_lefttop.X + _colWidth * 19), (int)(_lefttop.Y + _rowHeight * 9.4))); SolidBrush fontBrush = new SolidBrush(Color.Black); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 3 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 3 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 15 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 3 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 9 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 3 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 3 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 9 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 15 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 9 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 9 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 9 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 3 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 15 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 15 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 15 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); g.FillEllipse(fontBrush, _lefttop.X + _colWidth * 9 - (int)(_pieceR * 0.7), _lefttop.Y + _rowHeight * 15 - (int)(_pieceR * 0.7), (int)(_pieceR * 1), (int)(_pieceR * 1)); Font font4 = new Font("仿宋", (float)(_rowHeight * 1.5), FontStyle.Regular, GraphicsUnit.Pixel); //步数 g.DrawString("步数:", font3, Brush, new Point((int)((int)(_lefttop.X + _colWidth * 21)), (int)(_lefttop.Y - _rowHeight))); g.DrawString(_chessnumber.ToString(), font4, num, new Point((int)(_lefttop.X + _colWidth * 25), (int)(_lefttop.Y - _rowHeight * 1.1))); //黑白各胜局数 g.DrawString("黑:白 :", font2, Brush, new Point((int)((int)(_lefttop.X + _colWidth * 5)), (int)(_lefttop.Y + _rowHeight * 20))); g.DrawString(_black.ToString(), font2, num, new Point((int)(_lefttop.X + _colWidth * 7), (int)(_lefttop.Y + _rowHeight * 20))); g.DrawString(_white.ToString(), font2, num, new Point((int)(_lefttop.X + _colWidth * 8), (int)(_lefttop.Y + _rowHeight * 20))); //g.DrawRectangle(thickPen, (int)(_lefttop.X + _colWidth * 25), (int)(_lefttop.Y - _rowHeight), 130, 60); g.DrawString("白方计时器:", font3, white, new Point((int)((int)(_lefttop.X + _colWidth * 19)), (int)(_lefttop.Y + _rowHeight * 16))); g.DrawString("黑方计时器:", font3, Brush, new Point((int)((int)(_lefttop.X + _colWidth * 19)), (int)(_lefttop.Y + _rowHeight * 6))); g.DrawString(_time2.ToString() + "s", font4, num, new Point((int)(_lefttop.X + _colWidth * 27), (int)(_lefttop.Y + _rowHeight * 6))); g.DrawString(_time1.ToString() + "s", font4, num, new Point((int)(_lefttop.X + _colWidth * 27), (int)(_lefttop.Y + _rowHeight * 16))); //加载黑白方图片 if (_curPlayer == Player.白) { g.DrawImage(_bluebmp, new Point(_lefttop.X + 8 * _colWidth + 625, _lefttop.Y + 9 * _rowHeight + 10)); } else if (_curPlayer == Player.黑) { g.DrawImage(_redbmp, new Point(_lefttop.X + 8 * _colWidth + 625, _lefttop.Y + 2 * _rowHeight - 10)); } DrawPickDropMark(g, _dropRow, _dropCol); } public void DrawPiece(Graphics g) { for (int j = 1; j <= 19; j++) { for (int i = 1; i <= 19; i++) { if (_chess[i, j] != Piece.无子) { //绘制棋子 DrawPieceByCode(g, i, j, _chess[i, j]); } } } //绘制跟随鼠标移动的棋子 DrawMousePiece(g, _curMousePoint.X, _curMousePoint.Y, _pickChess); } //鼠标位置 public bool ConvertPointToRowCol(Point p, out int row, out int col) { row = (p.Y - _lefttop.Y) / _rowHeight + 1; if ((p.Y - _lefttop.Y) % _rowHeight >= _rowHeight / 2) { row++; } col = (p.X - _lefttop.X) / _colWidth + 1; if ((p.X - _lefttop.X) % _colWidth >= _colWidth / 2) { col++; } Point chessP = new Point(); chessP.X = _lefttop.X + _colWidth * (col - 1); chessP.Y = _lefttop.Y + _rowHeight * (row - 1); double dist = Math.Sqrt(Math.Pow(p.X - chessP.X, 2) + Math.Pow(p.Y - chessP.Y, 2)); if (dist <= _pieceR && (row <= 19) && (row >= 1) && (col <= 19) && (col >= 1)) { return true; } else { row = 0; col = 0; return false; } } //绘制棋子 public void DrawMousePiece(Graphics g, int x, int y, Piece chess) { SolidBrush fontBrush; _pieceR = (int)(_rowHeight * 0.3); if (chess != Piece.无子) { if (chess == Piece.黑子) { fontBrush = new SolidBrush(Color.Black); } else { fontBrush = new SolidBrush(Color.White); } g.FillEllipse(fontBrush, x - (int)(_pieceR * 1.0), y - (int)(_pieceR * 1), _pieceR * 2, _pieceR * 2); } } //绘制手中棋子 public void DrawPieceByCode(Graphics g, int row, int col, Piece chess) { SolidBrush fontBrush; _pieceR = (int)(_rowHeight * 0.3); if (chess != Piece.无子) { if (chess == Piece.黑子) { fontBrush = new SolidBrush(Color.Black); } else { fontBrush = new SolidBrush(Color.White); } g.FillEllipse(fontBrush, _lefttop.X + _colWidth * (col - 1) - (int)(_pieceR), _lefttop.Y + _rowHeight * (row - 1) - (int)(_pieceR), _pieceR * 2, _pieceR * 2); } } public void DrawPickDropMark(Graphics g, int row, int col) { //在棋盘范围内绘制闪烁标记 if (row > 0) { Pen pen = new Pen(_timeColor, 4); Point p = new Point(_lefttop.X + _colWidth * (col - 1), _lefttop.Y + _rowHeight * (row - 1)); //绘制闪烁标记 g.DrawLine(pen, p.X - _pieceR, p.Y - _pieceR, p.X - _pieceR / 2, p.Y - _pieceR); g.DrawLine(pen, p.X - _pieceR, p.Y - _pieceR, p.X - _pieceR, p.Y - _pieceR / 2); g.DrawLine(pen, p.X + _pieceR, p.Y - _pieceR, p.X + _pieceR / 2, p.Y - _pieceR); g.DrawLine(pen, p.X + _pieceR, p.Y - _pieceR, p.X + _pieceR, p.Y - _pieceR / 2); g.DrawLine(pen, p.X - _pieceR, p.Y + _pieceR, p.X - _pieceR / 2, p.Y + _pieceR); g.DrawLine(pen, p.X - _pieceR, p.Y + _pieceR, p.X - _pieceR, p.Y + _pieceR / 2); g.DrawLine(pen, p.X + _pieceR, p.Y + _pieceR, p.X + _pieceR / 2, p.Y + _pieceR); g.DrawLine(pen, p.X + _pieceR, p.Y + _pieceR, p.X + _pieceR, p.Y + _pieceR / 2); } } //吃子判定(因为不用考虑时间和空间复杂度,用暴力跑的,主要这段时间被卡超时卡太烦了) public void EatChess(int row, int col) { for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { if (_chess[i, j] != Piece.无子) { _qi[i, j] = Judge(_chess[i, j], i, j); } } } for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { if (_chess[i, j] == _chess[i + 1, j] && i <= 18) { _qi[i + 1, j] = _qi[i, j] + _qi[i + 1, j]; } if (_chess[i, j] == _chess[i, j + 1] && j <= 18) { _qi[i, j + 1] = _qi[i, j] + _qi[i, j + 1]; } } } for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { if (_chess[i, j] == _chess[i + 1, j] && i <= 18) { if (_qi[i, j] < _qi[i + 1, j]) _qi[i, j] = _qi[i + 1, j]; else _qi[i + 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j + 1] && j <= 18) { if (_qi[i, j] < _qi[i, j + 1]) _qi[i, j] = _qi[i, j + 1]; else _qi[i, j + 1] = _qi[i, j]; } if (_chess[i, j] == _chess[i - 1, j] && i >= 2) { if (_qi[i, j] < _qi[i - 1, j]) _qi[i, j] = _qi[i - 1, j]; else _qi[i - 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j - 1] && j >= 2) { if (_qi[i, j] < _qi[i, j - 1]) _qi[i, j] = _qi[i, j - 1]; else _qi[i, j - 1] = _qi[i, j]; } } } for (int i = 19; i >= 1; i--) { for (int j = 19; j >= 1; j--) { if (_chess[i, j] == _chess[i + 1, j] && i <= 18) { if (_qi[i, j] < _qi[i + 1, j]) _qi[i, j] = _qi[i + 1, j]; else _qi[i + 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j + 1] && j <= 18) { if (_qi[i, j] < _qi[i, j + 1]) _qi[i, j] = _qi[i, j + 1]; else _qi[i, j + 1] = _qi[i, j]; } if (_chess[i, j] == _chess[i - 1, j] && i >= 2) { if (_qi[i, j] < _qi[i - 1, j]) _qi[i, j] = _qi[i - 1, j]; else _qi[i - 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j - 1] && j >= 2) { if (_qi[i, j] < _qi[i, j - 1]) _qi[i, j] = _qi[i, j - 1]; else _qi[i, j - 1] = _qi[i, j]; } } } for (int i = 1; i <= 19; i++) { for (int j = 19; j >= 1; j--) { if (_chess[i, j] == _chess[i + 1, j] && i <= 18) { if (_qi[i, j] < _qi[i + 1, j]) _qi[i, j] = _qi[i + 1, j]; else _qi[i + 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j + 1] && j <= 18) { if (_qi[i, j] < _qi[i, j + 1]) _qi[i, j] = _qi[i, j + 1]; else _qi[i, j + 1] = _qi[i, j]; } if (_chess[i, j] == _chess[i - 1, j] && i >= 2) { if (_qi[i, j] < _qi[i - 1, j]) _qi[i, j] = _qi[i - 1, j]; else _qi[i - 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j - 1] && j >= 2) { if (_qi[i, j] < _qi[i, j - 1]) _qi[i, j] = _qi[i, j - 1]; else _qi[i, j - 1] = _qi[i, j]; } } } for (int i = 19; i >= 1; i--) { for (int j = 1; j <= 19; j++) { if (_chess[i, j] == _chess[i + 1, j] && i <= 18) { if (_qi[i, j] < _qi[i + 1, j]) _qi[i, j] = _qi[i + 1, j]; else _qi[i + 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j + 1] && j <= 18) { if (_qi[i, j] < _qi[i, j + 1]) _qi[i, j] = _qi[i, j + 1]; else _qi[i, j + 1] = _qi[i, j]; } if (_chess[i, j] == _chess[i - 1, j] && i >= 2) { if (_qi[i, j] < _qi[i - 1, j]) _qi[i, j] = _qi[i - 1, j]; else _qi[i - 1, j] = _qi[i, j]; } if (_chess[i, j] == _chess[i, j - 1] && j >= 2) { if (_qi[i, j] < _qi[i, j - 1]) _qi[i, j] = _qi[i, j - 1]; else _qi[i, j - 1] = _qi[i, j]; } } } for (int i = 1; i <= 19; i++) { for (int j = 1; j <= 19; j++) { if (_qi[i, j] == 0 && _chess[i, j] != _pickChess) _chess[i, j] = Piece.无子; } } } //判断气 public int Judge(Piece nowchess, int row, int col) { int qi = 0; _bianli[row, col] = true; if (_chess[row, col + 1] == Piece.无子 && col <= 18) { qi++; } if (_chess[row, col - 1] == Piece.无子 && col >= 2) { qi++; } if (_chess[row + 1, col] == Piece.无子 && row <= 18) { qi++; } if (_chess[row - 1, col] == Piece.无子 && row >= 2) { qi++; } return qi; } //搜索 public int SearchChess(int i, int j) { _bianli[i, j] = true; if (_chess[i, j] == Piece.黑子) return 1; else if (_chess[i, j] == Piece.白子) return 2; else { if (i + 1 <= 19 && _bianli[i + 1, j] == false) return SearchChess(i + 1, j); if (j + 1 <= 19 && _bianli[i, j + 1] == false) return SearchChess(i, j + 1); if (i - 1 >= 1 && _bianli[i - 1, j] == false) return SearchChess(i - 1, j); if (j - 1 >= 1 && _bianli[i, j - 1] == false) return SearchChess(i, j - 1); if (j - 1 >= 1 && _bianli[i, j - 1] == false) return SearchChess(i, j - 1); if (i - 1 >= 1 && _bianli[i - 1, j] == false) return SearchChess(i - 1, j); if (j + 1 <= 19 && _bianli[i, j + 1] == false) return SearchChess(i, j + 1); if (i + 1 <= 19 && _bianli[i + 1, j] == false) return SearchChess(i + 1, j); return 0; } } public void PlaySound(string wavFile) { //装载声音 SoundPlayer soundplay = new SoundPlayer(wavFile); //播放声音 soundplay.Play(); } } }
加载全部内容