软件工程课程设计-小游戏

 

姓名学号: 黄浩

学 院:理学院

专业年级:2013级信息与计算科学1班

课程:软件工程

设计题目:井字棋游戏

2015年 12 月

本科课程设计说明书

目 录

1 引言 ……………………………………………………………………………… 1 2 软件开发可行性分析 …………………………………………………………… 1

2.1 可行性分析 …………………………………………………………………… 1

2.2 软件开发进度安排 …………………………………………………………… 1 3 软件需求分析 …………………………………………………………………… 2 4 软件设计 ………………………………………………………………………… 2

4.1 概要设计 ……………………………………………………………………… 2

4.2 详细设计 ……………………………………………………………………… 4 5 编程实现 ………………………………………………………………………… 5

5.1 软件开发环境介绍 …………………………………………………………… 5

5.2 相关工具的选取 ……………………………………………………………… 5

5.3 软件所需的硬件设备 ………………………………………………………… 5

5.4 系统运行环境 ………………………………………………………………… 5

5.5 软件实现 ……………………………………………………………………… 5 6 测试 ……………………………………………………………………………… 14 总结 …………………………………………………………………………………… 15

本科课程设计说明书 第1页 共3页

1引 言

在课程设计项目中,井字棋游戏设计作为初学者的我们来说,是个比较适合和有研究意义的题目。 “井字棋”游戏(又叫“三子棋”),或是一字棋,是一款十分经典的益智小游戏,想必很多玩家都有玩过。“井字棋”的棋盘很简单,是一个3×3的格子,很像中国文字中的“井”字,所以得名“井字棋”。“井字棋”游戏的规则与“五子棋”十分类似,“五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。虽然这只是个很简单的小游戏,但作为初学者的我们认识项目设计的技巧与结构及其概念的理解,封装性、继承派生、多肽的理解及实现,是比较好的课题。对我们以后的大型程序的设计奠定了基础。所以作为我们这次的课程设计项目来说,我们认为是个很好的、有可研究性的设计项目。

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X)

2 软件开发可行性分析 2.1 可行性分析

该游戏具有较高的可行性,具体分析如下:

1.该游戏的开发语言是C#,其凭着高效的开发速度、安全、便捷,使系统开发变得更加容易。

2.游戏运行的硬件环境要求低,一般配置的计算机硬件就可以运行游戏,游戏上手容易,操作简洁。

2.2 软件开发进度安排

本科课程设计说明书 第2页 共4页

3 软件需求分析

1.玩家按下按键后可以选择开始游戏。

2.开始游戏时可以选择O\X子。

3.玩家可以随时退出游戏。

4.玩家可以重新开始。

4软件设计

井字棋游戏初始化开始界面会提示玩家选择是否先下。选择是则先下则为x,否则为o,游戏有3×3的棋盘,分别由两人执O和X轮流下棋,类似五子棋的玩法,到一方三子连珠的时候,该玩家为胜者.通过计分板计算比分!

4.1概要设计

井字棋中,假设使用“X”的是人,使用“O”的是计算机。“X”方先走,设定X方的最大利益为正无穷(程序使用常量+INFINITY表示),O方的最大利益为负无穷(程序中使用-INFINITY表示),即X方和O方走的每步棋都要力图使自己的利益最大化,而使对方的利益最小化。这样我们称X方为MAX(因为他总是追求更大的值),

本科课程设计说明书 第3页 共5页

O方为MIN(它总是追求更小的值),各自都为争取自己的最大获益而努力。现在举例说明,比如图4所示的棋局树:

图1棋局形成的树

X方先走,有三种选择,如图4中第二层所示。假设X方选择最左边的走法,那么O方接下来将有5种走法,O方会选择最小化的走法,即值为-1的走法,因为它的最大利益是负无穷;同理,X方的另外两种走法会分别得到O方的最小值1和-2。这样,对于X方来说,三种走法会导致O方最小化值分别为-1、1、-2,X方的最佳策略则是选择其中最大的,即第二层中间的走法,因为它的最大利益是正无穷,这就是极小极大算法的体现——X方的选择总是极大化,O方的选择总是极小化。

对于其中那些值的是如何计算的,我们举例说明,比如对于第三层最左边的棋局,在这种状态下,如果把棋局空白处都填上X,则X共有6中3连子情况,即获胜情况;如果把空白处都填上O,则O共有5种3连子情况,所以结果是二者相减等于1。

在具体走起过程中,MAX面对MIN最大获利中的最小值时,会选择其中最大的,比如图4第二层小括号内的值都是第三层中能使MIN最大获利的最小值,这时候MAX选择其中最大的,这对MAX最为有利,所以MAX方选择图4第二层中间的走法最好。同样道理,MIN也会一样,选择对自己最有利的,即MAX有可能获得的最大值。这时候,MIN在走棋时会考虑MAX方占据哪个位置对MAX最有利,然后MIN把这个位置先占了。有点难理解,其实就是抢先把对对手有利的位置抢占了。

简单说,X方或者MAX方的走棋时由人来控制的,我们不仔细说了。对于O方或者MIN方,它走棋时要考虑哪个位置对X方最有利,然后把该位置占据,即O的最佳走棋就是X的最佳走棋。所以O在走棋之前,先站在X的角度寻找最佳走棋位置。后文中minimax方法就是站在X角度来考虑极小极大算法,找到X的最佳走棋位置,然后由O方来占据该位置。

2、极小极大算法

整个算法包括如下几个部分:

首先要有一个评估方法gameState,对每走一步棋后的棋局进行评估,估值为WIN常量说明X方,即MAX方获胜;估值为LOSE则O方,即MIN方获胜;估值DRAW为平局;估值为INPROGRESS,说明棋未走完;估值为DOUBLE_LINK,说明棋局中有两连子情况

然后用一个minimax方法寻找在当前棋局状态下X方的最佳位置, X方的最佳位置就是当X走该位置后,O方所有走法中最小值里的最大值,比如图4中第二层X 的

本科课程设计说明书 第4页 共6页

位置选择。当找到该位置后,由O方来抢先占据该位置。

最后用两个递归方法min和max来遍历所有的棋局。min方法负责找出O方的最小值,比如图1第二层最左边的棋局会导致5中O方的走法,min方法就是找出这5种走法中的最小值。同理,max方法负责找出X方的最大值,比如图1第二层三种棋局中的中间棋局。

4.2 详细设计

流程图:

本科课程设计说明书 第5页 共7页

5 编程实现

5.1软件开发环境介绍

迷宫游戏开发是基于C/S模式,开发环境是Windows 7下的Visual Studio 2010。迷宫游戏设计没有使用到关于后台数据库的功能。借助Visual Studio 2010集成开发环境,软件开发工作将变得更为简单便捷,业务决策也会变得更为有效。任何规模的组织都可以使用Visual Studio 2015快速创建应用程序,这些应用程序能够利用Windows操作系统,使其成为更安全、更易于管理、更可靠的应用程序。

5.2相关工具的选取

C#是基于C语言和Microsfot.NET平台开发的。它使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序,Microsoft .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。C#的编程思想JAVA类似。且其组件及控件的使用容易,且上手方面,适合短期时间内高效迅速的开发出具有一定功能的软件。

迷宫游戏使用了面板容器、透明容器、标签等控件。调用的触发事件主要有按键事件,鼠标时间,定时器事件。

5.3 软件所需硬件设备

? Windows xp及以上版本操作系统;

? 鼠标;

? VGA或LCD显示器;

5.4 系统运行环境

服务器端:无

客户端:Windows xp及以上版本操作系统;

5.5 软件实现

1、软件介绍

确认框

:

本科课程设计说明书 第6页 共8页

游戏开始界面:

游戏胜负的界面:

2、游戏主要代码介绍:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Tictactoe

{

class AITicTacToe

{

public AITicTacToe() {

InitBoard();

本科课程设计说明书 第7页 共9页

}

List<int> indexWin = new List<int>(new int[]{0,0,0});

List<Player> Board = new List<Player>();

List<Player> TemporaryBoard = new List<Player>();

public enum Player {

X,

O,

S

}

private Player turn;

public List<Player> getBoard()

{

return Board;

}

public List<int> getIndices() {

return indexWin;

}

public void clearIndices() {

indexWin[0] = 0;

indexWin[1] = 0;

indexWin[2] = 0;

}

public void InitBoard() {

Board.Clear();

for (int i = 0; i < 9; i++)

{

Board.

Add(Player.S);

}

}

public void setValueOnBoard(int index)

{

Board[index]=this.getAttacker();

}

public void getNextAttacker()

{

本科课程设计说明书 第8页 共10页

turn = (turn == Player.X) ? Player.O : Player.X;

}

public Player getAttacker()

{

return turn;

}

public void setAttacker(Player player)

{

this.turn = player;

}

public Boolean HasWinner(List<Player> tempBoard)

{

if (this.checkDiagonal(tempBoard) || this.checkHorizontal(tempBoard) || this.checkVertical(tempBoard)) {

return true;

}

return false;

}

public Boolean isDraw(List<Player> tempBoard)

{

int ctr = 0;

foreach (Player player in tempBoard) {

if (player == Player.S) {

ctr++;

}

}

return (ctr == 0) ? true: false;

}

private Boolean checkDiagonal(List<Player> tempBoard)

{

if (tempBoard[0] == tempBoard[4] && tempBoard[0] == tempBoard[8]) {

if (tempBoard[0] != Player.S)

{

indexWin[0] = 0;

indexWin[1] = 4;

indexWin[2] = 8;

本科课程设计说明书 第9页 共11页

return true;

}

}

if (tempBoard[2] == tempBoard[4] && tempBoard[2] == tempBoard[6]) {

if (tempBoard[2] != Player.S)

{

indexWin[0] = 2;

indexWin[1] = 4;

indexWin[2] = 6;

return true;

}

}

return false;

}

private Boolean checkHorizontal(List<Player> tempBoard){

// check if Board[0],Board[1] and Board[2] are equals

if (tempBoard[0] == tempBoard[1] && tempBoard[0] == tempBoard[2]) {

if (tempBoard[0] != Player.S) {

indexWin[0] = 0;

indexWin[1] = 1;

indexWin[2] = 2;

return true;

}

}

if (tempBoard[3] == tempBoard[4] && tempBoard[3] == tempBoard[5]) {

if (tempBoard[3] != Player.S)

{

indexWin[0] = 3;

indexWin[1] = 4;

indexWin[2] = 5;

return true;

}

}

if (tempBoard[6] == tempBoard[7] && tempBoard[6] == tempBoard[8]) {

if (tempBoard[6] != Player.S)

{

indexWin[0] = 6;

本科课程设计说明书 第10页 共12页

indexWin[1] = 7;

indexWin[2] = 8;

return true;

}

}

return false;

}

private Boolean checkVertical(List<Player> tempBoard)

{

if (tempBoard[0] == tempBoard[3] && tempBoard[0] == tempBoard[6]) {

if (tempBoard[0] != Player.S)

{

indexWin[0] = 0;

indexWin[1] = 3;

indexWin[2] = 6;

return true;

}

}

if (tempBoard[1] == tempBoard[4] && tempBoard[1] == tempBoard[7]) {

if (tempBoard[1] != Player.S)

{

indexWin[0] = 1;

indexWin[1] = 4;

indexWin[2] = 7;

return true;

}

}

if (tempBoard[2] == tempBoard[5] && tempBoard[2] == tempBoard[8]) {

if (tempBoard[2] != Player.S)

{

indexWin[0] = 2;

indexWin[1] = 5;

indexWin[2] = 8;

return true;

}

}

return false;

本科课程设计说明书 第11页 共13页

}

public List<int> getAvailableCells(List<Player> tempBoard)

{

List<int> getCells = new List<int>();

int ctr = 0;

foreach (Player player in tempBoard)

{

if (player == Player.S)

{

getCells.

Add(ctr);

}

ctr++;

}

return getCells;

}

}

}

namespace Tictactoe

{

public partial class Form1 : Form

{

AITicTacToe Game;

public Form1()

{

InitializeComponent();

Game = new AITicTacToe();

}

private void cell1_Click(object sender, EventArgs e)

{

var myButton = (Button)sender;

myButton.Enabled = false;

bool xWin = false;

txtTurn.Text = Game.getAttacker().ToString() + " Turn!";

myButton.Text = (Game.getAttacker() == AITicTacToe.Player.X) ? "X" : "O"; Game.setValueOnBoard(int.Parse(myButton.Name.Replace("cell",""))-1); if (Game.HasWinner(Game.getBoard()))

{

本科课程设计说明书 第12页 共14页

getIndexes(Game.getIndices());

if (MessageBox.Show(this, Game.getAttacker() + " win the

game!","TicTacToe",MessageBoxButtons.OK) == System.Windows.Forms.DialogResult.OK) {

xWin = (Game.getAttacker() == AITicTacToe.Player.X) ? true : false;if (xWin)

{

txtX.Text = (int.Parse(txtX.Text) + 1).ToString();

}

else

{

txtO.Text = (int.Parse(txtO.Text) + 1).ToString();

}

Game.InitBoard();

ResetButton();

EnableButton(true);

}

Game.clearIndices();

}

else if (Game.isDraw(Game.getBoard())) {

MessageBox.Show("Draw!");

Game.InitBoard();

ResetButton();

EnableButton(true);

}

Game.getNextAttacker();

}

private void Form1_Load(object sender, EventArgs e)

{

if (MessageBox.Show(this, "Do you want to attack first?", "Prompt", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)

{

Game.setAttacker(AITicTacToe.Player.O);

}

else

{

Game.setAttacker(AITicTacToe.Player.X);

}

txtTurn.Text = Game.getAttacker().ToString() + " Turn!";

www.99jianzhu.com/包含内容:建筑图纸、PDF/word/ppt 流程,表格,案例,最新,免费下载,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。


TOP最近更新内容

    长城小学关爱留守儿童工作制度
    园林史名词解释
  • 上一篇:概率论习题
  • 下一篇:大学计算机基础综合实验实验报告 参考模板(1)