五子棋

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

{

相关文档
最新文档