C课程设计之井字过三关棋盘游戏可编辑.docx

上传人:b****6 文档编号:8176044 上传时间:2023-01-29 格式:DOCX 页数:19 大小:21.99KB
下载 相关 举报
C课程设计之井字过三关棋盘游戏可编辑.docx_第1页
第1页 / 共19页
C课程设计之井字过三关棋盘游戏可编辑.docx_第2页
第2页 / 共19页
C课程设计之井字过三关棋盘游戏可编辑.docx_第3页
第3页 / 共19页
C课程设计之井字过三关棋盘游戏可编辑.docx_第4页
第4页 / 共19页
C课程设计之井字过三关棋盘游戏可编辑.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

C课程设计之井字过三关棋盘游戏可编辑.docx

《C课程设计之井字过三关棋盘游戏可编辑.docx》由会员分享,可在线阅读,更多相关《C课程设计之井字过三关棋盘游戏可编辑.docx(19页珍藏版)》请在冰豆网上搜索。

C课程设计之井字过三关棋盘游戏可编辑.docx

C课程设计之井字过三关棋盘游戏可编辑

C++课程设计之井字过三关(棋盘游戏)

 

课程设计报告

学院、系:

吉林大学珠海学院计算机科学与技术系

专业名称:

计算机科学与技术

课程设计科目VC++程序课程设计

学生姓名:

陈郑洲

指导教师:

郎六琪

完成时间:

2013年12月27日一、设计任务与目标

井字过三关(棋盘游戏)

编一棋盘游戏程序,人为一方,计算机为一方,人下时字符*将放在所指定的位置,而计算机下时字符@将放在某一空格位置。

行、列、或两对角线有连续三个相同字符一方为胜方,也有平局情况。

要求能动态演示。

*@

@*

**

足球联赛

足球联赛采用主客场双循环赛制,胜一场得3分,平局各得1分,负一场得0分,联赛排名以积分多者在前,当两队(或多队)积分相同时,则净胜球(即进球数与失球数之差)多者在前,若净胜球相同,则进球数多者在前,若仍相同,则抽签或踢附加赛决定名次(这在联赛结束后进行,联赛未结束则两队名次并列,本程序不做这方面要求)。

试编一程序统计最近一轮比赛后,各队积分及排名。

基本要求

设积分表结构如下:

队名(不超过15个字符),已比赛的场数,赢的场数,平的场数,负的场数,进球数,失球数,积分。

积分表放在正文文件中。

最近一轮的结果从键盘输入,其形式为:

主队名(可用代码),客队名(可用代码),主队得分(即进球数),客队得分(即进球数)。

程序应根据此轮结果修改各队的积分和名次,所得的最新记分表仍在原积分文件中并同时在屏幕上显示。

测试数据

可选择我国当年的甲A或甲B联赛的数据输入,并检查与报章公布的数据是否一致。

实现提示

定义一个球队类,每个球队是均是此类的对象。

由于联赛中参赛的队伍数是固定的,因此可用对象数组来实现(当然也可以用链表结构)。

每输入两个队的比赛成绩,则相应的队的有关数据(比赛场数,赢的场数,平的场数,负的场数,进球数,失球数,积分等)即可进行修改,比赛成绩录入完成,调用联赛排序方法(对象数组作为参数)排出名次并输出。

二、方案设计与论证

井字过三关(棋盘游戏)

这是一道人工智能的题目,关键是找出电脑的思维。

而电脑的思维必是一个算法。

本题用的是极大极小算法。

当玩家或者是电脑准备取胜明显看出有两个棋子连在一起而另外还有一个地方可填棋时,而极大减去极小趋于(正或者负)无穷,游戏结束。

而我们处理本题的关键是找出还没取胜时候,电脑的走棋的思维,就是极大减去极小的返回数值的最小值,电脑总是走在(极大减去极小取得最小)的时候走棋。

还有要注意的一点,正是因为电脑有思维,电脑能赢就赢,同时也要干扰玩家赢力求和局。

极大值:

处理棋盘,将棋盘全部空白的棋位都填入和玩家要填入的符号“*”,计算横、竖、对角线的三子成线的个数。

极小值:

电脑处理棋盘,将棋盘全部空白的棋位都填入和电脑要填入的符号“@”,计算横、竖、对角线的三子成线的个数。

极大减去极小:

每个空格都是电脑思维的一种可能,而当极大减去极小的返回值取得最小的时候,就是电脑下棋的走法。

在做该题的时候遇到诸多问题:

1.极大极小值的计算。

例如:

被玩家处理后的棋盘,空白位置都填上了“*”,如何将其取出并恢复棋盘的状态。

解决方法:

用另外一个二维数组,将棋盘的对弈状态复制过去,在复制的棋盘上处理计算极大极小值,就不会破坏正在下棋盘的。

2.如何找出极大极小值之差的最小值:

相当于打擂台的算法,;两两搏击,胜利的留下在此题胜利的是最小的极大减去极小返回值。

解决方法:

找到第一个极大减去极小的数值,将其视为最小,依次和后面的比较。

全部比较完之后,记录下当极大减去极小值最小的位置的横纵坐标,便于电脑填入。

3.回合数的控制。

某一方胜利的时候,游戏结束,终止程序。

(不需要玩家或者电脑再继续填)。

解决方法:

用到goto语句。

足球联赛

问题分析:

为了实现足球联赛积分,首先要定义一个球队类和对象数组,每个球队均是球队类的对象。

由于联赛中参赛的队伍数是固定的,因此将每个球队存放在对象数组的一个数组元素中。

每输入两个对的比赛成绩,则相应的队的有关数据(补赛场数,赢的场数,平的场数,负的场数,进球数,失球数,积分等),即可进行修改,比赛成绩录入完成,调用联赛排序方法(对象数组作为参数,积分为排列元素)排除名次并输出。

结构分析:

在Team球队类中,设置一个外部接口,对比赛的进球数,失球数,净胜球数,赢球、输球、平局,积分先进行初始化设为0。

存放类的相应函数,在类外再分别实现相应的函数。

其中goaling类是实现比赛队伍本身的进球、失球、净胜球的信息;而在类matching中,实现的是两个不同的比赛队伍之间的比赛成绩。

通过a与b的大小来对win、score、lost和equal进行相应的运算。

这两个类均使用了this指针来保存这些值。

Match类中用户输入主队和客队的名字并调用goaling、matching函数。

Setname、getS、getPG函数是返回队伍的名字、积分和净胜球数,getteamlist的作用是文件以二进制的方法储存在D盘,并可读和写。

实现流程分析:

创建一个Team球队类,该类中具有进球数、失球数、净胜球数、赢球、输球、平局和积分的数据成员。

在该类中定义成员函数实现相关信息的输出,函数的原型声明放在类的定义中,用构造函数初始化每个成员,显示信息函数要求将对象中的完整信息打印出来。

三、程序框图或流程图,程序清单与调用关系

井字过三关(棋盘游戏)

图1:

井字过三关的各个函数调用关系

足球联赛

图2:

足球联赛各个函数之间的关系

四、全部源程序清单

井字过三关(棋盘游戏)

_Chess.h文件:

class_Chess

charchessmat[3][3];

public:

_Chess;

virtual~_Chess;

public:

voidprintchess;//游戏界面。

voidinitchess;//初始化。

voidplayerputinchess;//玩家走棋。

voidcomputerputinchess;//电脑走棋。

intchessPcomputer;//电脑的极小值。

intchessPme;//玩家的极大值。

intchessP;//极大值-极小值。

voidchoosewhofirst;//选择谁先下。

intcomputerwinOrlost;//取胜位置。

intJudgePlayerWinPosition;//判断玩家胜利的情况。

;

_Chess.cpp文件:

#include"_Chess.h"

#include

usingnamespacestd;

_Chess:

:

_Chess

_Chess:

:

~_Chess

void_Chess:

:

choosewhofirst

inti;

cout"请输入哪方先下?

电脑为0,人为1\n";

cini;

ifi0

forintj1;j4;j++

computerputinchess;

playerputinchess;

computerputinchess;

cout"游戏结束。

\n";

else

forintj1;j4;j++

playerputinchess;

computerputinchess;

playerputinchess;

cout"游戏结束。

\n";

void_Chess:

:

playerputinchess//玩家走棋。

inti,j;

cout"轮到玩家下棋,请输入要填入的行与列:

\n";

cinij;

whilechessmat[i][j]!

''

cout"错误,请重新输入:

";

cinij;

chessmat[i][j]'*';

printchess;

ifJudgePlayerWinPosition1exit1;

void_Chess:

:

computerputinchess//电脑走棋。

电脑总是走min情况下的走法,干扰玩家的取胜。

intmin,i,x,y,a,b,flag;

flag0;

intj0;

jcomputerwinOrlost;

ifj1

exit1;

ifj2

gotoL;

fori0;i2;i++//电脑思考过程,就是找出最佳位置。

forintj0;j2;j++

ifchessmat[i][j]''&&flag0//假设依次在空白的位置上走棋。

chessmat[i][j]'@';

achessP;//第一个产生。

mina;xi;yj;//记第一个为最小。

记下位置。

chessmat[i][j]'';//去处假设。

恢复玩家下完的棋盘状态。

flag1;

ifchessmat[i][j]''&&flag1//不是第一个空的位置。

chessmat[i][j]'@';

bchessP;//后一个产生。

ifba//如果后一个比前一个小的话,记下chessmat[][]的位置。

xi;yj;//记下位置。

minb;//记下b为最小;

ab;//b为min又是下一个比较的对象。

chessmat[i][j]'';//去处假设。

恢复玩家下完的棋盘状态

cout"\n电脑思考中它的选择为:

\n";

whilechessmat[x][y]''&&min//当静态估值为最小的时候,电脑才会下该步棋

chessmat[x][y]'@';

break;

L:

;

printchess;//输出电脑走棋后的棋盘状态。

cout"电脑已走棋:

\n";

int_Chess:

:

computerwinOrlost//无论是电脑的取胜位置还是玩家的取胜位置,只要见到我方差一步赢就赢,对方差一步就赶紧堵上。

ifchessmat[0][0]'@'&&chessmat[0][1]'@'&&chessmat[0][2]''chessmat[0][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][0]'@'&&chessmat[0][2]'@'&&chessmat[0][1]''chessmat[0][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][1]'@'&&chessmat[0][2]'@'&&chessmat[0][0]''chessmat[0][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][0]'@'&&chessmat[1][1]'@'&&chessmat[1][2]''chessmat[1][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][0]'@'&&chessmat[1][2]'@'&&chessmat[1][1]''chessmat[1][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][1]'@'&&chessmat[1][2]'@'&&chessmat[1][0]''chessmat[1][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[2][0]'@'&&chessmat[2][1]'@'&&chessmat[2][2]''chessmat[2][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[2][0]'@'&&chessmat[2][2]'@'&&chessmat[2][1]''chessmat[2][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[2][1]'@'&&chessmat[2][2]'@'&&chessmat[2][0]''chessmat[2][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][0]'@'&&chessmat[1][0]'@'&&chessmat[2][0]''chessmat[2][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][0]'@'&&chessmat[2][0]'@'&&chessmat[1][0]''chessmat[1][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][0]'@'&&chessmat[2][0]'@'&&chessmat[0][0]''chessmat[0][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][1]'@'&&chessmat[1][1]'@'&&chessmat[2][1]''chessmat[2][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][1]'@'&&chessmat[2][1]'@'&&chessmat[1][1]''chessmat[1][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][1]'@'&&chessmat[2][1]'@'&&chessmat[0][1]''chessmat[0][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][2]'@'&&chessmat[1][2]'@'&&chessmat[2][2]''chessmat[2][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][2]'@'&&chessmat[2][2]'@'&&chessmat[1][2]''chessmat[1][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][2]'@'&&chessmat[2][2]'@'&&chessmat[0][2]''chessmat[0][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][0]'@'&&chessmat[1][1]'@'&&chessmat[2][2]''chessmat[2][2]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][0]'@'&&chessmat[2][2]'@'&&chessmat[1][1]''chessmat[1][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][1]'@'&&chessmat[2][2]'@'&&chessmat[0][0]''chessmat[0][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][2]'@'&&chessmat[1][1]'@'&&chessmat[2][0]''chessmat[2][0]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[0][2]'@'&&chessmat[2][0]'@'&&chessmat[1][1]''chessmat[1][1]'@';printchess;cout"电脑赢了!

\n";return1;

ifchessmat[1][1]'@'&&chessmat[2][0]'@'&&chessmat[0][2]''chessmat[0][2]'@';printchess;cout"电脑赢了!

\n";return1;

//不赢也尽量阻止玩家的取胜位置。

ifchessmat[0][0]'*'&&chessmat[0][1]'*'&&chessmat[0][2]''chessmat[0][2]'@';return2;

ifchessmat[0][0]'*'&&chessmat[0][2]'*'&&chessmat[0][1]''chessmat[0][1]'@';return2;

ifchessmat[0][1]'*'&&chessmat[0][2]'*'&&chessmat[0][0]''chessmat[0][0]'@';return2;

ifchessmat[1][0]'*'&&chessmat[1][1]'*'&&chessmat[1][2]''chessmat[1][2]'@';return2;

ifchessmat[1][0]'*'&&chessmat[1][2]'*'&&chessmat[1][1]''chessmat[1][1]'@';return2;

ifchessmat[1][1]'*'&&chessmat[1][2]'*'&&chessmat[1][0]''chessmat[1][0]'@';return2;

ifchessmat[2][0]'*'&&chessmat[2][1]'*'&&chessmat[2][2]''chessmat[2][2]'@';return2;

ifchessmat[2][0]'*'&&chessmat[2][2]'*'&&chessmat[2][1]''chessmat[2][1]'@';return2;

ifchessmat[2][1]'*'&&chessmat[2][2]'*'&&chessmat[2][0]''chessmat[2][0]'@';return2;

ifchessmat[0][0]'*'&&chessmat[1][0]'*'&&chessmat[2][0]''chessmat[2][0]'@';return2;

ifchessmat[0][0]'*'&&chessmat[2][0]'*'&&chessmat[1][0]''chessmat[1][0]'@';return2;

ifchessmat[1][0]'*'&&chessmat[2][0]'*'&&chessmat[0][0]''chessmat[0][0]'@';return2;

ifchessmat[0][1]'*'&&chessmat[1][1]'*'&&chessmat[2][1]''chessmat[2][1]'@';return2;

ifchessmat[0][1]'*'&&chessmat[2][1]'*'&&chessmat[1][1]''chessmat[1][1]'@';return2;

ifchessmat[1][1]'*'&&chessmat[2][1]'*'&&chessmat[0][1]''chessmat[0][1]'@';return2;

ifchessmat[0][2]'*'&&chessmat[1][2]'*'&&chessmat[2][2]''chessmat[2][2]'@';return2;

ifchessmat[0][2]'*'&&chessmat[2][2]'*'&&chessmat[1][2]''chessmat[1][2]'@';return2;

ifchessmat[1][2]'*'&&chessmat[2][2]'*'&&chessmat[0][2]''chessmat[0][2]'@';return2;

ifchessmat[0][0]'*'&&chessmat[1][1]'*'&&chessmat[2][2]''chessmat[2][2]'@';return2;

ifchessmat[0][0]'*'&&chessmat[2][2]'*'&&chessmat[1][1]''chessmat[1][1]'@';return2;

ifchessmat[1][1]'*'&&chessmat[2][2]'*'&&chessmat[0][0]''chessmat[0][0]'@';return2;

ifchessmat[0][2]'*'&&chessmat[1][1]'*'&&chessmat[2][0]''chessmat[2][0]'@';return2;

ifchessmat[0][2]'*'&&chessmat[2][0]'*'&&chessmat[1][1]''chessmat[1][1]'@';return2;

ifchessmat[1][1]'*'&&chessmat[2][0]'*'&&chessmat[0][2]''chessmat[0][2]'@';return2;

int_Chess:

:

chessP//极大值-极小值。

intm,n,a;

mchessPme;

nchessPcomputer;

am-n;

returna;

int_Chess:

:

chessPcomputer//求电脑的极小值。

intm0;//用于计算路数。

即行列对角线全部""变成“*”时候,有多少种情况。

力求最大。

intt,k;

charflag[3][3];//用另外一个数组来统计玩家的极大值。

fort0;t2;t++

fork0;k2;k++

flag[t][k]chessmat[t][k];//该数组是用来测试求m。

不会破坏游戏。

fort0;t2;t++

fork0;k2;k++

ifflag[t][k]''flag[t][k]'@';

ifflag[0][0]flag[0][1]&&flag[0][1]flag[0][2]m++;

ifflag[1][0]flag[1][1]&&flag[1][1]flag[1][2]m++;

ifflag[2][0]flag[2][1]&&flag[2][1]flag[2][2]m++;

ifflag[0][0]flag[1][0]&&flag[1][0]flag[2][0]m++;

ifflag[0][1]flag[1][1]&&flag[1][1]flag[2][1]m++;

ifflag[0][2]flag[1][2]&&flag[1][2]flag[2][2]m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1