C#程序设计报告
《C#程序设计》课程设计
目: 五子棋—人机大战 题
专 业: 计算机科学与技术 学 号: 111096142 姓 名: 岳文佩 指导老师: 李 向 完成日期: 2012年4月12日
目 录
1 前言 ....................................................... 2 2 课题介绍 ................................................... 2
2.1功能要求 ............................................... 2
2.2主要任务 ............................................... 2
2.3运行环境 ............................................... 2
2.4开发语言 ............................................... 2 3 概要设计与详细设计 ......................................... 2
3.1系统流程 ............................................... 2
3.2详细设计 ............................................... 3
4.1关键代码 ............................................... 5
4.2特色功能的实现 ........................................ 22 5 课程设计总结 .............................................. 23 参考文献 .................................................... 23 评语及成绩 .................................................. 24
1 前言
编写一个程序用以实现简单的单击游戏——五子棋。通过一个二维数组来绘制棋盘,然后绘制五个特定的标志性位置,再对所下棋子进行规范,判断,并记录所下棋子的历史,并最后判断出胜负,将结果显示在屏幕上。 2 课题介绍
2.1功能要求
(1)用C#语言实现程序设计;
(2)利用结构体进行相关信息处理;
(3)良好的人机互交,程序有注释。
2.2主要任务
(1)定义一个结构体类型数组,用于绘制棋盘;
(2)编辑棋盘中的五个特殊位置,(中心。以及局部的四个对称角)。
(3)定义一个栈用于记录之前所下的棋子,并随着玩家每下一棋子便更新该栈;
(4)编写代码;
(5)程序分析与调试。
2.3运行环境
(1)Win7系统;
(2)Visual Studio 2008开发环境;
2.4开发语言
C#语言
3 概要设计与详细设计
3.1系统流程
3.2详细设计
(1)功能绘制棋盘的详细设计
根据一定算法,设计棋盘的横竖线所在位置,用(X,Y)来表示出来,代码如下: public void DrawBoard(PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen pen1 = new Pen(Color.Black, 2.0f);
Pen pen2 = new Pen(Color.Black, 1.0f);
int x1 = 20, y1 = 20, x2 = 496, y2 = 20;
for (int i = 0; i < 15; i++)
{
if (i == 0 || i == 14)
{
g.DrawLine(pen1, x1, y1, x2, y2);
y1 += 34; y2 += 34;
}
else
{
g.DrawLine(pen2, x1, y1, x2, y2);
y1 += 34; y2 += 34;
}
}
x1 = 20; y1 = 20; x2 = 20; y2 = 496;
for (int j = 0; j < 15; j++)
{
if (j == 0 || j == 14)
{
g.DrawLine(pen1, x1, y1, x2, y2);
x1 += 34; x2 += 34;
}
else
{
g.DrawLine(pen2, x1, y1, x2, y2);
x1 += 34; x2 += 34;
}
}
}
我在棋盘的中心以及另外四个特定的点设置五个标记:
public void DrawBoardMark(PaintEventArgs e) //画棋盘上的5个标记
3 - -
{
SolidBrush brush = new SolidBrush(Color.DimGray);
Graphics g = e.Graphics;
Rectangle rect_centre = new Rectangle(256, 255, 6, 7);
Rectangle rect1 = new Rectangle(119, 119, 7, 7);
Rectangle rect2 = new Rectangle(391, 119, 7, 7);
Rectangle rect3 = new Rectangle(119, 391, 7, 7);
Rectangle rect4 = new Rectangle(391, 391, 7, 7);
g.FillRectangle(brush, rect_centre);
g.FillRectangle(brush, rect1);
g.FillRectangle(brush, rect2);
g.FillRectangle(brush, rect3);
g.FillRectangle(brush, rect4);
}
(2)功能判断“是否五子连线”的详细设计如下:
public void isWin(int m, int n)
{
string row = ""; //横线
string col = ""; //竖直线
string slash135 = ""; //左斜线
string slash45 = ""; //右斜线
for (int j = 0; j < 15; j++)
{
row += Table[m, j];
}
for (int i = 0; i < 15; i++)
{
col += Table[i, n];
}
//获取左斜线上的黑白子
for (int i = m, j = n; i >= 0 && j >= 0; i--, j--)
{
slash135 += Table[i, j];
}
//倒置slash135
string ReallySlash135 = "";
for (int k = slash135.Length - 1; k >= 0; k--)
{
ReallySlash135 += slash135[k];
}
for (int i = m + 1, j = n + 1; i < 15 & j < 15; i++, j++)
{
ReallySlash135 += Table[i, j];
4 - -
}
}//以上是部分判断是否形成最后的五子连线。。。。。
4 关键代码与特色功能的实现
4.1关键代码
在Form1.cs设计窗口,我先放置了一个背景图片,然后在一定位置放了两个文本框textBox1和textBox2,用来存放游戏过程状态,然后在Form1.cs中开始写代码。
首先我定义了几个公有变量数组和其他类型变量用以存放游戏中棋子chess信息、人Player信息、电脑Computer信息,游戏最初的状态,以及双方棋子的颜色,定义棋盘等。如下:
//数组中定义值为15是由于我在设计棋盘时采用14个方格,那么棋子可下的位置自然有15个。
public string[,] Table = new string[15, 15]; //记录棋子信息,S空位,B黑棋,W白
public int[, ,] Computer = new int[15, 15, 4];
public int[, ,] Player = new int[15, 15, 4];
public bool isManTurn = true;
public string ManChessColor;
public string ComputerChessColor;
public bool Win=false;
private Stack History;
DrawChessArea dr = new DrawChessArea();
接下来绘制棋盘,关键是在对的位置画线:该步骤在3.2.1的详细设计中给出。 设置Player和Computer的棋子颜色:
public void ChessColor()
{
if (isManTurn == true)
{
ManChessColor = "Black";
ComputerChessColor = "White";
}
else
{
5 - -
ManChessColor = "Black";
ComputerChessColor = "White";
}
}
定义一个结构类型的数组,用于存放放置棋子的坐标及颜色:
StructPoint[,] structPoint = new StructPoint[15, 15]; //创建结构类型的数组
public struct StructPoint //定义结构,用于保存每个棋子的绘制坐标和棋子颜色
{
public Nullable
chessPoint;
public string color;
public StructPoint(Point chessPoint, string color)
{
this.chessPoint = chessPoint;
this.color = color;
}
}
对Player所下棋子部分进行记录:
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (isManTurn == true)
{
bool isInBoard = true;
if (e.X < 3 || e.X > 516 || e.Y < 3 || e.Y > 516)
isInBoard = false;
if (e.Button == MouseButtons.Left && isInBoard)
{
Point MouseClickPoint = new Point(e.X, e.Y);
Point drawPoint = MouseClickPointToDrawChessPoint(MouseClickPoint);
DrawChess(drawPoint, ManChessColor);
isManTurn = false;
}
//下完后交给控制中心
ControlCentre();
}
}
由上述Form1_MouseClick
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
中所使用的控制中心为以下定义:
public void ControlCentre()
{
Engine engine = new Engine();
if (isManTurn == false)
{
6 - -
if (History.Count == 1)
{
int m = 0, n = 0;
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
if (Table[i, j] == "B")
{
m = i; n = j;
}
}
}
Point p = new Point(m, n);
Point pp = engine.ComputerStep1(p);
Point drawPoint = new Point();
drawPoint.X = 3 + 34 * pp.X + 2;
drawPoint.Y = 3 + 34 * pp.Y + 2;
DrawChess(drawPoint, ComputerChessColor);
}
else
{
Array.Clear(Computer, 0, Computer.Length);
engine.analyseComputer(Table, "W", Computer);
Array.Clear(engine.Board, 0, engine.Board.Length);
Array.Clear(Player, 0, Player.Length);
engine.analysePlayer(Table, "B", Player);
engine.analyseComputerFinally(Table, Computer, Player, "W");
engine.analysePlayerFinally(Table, Computer, Player, "B");
Point drawPoint = new Point();
drawPoint=GetMaxMark();
DrawChess(drawPoint, ComputerChessColor);
}
}
}
对于Player下每一步棋子绘制到棋盘上对应的位置设置如下:
//若Player点击到方格内,使其自动设定到方格所在的右上角:
public Point MouseClickPointToDrawChessPoint(Point p)
{ //鼠标点击的坐标转换为要画棋子的矩形左上顶点坐标----
int m = (p.X - 3) / 34;
int n = (p.Y - 3) / 34;
Point drawPoint = new Point();
drawPoint.X = 3 + 34 * m + 2;
drawPoint.Y = 3 + 34 * n + 2;
return drawPoint;
7 - -
}
将Player和Computer所下的正确棋子均记录到History栈中,(下到画格外面的棋子当做无效棋子),即更新历史栈:
public void DrawChess(Point p, string color)
{
Engine engine = new Engine();
if (Win)
{
return;
}
int m = (p.X - 5) / 34;
int n = (p.Y - 5) / 34;
if (m < 0 || m > 14 || n < 0 || n > 14) //点击超过棋盘范围时
{
return;
}
Rectangle r = new Rectangle(p.X, p.Y, 32, 32);
LinearGradientBrushbrush=
newLinearGradientBrush(r,Color.DarkGray,Color.Black,LinearGradientMode.ForwardDiagonal);
if (color == "Black")
{
brush=newLinearGradientBrush(r,Color.DarkGray,Color.Black,LinearGradientMode.ForwardDiagonal);
Table[m, n] = "B";
structPoint[m, n].chessPoint = p;
structPoint[m, n].color = "Black";
isManTurn = false;
}
else if (color == "White")
{
brush=newLinearGradientBrush(r,Color.Salmon,Color.Salmon,LinearGradientMode.ForwardDiagonal);
Table[m, n] = "W";
structPoint[m, n].chessPoint = p;
structPoint[m, n].color = "White";
isManTurn = true;
}
Graphics g = this.CreateGraphics();
g.SmoothingMode = SmoothingMode.AntiAlias;
g.FillEllipse(brush, r);
g.Dispose();
History.Push(new Point(p.X, p.Y)); //添加历史纪录
Array.Clear(Computer, 0, Computer.Length);
engine.analyseComputer(Table, "W", Computer);
Array.Clear(engine.Board, 0, engine.Board.Length);
8 - -
Array.Clear(Player, 0, Player.Length);
engine.analysePlayer(Table, "B", Player);
engine.analyseComputerFinally(Table, Computer, Player, "W");
engine.analysePlayerFinally(Table, Computer, Player, "B");
isWin(m, n);
}
对于下到棋盘外面的棋子,进行重新下,同样调用上述DrawChess函数:
public void ReDrawChess(StructPoint[,] structPoint)
{
for (int i = 0; i < structPoint.GetLength(0); i++)
{
for (int j = 0; j < structPoint.GetLength(1); j++)
{
if (structPoint[i, j].chessPoint != null)
{
DrawChess((Point)(structPoint[i, j].chessPoint), structPoint[i, j].color);
}
}
}
}
游戏进行中,同时需要程序对每下一个棋子后所在的状态进行判断,以及到最后游戏结束时胜负情况的判断的记录:
//游戏的结束时:若存在横、竖、斜方向,任意方向,有相同颜色的棋子正好五个连成一条线,则该方胜出:(白棋五个连成线,则Computer胜;相反,Player胜出~) 此处设计在3.1.3详细设计中特别给出。
以下是对计算机在下棋子的时候进行规范,找最接近五子连线的点下棋,防止游戏过于简单(此处我在写的时候借鉴了一些五子棋游戏中的专业术语):
public Point GetMaxMark() //选最优点
{
int max1 = Computer[0, 0, 0];
int max2 = Player[0, 0, 0];
int m1=0, n1=0, p1=0;
int m2=0, n2=0, p2=0;
int m, n, p;
int max = 0; ;
int point_x, point_y;
for (int i = 0; i < Computer.GetLength(0); i++)
{
for (int j = 0; j < Computer.GetLength(1); j++)
{
for (int l = 0; l < Computer.GetLength(2); l++)
{
if (Computer[i, j, l] >max1)
9 - -
{
max1 = Computer[i, j, l];
m1 = i; n1 = j; p1 = l;
}
}
}
}
for (int i = 0; i < Player.GetLength(0); i++)
{
for (int j = 0; j < Player.GetLength(1); j++)
{
for (int l = 0; l < Player.GetLength(2); l++)
{
if (Player[i, j, l] > max2)
{
max2 = Player[i, j, l]; m2 = i;
n2 = j; p2 = l;
}
}
}
}
if (max1 > max2)
{
max = max1; m = m1; n = n1; p = p1;
point_x = 3 + 34 * m + 2;
point_y = 3 + 34 * n + 2;
}
else
{
max = max2; m = m2; n = n2; p = p2;
point_x = 3 + 34 * m + 2;
point_y = 3 + 34 * n + 2;
}
if (max2 <= 60)
{
max = max1; m = m1; n = n1;
}
point_x = 3 + 34 * m + 2;
point_y = 3 + 34 * n + 2;
Point drawPoint = new Point(point_x, point_y);
this.textBox1.Text = "位置["+m.ToString() + "][" + n.ToString()+"]";
if (max == 100)
{
if (max == max1)
{
10 - -
textBox2.Text ="得分 "+ max.ToString() + " " + "白棋 成五";
}
else
{
textBox2.Text ="得分 "+ max.ToString() + " " + "黑棋 成五";
}
}
else if (max == 90)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 双死四";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 双死四";
}
}
else if (max == 85)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 成活四";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 成活四";
}
}
else if (max == 80)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 四三胜";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 四三胜";
}
}
else if (max == 75)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 双活三";
11 - -
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 双活三";
}
}
else if (max == 60)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 单活三";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 单活三";
}
}
else if (max == 70)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 活三堵对方活三";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 活三堵对方活三";
}
}
else if (max == 40)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 成死四";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 成死四";
}
}
else if (max == 25)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 双活二";
}
12 - -
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 双活二";
}
}
else if (max == 20)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 活二且堵对方活二";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "黑棋 活二且堵对方活二";
}
}
else if (max == 15)
{
if (max == max1)
{
textBox2.Text = "得分 " + max.ToString() + " " + "白棋 活二且堵住对方双活一";
}
else
{
textBox2.Text = "得分 " + max.ToString() + " " + "活二 且堵住对方双活一";
}
}
return drawPoint;
}
Reset函数是用于对棋盘的重置:(但是我没用到,因为没有设置重玩按钮)
public void ReSet() //初始化
{
History.Clear();
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
Table[i, j] = "S";
structPoint[i, j].chessPoint = null;
structPoint[i, j].color = null;
}
}
Array.Clear(Computer, 0, Computer.Length);
Array.Clear(Player, 0, Player.Length);
13 - -
}
以上就是对游戏我们可见的游戏之前及游戏中的规则设置安排。
在游戏界面,我们可以看见在棋盘下面有两个TextBox,这两个文本框,我用于放
Computer分数,以及一些特殊置每一步后,根据我们玩的五子棋的规则给Player和
的五子棋术语:比如,(白棋,活二且堵对方活二)、(双活二)、(双活)等。 在这里,我设置电脑所下的第一步棋子人为的进行控制:
public Point ComputerStep1(Point p) //电脑的第一步棋,人工控制
{
Random r = new Random();
int k = r.Next(8);
int m = 0, n = 0;
if (p.X < 4 && p.Y < 4)
{
if (p.X == 3 && p.Y == 3)
{
m = p.X + 2; n = p.Y;
}
else
{
m = p.X + 2; n = p.Y + 2;
}
}
else if (p.X < 4 && p.Y >= 4 && p.Y <= 10)
{
m = p.X + 2; n = p.Y;
}
else if (p.X >= 4 && p.X <= 10 && p.Y < 4)
{
m = p.X; n = p.Y + 2;
}
else if (p.X > 10 && p.Y < 4)
{
m = p.X - 2; n = p.Y + 2;
}
else if (p.X > 10 && p.Y >= 4 && p.Y <= 10)
{
m = p.X - 2; n = p.Y;
}
else if (p.X > 10 && p.Y > 10)
{
if (p.X == 11 && p.Y == 11)
{
m = p.X - 2; n = p.Y;
14 - -
}
else
{
m = p.X - 2; n = p.Y - 2;
}
}
else if (p.X < 4 && p.Y > 10)
{
if (p.X == 3 && p.Y == 11)
{
m = p.X + 2; n = p.Y;
}
else
{
m = p.X + 2; n = p.Y - 2;
}
}
else if (p.X >= 4 && p.Y >= 11)
{
m = p.X; n = p.Y - 2;
}
else
{
switch (k)
{
case 0:
m = p.X - 1; n = p.Y;
break;
case 1:
m = p.X + 1; n = p.Y;
break;
case 2:
m = p.X; n = p.Y - 1;
break;
case 3:
m = p.X; n = p.Y + 1;
break;
case 4:
m = p.X - 1; n = p.Y - 1;
break;
case 5:
m = p.X + 1; n = p.Y + 1;
break;
case 6:
m = p.X + 1; n = p.Y - 1;
15 - -
break;
case 7:
m = p.X - 1; n = p.Y + 1;
break;
}
}
Point pp = new Point(m, n);
return pp;
}
public void ComputerFirstGetScore(int i, int j, string ChessColor, string[,] Table, int[, ,] Computer)
//初步给电脑评分
{
isChessLive2(i, j, ChessColor, Table);
isChessDead4(i, j, ChessColor, Table);
isChessLive3(i, j, ChessColor, Table);
isChessLive4(i, j, ChessColor, Table);
isChess5(i, j, ChessColor, Table);
for (int m = 0; m < Board.GetLength(0); m++)
{
for (int n = 0; n < Board.GetLength(1); n++)
{
for (int p = 0; p < Board.GetLength(2); p++)
{
Computer[m, n, p] = Board[m, n, p];
}
}
}
}
public void PlayerFirstGetScore(int i, int j, string ManColor, string[,] Table, int[, ,] Player)
//初步给玩家评分
{
isChessLive2(i, j, ManColor,Table);
isChessDead4(i, j, ManColor, Table);
isChessLive3(i, j, ManColor, Table);
isChessLive4(i, j, ManColor, Table);
isChess5(i, j, ManColor, Table);
for (int m = 0; m < Board.GetLength(0); m++)
{
for (int n = 0; n < Board.GetLength(1); n++)
{
for (int p = 0; p < Board.GetLength(2); p++)
{
Player[m, n, p] = Board[m, n, p];
}
}
16 - -
}
}
public void PlayerFinallyGetScore(int i, int j, string ChessColor, string[,] Table, int[, ,] Computer, int[, ,] Player) //计算
玩家的最终评分
{
//双死四
int count = 0;
for (int p = 0; p < 4; p++)
{
if (Player[i, j, p] == 40)
{
count++;
}
}
if (count == 2)
{
Player[i, j, 0] = 90;
}
//四三胜(死四活三)
bool isDeadFour = false;
bool isLiveThree = false;
for (int p = 0; p < 4; p++)
{
if (Player[i, j, p] == 40)
{
isDeadFour = true;
}
}
for (int p = 0; p < 4; p++)
{
if (Player[i, j, p] == 60)
{
isLiveThree = true;
}
}
if (isDeadFour && isLiveThree)
{
Player[i, j, 0] = 80;
}
//双活三
count = 0;
for (int p = 0; p < 4; p++)
{
if (Player[i, j, p] == 60)
17 - -
{
count++;
}
}
if (count == 2)
{
Player[i, j, 0] = 75;
}
//以上是对玩家Player的得分计算 }
public void ComputerFinallyGetScore(int i, int j, string ChessColor, string[,] Table,int[,,] Computer,int[,,] Player)
{
//计算电脑的最终评分
//双死四
int count = 0;
for (int p = 0; p < 4; p++)
{
if (Computer[i, j, p] == 40)
{
count++;
}
}
if (count == 2)
{
Computer[i, j, 0] = 90;
}
//双活三
count = 0;
for (int p = 0; p < 4; p++)
{
if (Computer[i, j, p] == 60)
{
count++;
}
}
if (count == 2)
{
Computer[i, j, 0] = 75;
}
//形成单活3,且堵住对方的一个单活3
isLiveThree = false;
bool isDuManFour = false;
for (int p = 0; p < 4; p++)
{
18 - -
if (Computer[i, j, p] == 60)
{
isLiveThree = true;
}
}
for (int p = 0; p < 4; p++)
{
if (Player[i, j, p] == 85)
{
isDuManFour = true;
}
}
if (isDuManFour && isLiveThree)
{
Computer[i, j, 0] = 70;
}
//以上是对Computer的得分计算(摘录部分)
上面我们可以看到,我使用了一些五子棋游戏中的专业术语,而这些专业术语的定义程序本身并不能识别,因此我需要对每一个术语的概念及其特指的游戏状态进行定义。(在这里我只复制一部分来说例)
public void isChessLive2(int i, int j, string ChessColor,string[,] Table)
{
//活2的形状1
isChessLive2_OO_(i, j, ChessColor,Table);
//活2的形状2(跳活2)
isChessLive2_O_O_(i, j, ChessColor, Table);
}
public void isChessDead4(int i, int j, string ChessColor, string[,] Table)
{
string color="";
if(ChessColor=="W")
color="B";
else if(ChessColor=="B")
color="W";
string model1 = color + ChessColor + ChessColor + ChessColor +ChessColor+ "S";
string model2 = color + ChessColor + ChessColor + ChessColor + "S" + ChessColor;
string model3 = color + ChessColor + ChessColor + "S" + ChessColor+ChessColor;
string model4 = color + ChessColor + "S" + ChessColor+ChessColor + ChessColor;
string model5 = color + "S" + ChessColor + ChessColor + ChessColor+ChessColor;
string model6 = ChessColor + "S" + ChessColor + ChessColor + ChessColor + color;
//string model6 = "BSBBBW";
string chessLine = string.Empty;
string chessLineLeft = string.Empty;
string chessLineRight = string.Empty;
19 - -
string newChessLine = string.Empty;
//搜索左斜方向
chessLine = "";
chessLineLeft = "";
chessLineRight = "";
newChessLine = "";
if (i >= j)
{
for (int m = i - j, n = 0; m <=i-1 && n <=j-1; m++, n++)
{
chessLineLeft += Table[m, n];
}
for (int m = i + 1, n = j + 1; m < 15 && n < 15; m++, n++)
{
chessLineRight += Table[m, n];
}
}
else
{
for (int m = 0, n = j - i; m <=i-1 && n <=j-1; m++, n++)
{
chessLineLeft += Table[m, n];
}
for (int m = i + 1, n = i + 1; m < 15 && n < 15; m++, n++)
{
chessLineRight += Table[m, n];
}
}
chessLine = chessLineLeft + ChessColor + chessLineRight;
if (chessLine.Contains(model1) || chessLine.Contains(model2) || chessLine.Contains(model3)
|| chessLine.Contains(model4) || chessLine.Contains(model5))
{
Board[i, j, 2] = 40;
}
for (int k = chessLine.Length - 1; k >= 0; k--)
{
newChessLine += chessLine[k];
}
if (newChessLine.Contains(model1) || newChessLine.Contains(model2) ||
newChessLine.Contains(model3)
|| newChessLine.Contains(model4) || newChessLine.Contains(model5))
{
Board[i, j, 2] = 40;
}
20 - -
//搜索右斜方向
chessLine = "";
chessLineLeft = "";
chessLineRight = "";
newChessLine = "";
if (i + j <= 14)
{
for (int m = 0, n = i+j;m<=i-1&&n>=j-1&&m<15&&n<15&&n>=0&&m>=0 ; m++, n--)
{
chessLineLeft += Table[m, n];
}
for (int m = i + 1, n = j + 1; m < 15 && n >= 0&&n<15; m++, n--)
{
chessLineRight += Table[m, n];
}
}
else
{
for (int m = i+j-14, n = 14; m<=i-1&&n>=j-1&&m>=0&&n<15&&m<15&&m>=0; m++, n--)
{
chessLineLeft += Table[m, n];
}
for (int m = i + 1, n = j + 1; m < 15 && n < 15&&n>=0&&m>=0; m++, n--)
{
chessLineRight += Table[m, n];
}
}
chessLine = chessLineLeft + ChessColor + chessLineRight;
if (chessLine.Contains(model1) || chessLine.Contains(model2) || chessLine.Contains(model3)
|| chessLine.Contains(model4) || chessLine.Contains(model5)||newChessLine.Contains(model6))
{
Board[i, j, 3] = 40;
}
for (int k = chessLine.Length - 1; k >= 0; k--)
{
newChessLine += chessLine[k];
}
if(newChessLine.Contains(model1)||newChessLine.Contains(model2)||newChessLine.Contains(model3)
||newChessLine.Contains(model4)||
newChessLine.Contains(model5)||newChessLine.Contains(model6))
{
Board[i, j, 3] = 40;
}
chessLine = "";
chessLineLeft = "";
21 - -
chessLineRight = "";
newChessLine = "";
}
4.2特色功能的实现
黑棋是由player所下,白棋(图片中的红棋)是由computer所下
22 - -
5 课程设计总结
在最初准备做这个大作业时,大家都在讨论做各种系统,学生成绩管理系统、图书管理系统等等,而我却对再做系统没有什么很大的兴趣。相反,在课堂上,老师则鼓励大家可以做记事本、音乐播放器、小游戏等,当时我就想着要不然做一个小游戏,平常经常玩五子棋,不论是人机对战,还是双人网上对决,于是就想着通过各种学习途径做一个不是那么复杂的五子棋出来。
刚开始着手做时,只想到先放一个背景图片作为窗体,然后就是在该窗体上画出来棋盘,这个我是通过参考资料学习的,棋盘的绘制我选择用二维数组,而下棋过程中需要记录,判断,一些嵌套的循环结构,,中间会遇到很多问题,我都是通过查阅资料,浏览网上资料进行一一解决。
在程序设计过程中可能还会有些问题没有考虑到,比如说:设定双方每一步最长时间,一旦时间超出MaxTime,就由系统带下等等,希望自己通过继续学习来完善本程序。
参考文献
[1] C#入门经典(第五版)。清华大学出版社。
[2] C#高级编程(第七版)。 清华大学出版社,2010年
[2] 陈英学等编著. ASP.NET深入编程. 北京希望电子出版社,2001年
[3] 刘杨等编著.突破C#编程实例五十讲. 北京:中国水利水电出版社,2002年.
[4] 李兰友 杨晓光 Visual C#.NET程序设计.北京:北方交通大学出版社, 2004
[5] 施艳梅 陈培 陈发吉.C#语言程序设计教程. 北京:中国水利水电出版社,2004
[6] 【Visual C#】游戏开发笔记
[7] 王昊亮,李刚等. Visual C#程序设计教程. 北京:清华大学出版社,2003
23 - -
评语及成绩 题 目: 五子棋——人机大战
专 业: 计算机科学与技术
学 号: 111096142
姓 名: 岳文佩
教师评语:
评定成绩:
24 - -