五子棋
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人人五子棋
1.程序设计思路
在下棋过程中,为了保存下过的棋子的位置使用了Box数组,Box数组初值为枚举值Chess,none,表示此处无棋子。Box数组可以存储枚举值Chess.none、Chess.Black、Chess.White,分别代表无棋子、黑子、白子。用timer来实现计时器的30秒倒计时,30秒一到,执棋一方未下,电脑将会帮你随机在棋盘上下棋,所下的棋子可能会助使该方赢棋,如果没有赢棋,转换对象,进行下棋。
对于五子棋游戏来说,规则非常简单,就是在规定的时间内按照先后顺序在棋盘上下棋,直到最先在棋盘上横向、竖向、斜向形成连续的相同色五个棋子一方为胜。
对于算法具体实现大致分为以下几部分:
(1)判断X=Y轴上是否形成五子连珠。
(2)判断X=-Y轴上是否形成五子连珠。
(3)判断X轴上是否形成五子连珠。
(4)判断Y轴上是否形成五子连珠。
以上四种情况只要任何一种成立,就可以判断输赢。
2.程序设计步骤
2.1应用程序界面设计
本程序主要在窗体设计器中添加一个“重新开始”命令按钮控件button1,一个“认输”的button2按钮,一个显示棋子和棋盘的图片框pictureBox1,显示鼠标坐标的标签label1、提示该哪方走棋的标签label2、显示剩余时间的标签label3和一个“每轮不得超过三十秒”的label4。一个menuStrip1菜单控件,菜单中有游戏和帮助子菜单。游戏有开始游戏和退出两个小菜单,帮助有关于五子棋和版本信息两个小菜单。一个statusStrip1状态栏控件,中有两个toolStripStatusLabel2,
一个用来显示当前玩家是黑方还是白方,一个用来显示时间。五子棋应用设计界面如图2-1所示。
图5-1五子棋应用设计界面
2.2窗体成员变量设计
定义Box数组,初值为枚举值Chess,none,表示此处无棋子。Box数组可以存储枚举值Chess.none、Chess.Black、Chess.White,分别代表无棋子、黑子、白子。并且定义首先走棋的人为黑子,定义半径r,用来确定落子的范围,定义计时器的秒数为30。
代码如下:
private enum Chess { none = 0, Black, White };
private Chess[,] Box = new Chess[15, 15];
private Chess mplayer = Chess.Black;//假设持黑棋
private int r;
private int second = 30;
2.3棋盘设计
2.3.1绘制棋盘
在C#绘制图形,首先要创建Graphics(图形)对象,然后再利用DrawBoard()方法,在Graphics对象上绘制。首先我们定义一个画笔,并且设置它的颜色为红色。定义棋盘的边界为1宽度,棋盘中的高度、宽度分别为都为2,首先,将棋盘等分为14份,及画15条竖线和横线,留1的边界。并且在(r + 3 * r * 2 - 4, r + 3 * r * 2 - 4, 8, 8),(r + 3 * r * 2 - 4, r + 11 * r * 2 - 4, 8, 8),(r + 11 * r * 2 - 4, r + 11 * r * 2 - 4, 8, 8),(r + 11 * r * 2 - 4, r + 3 * r * 2 - 4, 8, 8)四点处用黄色画笔画上四颗黄色的天星,来满足五子棋的规格。
代码如下:
private void DrawBoard()
{
int i;
Graphics g = this.pictureBox1.CreateGraphics();
Pen myPen=new Pen(Color.Red);
myPen.Width = 1;
r = pictureBox1.Width / 30;
pictureBox1.Height = pictureBox1.Width;
for( i = 0;i<=14;i++)
{
if( i == 0 || i ==14)
myPen.Width = 2;
else
myPen.Width = 1;
g.DrawLine(myPen, r + i * 2 * r, r, r + i * 2 * r, r * 2 * 15 - r - 1);
}
for( i = 0;i<=14;i++)
{
if( i ==0 || i == 14)
myPen.Width = 2;
else
myPen.Width = 1;
g.DrawLine(myPen, r, r + i * 2 * r, r * 2 * 15 - r - 1, r + i * 2 * r);
}
SolidBrush myBrush=new SolidBrush(Color.Yellow);
g.FillEllipse(myBrush, r + 3 * r * 2 - 4, r + 3 * r * 2 - 4, 8, 8);
g.FillEllipse(myBrush, r + 3 * r * 2 - 4, r + 11 * r * 2 - 4, 8, 8);
g.FillEllipse(myBrush, r + 11 * r * 2 - 4, r + 11 * r * 2 - 4, 8, 8);
g.FillEllipse(myBrush, r + 11 * r * 2 - 4, r + 3 * r * 2 - 4, 8, 8);
label1.Text = r.ToString();
}
2.3.2落子设计
在窗体上鼠标按下的事件pictureBox1_MouseDown中,根据鼠标在pictureBox1内的像素坐标(e.X,e.Y),将之转换成棋盘坐标p,调用Draw(g,p,mplayer)方法在p坐标点上绘制指定mplayer颜色的棋子。最后调用isWin()判断落子后是否赢了此局。如果棋盘坐标满足p.X <= 0 、p.Y <= 0 、p.X >= 15 、p.Y >= 15中任何一个条件,则越出边界。
代码如下:
private void pictureBox1_MouseDown (object sender, MouseEventArgs e)
{
//e.X为pictureBox1内的
Graphics g = this.pictureBox1.CreateGraphics();
Point p = new Point((e.X - 2) / (2 * r), (e.Y -2) / (2 * r));
if (p.X <= 0 || p.Y <= 0 || p.X >= 15 || p.Y >= 15)
{
MessageBox.Show("超边界了");
return;
}
label1.Text = p.X.ToString() + "|" + p.Y.ToString() + "|" + e.X.ToString() + "|" + e.Y.ToString();
if (Box[p.X, p.Y] != Chess.none)
{
MessageBox.Show("已有棋子了");
return;
}
Draw(g, p, mplayer);
Box[p.X, p.Y] = mplayer;
if (isWin(p.X, p.Y, mplayer) == true)//判断输赢否
{
if (mplayer == Chess.White)
{
MessageBox.Show("白方赢了此局!", "比赛结果");
}
else
{