C#实现围棋游戏

本文实例为大家分享了C#实现围棋游戏的具体代码,供大家参考,具体内容如下

之所以选择围棋作为大作业一方面是想挑战一下,另一方面是由于从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();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#绘制中国象棋棋盘

    在C#绘制中国象棋棋盘是C#程序设计中GDI+的一个重要组成部分.这也是非常考验编程技巧的操作.在绘制之前首先要对棋盘有一个完整的认识.下面是完成后的输出图案. 1.在制作过程中用到了背景图片如下: 2.棋盘的横竖交叉线的坐标如下图(棋盘横向.竖向都以50象素间距绘制) 3.更细的坐标分布如下图 完整的代码如下图 using System; using System.Collections.Generic; using System.ComponentModel; using System.Da

  • C#实现飞行棋小游戏

    本文实例为大家分享了C#实现飞行棋小游戏的具体代码,供大家参考,具体内容如下 逻辑图 以下是掷色子的一个代码,比较有代表性,里面的逻辑和内容都已注释,可通过注释了解这一方法的运作模式. public static void RowTouZi(int playerPos) //掷色子 { //产生随机数,掷色子的随机数 Random r = new Random(); int num = r.Next(1, 7); //定义一个字符串变量 string msg = ""; //提示用户信

  • C#飞行棋小程序设计代码

    飞行棋游戏大家应该都玩过吧,如何使用C#语言进行编写,本文实例就为大家分享了飞行棋C#实现代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Pachee { class Program { #region 静态字段 // 关卡数量 public static int

  • C#飞行棋小程序设计分析

    C#小程序飞行棋,程序效果图 1.设计分析 这个程序界面大致分为四部分: ① 最上面游戏名字界面 ②信息提示区 ③游戏界面区 ④游戏操作提示区 2.分区设计实现 一.游戏界面显示区,由于只需要显示出图形即可,因此直接用Console.Writeline()输出即可. 二.信息提示区,此处用于显示 游戏对战双方的姓名等信息,在游戏开始时需要由用户录入对战双方的姓名信息,因此可用Console.Readline()来读取 用户键入的值,<注:需要检查验证对战双方的姓名不可相同!> 三.游戏界面区,

  • C#实现飞行棋源码

    本文实例为大家分享了C#实现飞行棋的具体代码,供大家参考,具体内容如下 游戏规则 如果玩家A踩到了玩家B,玩家B退6格 踩到了1幸运轮盘,a交换位置,b轰炸对方使对方退6格 踩到了2地雷,退6格 踩到了3暂停,暂停一回合 踩到了4时空隧道,进10格 踩到了方块,什么都不干 0表示普通关卡 1表示幸运轮盘◎ 2表示地雷★ 3表示暂停▲ 4表示时空隧道卍 关于飞行棋源码的解析,下一篇文章发出. 源码 using System; using System.Collections.Generic; us

  • C#绘制飞行棋地图小程序

    1. 初始化地图,在绘制时可先将地图进行初始化,用数组来存储关卡的位置,然后利用循环给地图中 关卡所在处赋予代表关卡的值. 关键代码如下 /// <summary> /// 初始化游戏地图 /// </summary> static void InitialMap() { for (int i=0;i<Map.Length;i++) { Map[i] =0; } //用于存储关卡位置 int[] luckyTurn = { 6, 23, 40, 55, 69, 83,98 }

  • C# 骑士飞行棋的源码(分享)

    代码如下所示: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace 骑士飞行棋{    class Program    {        //在下面的数组存储我们游戏地图各各关卡        //数组的下标为0的元素对应地图上的第1格    下标为1的元素对应元素第2格...下标为

  • C#实现飞行棋(Winform)

    本文实例为大家分享了C#实现飞行棋的具体代码,供大家参考,具体内容如下 基于Winform框架写的 不足之处请大佬指教 using System; using System.Drawing; using System.Windows.Forms; namespace 飞行棋 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //创建一个数组装游戏地板 int[] mapList = ne

  • C#控制台实现飞行棋游戏

    本文实例为大家分享了C#实现飞行棋游戏的具体代码,供大家参考,具体内容如下 游戏截图: 管理类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class ProgramManage { //随机数 public static Random rd = new Ran

  • python 实现围棋游戏(纯tkinter gui)

    1. 开始前 本程序基于tkinter生成GUI,使用前请确保已经安装好tkinter 对于windows用户,您可能已经安装了tkinter,cmd中输入python -c 'import tkinter',如果没有出错则已安装tkinter 对于linux用户,您可能未安装tkinter,使用包管理工具搜索tkinter,如:apt search tkinter,pacman -Ss tkinter,yum search tkinter,选择符合要求的软件包,然后安装,如果未找到,请自行下载

  • C#实现围棋游戏

    本文实例为大家分享了C#实现围棋游戏的具体代码,供大家参考,具体内容如下 之所以选择围棋作为大作业一方面是想挑战一下,另一方面是由于从6岁学围棋到11岁放下,再到今天已将近8年了,也算是回味一下童年吧,毕竟,曾梦想执子走天涯. 这是效果图: 这个程序除了一开始参考了中国象棋,其他的都是自己完成的. 不说了,上代码!!! 这个是主窗口代码: using System; using System.Collections.Generic; using System.ComponentModel; us

  • 基于Python实现围棋游戏的示例代码

    目录 1.导入模块 2.初始化棋盘 3. 开始游戏 4.放弃当前回合落子 5.悔棋判断 6.重新开始 7.右侧太极图的设置 8.落子设置 9.吃子规则判定设置 10.其他 11.程序入口 12.效果图 文件自取 1.导入模块 tkinter:ttk覆盖tkinter部分对象,ttk对tkinter进行了优化 copy:深拷贝时需要用到copy模块 tkinter.messagebox:围棋应用对象定义 如没有以上模块,在pycharm终端输入以下指令: pip install 相应模块 -i h

  • javascript实现仿腾讯游戏选择

    到我们玩腾讯游戏的时候,会有很多选择,比如选择什么区,什么人物等.下面简单制作腾讯游戏选择. <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author"

  • 使用50行Python代码从零开始实现一个AI平衡小游戏

    集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym,只使用 Numpy 来创建 agent. 各位看官好,我(作者 Mike Shi--译者注)将在本文教大家如何用 50 行 Python 代码,教会 AI 玩一个简单的平衡游戏.我们会用到标准的 OpenAI Gym 作为测试环境,仅用 Numpy 创建我们的 AI,别的不用. 这个小游戏就是经典的

  • Java+Swing实现经典五子棋游戏

    目录 前言 主要需求 主要设计 功能截图 代码实现 总结 前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一.主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋. 容易上手,老少皆宜,而且趣味横生,引人入胜:不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性. 用java语言实现

  • Java实现单机版五子棋游戏的示例代码

    目录 前言 主要需求 主要设计 功能截图 代码实现 总结 前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一.主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋. 容易上手,老少皆宜,而且趣味横生,引人入胜:不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性. 用java语言实现

  • php实现的中秋博饼游戏之掷骰子并输出结果功能详解

    本文实例讲述了php实现的中秋博饼游戏之掷骰子并输出结果功能.分享给大家供大家参考,具体如下: 前面讲述了php实现的中秋博饼游戏之绘制骰子图案功能,纯php实现,就要用php来生成图案,第一步就先绘制骰子图案.下面就是编码实现业务逻辑,具体代码如下: <?php class roll { private $_defRank = 'lk'; public function lottery() { $dice = $this->rollDice(); $format = $this->fo

  • php实现的中秋博饼游戏之绘制骰子图案功能示例

    本文实例讲述了php实现的中秋博饼游戏之绘制骰子图案功能.分享给大家供大家参考,具体如下: 最近公司中秋博饼(在厦门),自己没事也想玩玩,所以就想动手写了一个纯php实现的中秋博饼游戏,既然要纯php实现,就要用php来生成图案,所以第一步就先绘制骰子图案. 平时很少使用php绘图,不过查查资料还是绘制出来了,不多说了,代码如下: header('Content-Type:image/png'); $img = imagecreatetruecolor(200, 200); $white = i

  • python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)

    完整代码下载:http://xiazai.jb51.net/201407/tools/python-migong.rar 最近研究了下迷宫的生成算法,然后做了个简单的在线迷宫游戏.游戏地址和对应的开源项目地址可以通过上面的链接找到.开源项目中没有包含服务端的代码,因为服务端的代码实在太简单了.下面将简单的介绍下随机迷宫的生成算法.一旦理解后你会发现这个算法到底有多简单. 1.将迷宫地图分成多个房间,每个房间都有四面墙. 2.让"人"从地图任意一点A出发,开始在迷宫里游荡.从A房间的1/

随机推荐