黑白棋程序设计实验报告C++版
- 格式:doc
- 大小:230.00 KB
- 文档页数:24
基于C语言的黑白棋游戏设计黑白棋,也被称为翻转棋,在全球范围内广受欢迎。
它的玩法简单而富有挑战性,因此在计算机科学领域中,基于C语言的黑白棋游戏设计成为了一个常见的项目。
本文将详细介绍如何使用C语言设计一个功能完善的黑白棋游戏。
一、游戏规则黑白棋的规则很简单,游戏双方通过轮流下棋,在棋盘上放置自己颜色的棋子。
当一个棋子被夹在两个对方的棋子之间时,这个棋子就会被翻转成对方的颜色。
游戏继续进行,直到棋盘被填满或者双方都无法再下棋为止。
最后,棋盘上棋子数量较多的一方获胜。
二、程序设计1. 游戏界面设计在设计游戏界面时,我们可以使用C语言提供的字符画功能。
通过绘制合适大小的方格和棋子标识符,可以在控制台上模拟出一个棋盘。
同时,使用特殊字符来绘制提示信息和菜单栏,可以增强游戏的可玩性和视觉效果。
2. 数据结构设计为了表示棋盘和棋子的状态,我们需要设计相应的数据结构。
一个简单而有效的方法是使用二维数组来表示棋盘。
每个数组元素的值可以用来表示该位置的状态,比如1表示黑棋、2表示白棋、0表示空位。
这样,可以通过对数组的操作来实现棋子的落子和翻转。
3. 游戏逻辑设计黑白棋的游戏逻辑涉及到棋子落子、翻转以及胜负的判断。
在程序设计中,我们需要编写相应的函数来处理这些逻辑。
比如,可以编写一个函数来检查某一位置是否可以落子,以及另一个函数来实现棋子翻转的操作。
4. 用户交互设计为了使游戏更加友好和可操作性强,我们可以设计一些用户交互功能。
比如,在每次轮到玩家下棋时,程序可以提示玩家输入坐标来落子。
同时,我们可以设计一些额外的功能,比如悔棋、重新开始等,以提升游戏的易用性。
三、程序实现下面是一个简单的基于C语言的黑白棋游戏设计的示例代码:```c#include<stdio.h>#define SIZE 8void initializeBoard(int board[SIZE][SIZE]) {// 初始化棋盘}void printBoard(int board[SIZE][SIZE]) {// 绘制棋盘}int isLegalMove(int board[SIZE][SIZE], int row, int col) {// 检查是否可以落子}void makeMove(int board[SIZE][SIZE], int row, int col, int player) { // 落子}void flipPieces(int board[SIZE][SIZE], int row, int col, int player) { // 翻转棋子}int hasValidMove(int board[SIZE][SIZE], int player) {// 检查是否有可行的落子点}int countPieces(int board[SIZE][SIZE], int player) {// 统计棋盘上的棋子数量}int main() {int board[SIZE][SIZE];int currentPlayer = 1; // 1代表黑子,2代表白子initializeBoard(board);while (hasValidMove(board, currentPlayer)) {printBoard(board);int row, col;printf("Player %d's turn, please enter row and column: ", currentPlayer);scanf("%d %d", &row, &col);if (isLegalMove(board, row, col)) {makeMove(board, row, col, currentPlayer);flipPieces(board, row, col, currentPlayer);currentPlayer = (currentPlayer == 1) ? 2 : 1;} else {printf("Invalid move!\n");}}int blackCount = countPieces(board, 1);int whiteCount = countPieces(board, 2);printf("Game over! ");if (blackCount > whiteCount) {printf("Player 1 wins!\n");} else if (blackCount < whiteCount) {printf("Player 2 wins!\n");} else {printf("It's a draw!\n");}return 0;}```四、总结通过使用C语言,我们可以轻松地设计和实现一个黑白棋游戏程序。
c 课程设计黑白棋摘要一、教学目标本节课的教学目标是让学生掌握黑白棋的基本规则和技巧,能够进行简单的对战游戏。
知识目标包括了解黑白棋的历史背景、规则和策略,技能目标包括能够熟练操作棋子进行游戏,情感态度价值观目标包括培养学生的团队合作意识、耐心和思考能力。
二、教学内容本节课的教学内容主要包括黑白棋的基本规则、棋子的操作方法和游戏策略。
教学大纲如下:1.黑白棋的历史背景和规则介绍2.棋子的操作方法:如何走棋、吃子、保护棋子等3.游戏策略:如何布局、进攻、防守等三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:教师通过讲解黑白棋的基本规则和策略,让学生了解游戏的基本知识。
2.讨论法:学生分组讨论棋子的操作方法和游戏策略,促进学生之间的交流和合作。
3.案例分析法:教师展示一些经典的黑白棋对战案例,让学生分析双方的策略和胜负原因。
4.实验法:学生进行实际的棋局对战,通过实践提高自己的游戏技巧。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源:1.教材:提供黑白棋的规则和策略介绍,供学生参考。
2.参考书:提供一些关于黑白棋的进阶知识,供学生拓展学习。
3.多媒体资料:通过视频或图片展示黑白棋的历史背景和经典对战案例。
4.实验设备:提供足够的棋子和棋盘,让学生进行实际的棋局对战。
五、教学评估本节课的教学评估将采用多种方式,以全面、客观、公正地评价学生的学习成果。
评估方式包括平时表现、作业和考试等。
1.平时表现:通过观察学生在课堂上的参与度、提问回答和小组讨论的表现来评估学生的学习态度和理解程度。
2.作业:布置相关的黑白棋练习题,要求学生在课后完成,通过作业的完成质量来评估学生的掌握程度。
3.考试:安排一次黑白棋的对战考试,通过学生的游戏表现和策略运用来评估其综合运用能力。
六、教学安排本节课的教学安排将根据学生的实际情况和教学任务进行合理规划。
黑白棋c 课程设计一、教学目标本课程旨在通过黑白棋(C)的教学,让学生掌握黑白棋的基本规则和策略,提高学生的逻辑思维能力和决策能力。
具体的教学目标如下:知识目标:学生能够理解黑白棋的起源、基本规则和常用策略。
技能目标:学生能够独立完成黑白棋的设置和游戏,掌握基本的对弈技巧和策略。
情感态度价值观目标:学生能够培养团队合作精神,学会尊重对手,增强自信心和抗挫能力。
二、教学内容本课程的教学内容主要包括黑白棋的基本规则、棋子的走法、游戏的设置和策略等。
具体的教学内容如下:1.黑白棋的起源和发展:介绍黑白棋的历史背景和发展过程。
2.黑白棋的基本规则:讲解棋盘的布局、棋子的颜色和初始位置,以及如何进行合法的走法。
3.棋子的走法:教授不同棋子的走法,包括王、后、象、马、车等。
4.游戏的设置:讲解如何设置棋盘和初始布局,以及如何进行合法的走法。
5.常用策略:介绍基本的黑白棋策略,如包围、阻断、防守等。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:通过讲解黑白棋的基本规则、棋子的走法和常用策略,使学生掌握相关知识。
2.讨论法:学生进行小组讨论,分享彼此的黑白棋经验和策略,提高学生的思考和沟通能力。
3.案例分析法:分析经典的黑白棋对局,让学生学会分析局势和制定策略。
4.实验法:让学生亲自动手进行黑白棋游戏,培养学生的实际操作能力和决策能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选用权威、实用的黑白棋教材,为学生提供系统的学习材料。
2.参考书:提供相关的黑白棋参考书籍,供学生课后拓展阅读。
3.多媒体资料:制作精美的PPT和教学视频,帮助学生更好地理解和掌握黑白棋知识。
4.实验设备:提供足够的黑白棋棋盘和棋子,让学生进行实际操作和练习。
五、教学评估本课程的评估方式将包括平时表现、作业和考试等,以全面、客观地评价学生的学习成果。
第一章绪论1.1 C语言概述C语言是国际上广泛流行且很有发展前途的计算机高级语言,不仅用来编写应用软件,也用来编写系统软件。
C语言功能丰富,使用灵活,可移植性好,深受广大用户欢迎。
C语言的数据类型丰富,既具有高级程序设计语言的优点,又具有低级程序设计语言的特点;既可以用来编写系统程序,又可以用来编写应用程序。
(例如,著名的UNIX操作系统就是用C语言编写的)因此,C语言正在被迅速地推广和普及。
1 .2 C语言出现的历史背景在C语言诞生以前,操作系统及其他系统软件主要是用汇编语言实现的。
由于汇编语言程序设计依赖于计算机硬件,其可读性和可移植性都很差,而一般的高级语言又难以实现对计算机硬件的直接操作,因此人们需要一种兼有汇编语言和高级语言特性的语言。
C语言就是在这种环境下产生的。
它最早是由Dennis Richie于1973年设计并实现。
它的产生同UNIX系统之间具有非常密切的联系——C语言是在UNIX系统上开发的。
而无论UNIX 系统本身还是其上运行的大部分程序,都是用C语言编写实现。
同时,它同样适合于编写不同领域中的大多数程序。
C语言已经成为全球程序员的公共语言,并且由此产生了当前两个主流的语言C++和Java——它们都建立在C语言的语法和基本结构的基础上,而且现在世界上的许多软件都是在C语言及其衍生的各种语言的基础上开发而成。
目前,在微机上广泛使用的C语言编译系统有Turbo C、Borland C++、Microsoft Visual C++等。
虽然它们的基本部分都是相同的,但还是有一些差异,本程序的设计采用Turbo C作为上机编程调试环境。
C语言特点和用途①语言简洁、紧凑,使用方便、灵活。
共有32个关键字,9种控制语句。
②运算符丰富,公有34种运算符。
③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。
④具有结构化的控制语句(如if…else、while、do…while、switch、for)⑤语法限制不太严格,程序设计自由度大。
c语言课程设计黑白棋一、教学目标本课程的目标是让学生掌握C语言编程的基本技能,通过实现一个黑白棋游戏项目,培养学生的编程思维和实际操作能力。
具体目标如下:1.知识目标:学生能熟练使用C语言进行编程,理解基本的编程概念,如变量、数据类型、运算符、控制结构等。
2.技能目标:学生能运用C语言实现简单的逻辑控制和函数调用,具备一定的算法分析能力,能独立完成黑白棋游戏的设计与实现。
3.情感态度价值观目标:培养学生对编程的兴趣和热情,提高学生的问题解决能力,培养学生的团队合作意识和创新精神。
二、教学内容教学内容以C语言的基本概念和编程技巧为主线,结合黑白棋游戏的设计与实现,具体安排如下:1.C语言基本概念:介绍C语言的语法规则、数据类型、运算符、控制结构等基本知识。
2.函数和数组:讲解函数的定义和调用、数组的使用和操作,以及函数指针的概念。
3.黑白棋游戏设计:引导学生分析游戏需求,设计游戏界面和逻辑,实现游戏的基本功能。
4.算法分析和优化:引导学生运用算法分析游戏中的问题,如棋子的移动规则、胜负判断等,并进行优化。
5.团队合作与创新:培养学生进行团队合作,共同完成游戏项目,鼓励学生发挥创新精神,为游戏添加更多功能和玩法。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,具体安排如下:1.讲授法:讲解C语言的基本概念和编程技巧,为学生提供系统的知识体系。
2.讨论法:学生进行团队讨论,分析游戏需求,设计游戏方案,培养学生的团队合作能力。
3.案例分析法:通过分析典型的黑白棋游戏案例,引导学生掌握游戏设计的要点和技巧。
4.实验法:学生动手编写代码,实现游戏功能,培养学生的实际操作能力和编程思维。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备等,具体安排如下:1.教材:选用《C程序设计原理与应用》作为主讲教材,为学生提供系统的知识学习。
2.参考书:推荐《C语言程序设计》等辅助教材,供学生拓展阅读和自学。
一、实验背景黑白棋,又称五子棋、连珠棋等,是一种两人对弈的策略型棋类游戏。
本实验旨在通过编程实现黑白棋游戏,并运用人工智能算法优化游戏策略,提高游戏水平。
二、实验目的1. 理解黑白棋游戏规则及基本策略。
2. 掌握人工智能在黑白棋游戏中的应用。
3. 通过优化算法,提高黑白棋游戏水平。
三、实验内容1. 黑白棋游戏规则黑白棋游戏规则如下:(1)棋盘为15×15的网格,每个网格可以放置一枚棋子。
(2)黑方先手,双方轮流在空白网格放置棋子,黑色棋子为“黑”,白色棋子为“白”。
(3)当任意一方在水平、竖直或两个对角线上形成连续的五个棋子时,该方获胜。
2. 人工智能算法本实验采用Minimax(最小-最大)算法进行人工智能策略优化。
Minimax算法是一种决策树搜索算法,用于解决二人零和博弈问题。
在黑白棋游戏中,Minimax算法通过模拟对手的走法,寻找最优的落子策略。
3. 优化算法为了提高游戏水平,我们对Minimax算法进行了以下优化:(1)棋子权重:将棋盘上的棋子按照位置赋予不同的权重,以反映棋子的重要程度。
例如,棋盘中心的棋子权重高于边缘棋子。
(2)22点权重:在棋盘的四个角落,我们赋予额外的权重,以鼓励在角落放置棋子。
(3)边线权重:棋盘边缘的棋子权重高于中间棋子,以反映棋子贴边的重要性。
(4)顶角权重:棋盘四个顶角的棋子权重最高,以鼓励在顶角放置棋子。
四、实验结果与分析1. 游戏效果通过优化后的Minimax算法,我们的黑白棋游戏水平得到了显著提高。
在与对手的对弈中,我们能够更好地判断棋局走势,制定合理的落子策略。
2. 优化效果分析(1)棋子权重:通过对棋子权重的优化,我们能够更好地把握棋局走势,避免在棋局后期陷入被动。
(2)22点权重:在棋局初期,我们倾向于在22点位置放置棋子,以占据有利地形。
(3)边线权重:在棋局中后期,我们注重在棋盘边缘放置棋子,以扩大棋局范围。
(4)顶角权重:在棋局的关键时刻,我们会在顶角位置放置棋子,以形成优势。
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==黑白棋实验报告篇一:黑白棋程序设计实验报告C++版海南大学课程论文课程名称:数据结构课程设计题目名称:黑白棋姓名:学号:评阅教师:201X年 12月 17 日目录一、黑白棋简介 (2)二、程序设计思路及实现界面图 (3)三、程序设计算法性能分析 (6)四、实验总结 (6)五、实验代码 (7)一、黑白棋简介黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。
黑白棋的棋子和围棋类似。
但它的下法与围棋的很不相同。
黑白棋是由黑方和白方两人进行的益智游戏。
棋盘为N×N方格,黑白棋总共使用N个棋子,每个棋子分正反两面,分别是黑色和白色。
轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。
下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。
当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。
2二、程序设计思路及游戏实现界面1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数5、设置棋子的稳定性(计算得分的依据),空白处除外6、评价棋手得分游戏开始选择类型和棋子:打印棋盘棋手开始下棋输入下棋的位置:游戏结束,统计棋数并分出胜负:篇二:C语言-黑白棋实验报告福建工程学院计算机与信息科学系实验报告12345篇三:黑白棋课程设计报告惠州经济职业技术学院计算机专业课程设计报告课题名称:关于黑白棋游戏的设计专业:班级:组长: XXX小组成员:二O一O年十二月摘要中国最早出现黑白棋是在80年代的任天堂游戏机和苹果II个人电脑游戏里,但从那时一直玩到现在的人已经寥寥可数了,我们只能说,从那时起,中国第一次出现了黑白棋;然后就是1990年的Windows 3.0的推出,当时Windows自带的游戏就是黑白棋,由于当时电脑还比较少,没等到黑白棋传开,Windows 3.1推出,把自带游戏换成现在大家见到的踩地雷和接龙;让大量人认识黑白棋的是文曲星,文曲星的黑白棋棋力很低,一个人下了几盘以后就可以轻易把它打败,棋力之低简直可以说是误人子弟的地步,让人一叶障目,不见森林,以为黑白棋不过尔尔;在90年代中期流行的任天堂Gameboy当中也有一款黑白棋游戏,棋力甚为不错,比起以上提及的游戏强很多。
c语言黑白棋程序设计文档本文将为您介绍一份经过精心设计的基于C语言的黑白棋程序设计文档。
这个文档旨在为开发者提供一个清晰易懂、易于扩展的代码框架,以便更好地完成黑白棋游戏。
以下是本文档的结构和内容:一、简介黑白棋是一款二人对弈的棋类游戏,在8x8的方格棋盘上进行。
本程序的目标是实现一个基本的黑白棋人机对战游戏。
玩家可以使用键盘来操作棋子落下的位置,程序会根据规则自动判断是否可以落子,并自动翻转另一方的棋子。
程序还可以提供简单的AI进行游戏,让玩家可以对战电脑。
本程序使用了C语言进行编写,并且采用简单易懂的函数式编程方法,使得程序更加易于维护和扩展。
二、程序设计在程序设计中,我们遵循了模块化、封装和数据隐藏的原则,使得代码结构更加清晰明了,易于理解和维护。
主要分为5个模块:负责程序的初始化工作,包括初始化棋盘、初始化玩家、初始化AI等等。
在main函数中,我们通过调用下面四个模块的函数来构建整个游戏的逻辑流程。
2. chessboard模块负责棋盘的初始化、显示、落子、判断是否合法等逻辑处理。
该模块中定义了结构体变量用于存储棋盘信息。
在该模块中定义了落子的函数check(),该函数根据当前棋子的位置、颜色和棋盘状态进行判断,如果可以落子,则将当前棋子位置上色,并调用翻转棋子的函数reverse(),否则提示玩家重新输入坐标。
3. player模块负责玩家的初始化、操作、胜负判断等逻辑处理。
在该模块中定义了结构体变量用于存储玩家信息。
该模块中定义了getinput()函数,该函数根据玩家从键盘输入的信息获取当前落子的位置。
4. AI模块负责人工智能的实现,其中包括随机落子AI、进攻型AI、防守型AI 等。
在该模块中定义了结构体变量用于存储AI信息。
AI的实现方式采用了启发式搜索,寻找最优解。
同时,AI还要判断当前落子位置是否合法,如果不合法则重新进行随机落子。
负责一些通用函数的实现,如计算得分、判断胜负等等。
海南大学课程论文课程名称:数据结构课程设计题目名称:黑白棋学院:信息学院专业班级:姓名:学号:评阅教师:2011年12月17 日目录一、黑白棋简介 (2)二、程序设计思路及实现界面图 (3)三、程序设计算法性能分析 (6)四、实验总结 (6)五、实验代码 (7)一、黑白棋简介黑白棋,又叫反棋(Reversi)、奥赛罗棋(Othello),苹果棋,翻转棋。
黑白棋的棋子和围棋类似。
但它的下法与围棋的很不相同。
黑白棋是由黑方和白方两人进行的益智游戏。
棋盘为N×N方格,黑白棋总共使用N2个棋子,每个棋子分正反两面,分别是黑色和白色。
轮到一方下棋时,必须把棋下在与对方棋子相邻的空位上,要求所下的棋子和原有的已方棋子夹住对方的至少一个棋子(横竖斜夹均可),然后把被夹住的子变成己方的颜色(也叫吃子)。
下棋过程中,任何棋子既不会从棋盘上拿走,也不会从一个格子移到另一个格子,吃子时,不会发生连锁反应,吃进的棋子不能再夹吃其他的子。
当双方都无棋可下,或者方格全部占满后,棋局结束,子多的一方为胜方。
二、程序设计思路及游戏实现界面1、设计初始化棋盘函数2、复制棋盘函数3、显示棋盘函数4、选择下棋类型4、计算可落子的位置个数,及该位置落子后翻过的棋子的个数5、设置棋子的稳定性(计算得分的依据),空白处除外6、评价棋手得分游戏开始选择类型和棋子:打印棋盘棋手开始下棋输入下棋的位置:游戏结束,统计棋数并分出胜负:一局结束后选择是否继续:三、性能分析人机对战中稳定性算法用了8层循环,所以程序的性能为O(N8)级别四、实验总结这个程序主要用来实现黑白棋的人人对战,程序中的人机对战的算法主要参考别的程序,而人人对战则相对简单所以以自己的能力就只实现了其中的人人对战部分,由于没有自学MFC,所以界面不是很友好,直接在doc环境下运行,但程序总的实现了黑白棋的基本功能,能够在doc下显示棋盘,判断棋手可下棋位置及最后判断出胜负。
五、程序代码:#include <iostream>using namespace std;int const MAX=10000;enum Color{WHITE=-1,BLANK,BLACK //是否能落子//黑子};class Choice{public:int posX;int posY;int score;};class Chessman{public:enum Color color;unsigned stable; /* 棋子的稳定性(0~8),若棋子为BLANK则表示该位置落子后可翻过的棋子个数. */}; //即下此位置后对方的棋变为自己的棋子的数目class Chessboard //棋盘{public:Chessman cell[8][8]; //定义棋盘中有8*8个格子unsigned whiteNum; //白棋数目unsigned blackNum; //黑棋数void initChessboard(Chessboard *board);void clone( Chessboard *boardDest,const Chessboard *boardSource);void view( Chessboard *board);int judge( Chessboard *board,enum Color player);int putChess( Chessboard *board,Choice *choice,enum Color player);void setStable( Chessboard *board);int evaluate(Chessboard *board,enum Color player);};void Chessboard::initChessboard(Chessboard *board) //初始化棋盘{ //声明一个Chessboard结构体board int i,j;board->whiteNum=2;board->blackNum=2;for(i=0;i<8;i++){for(j=0;j<8;j++){board->cell[i][j].color=BLANK;board->cell[i][j].stable=0;}}board->cell[3][3].color=board->cell[4][4].color=BLACK;board->cell[3][4].color=board->cell[4][3].color=WHITE;}// 复制棋盘.void Chessboard::clone( Chessboard *boardDest,const Chessboard *boardSource){int i,j;boardDest->whiteNum=boardSource->whiteNum;boardDest->blackNum=boardSource->blackNum;for(i=0;i<8;i++){for(j=0;j<8;j++){boardDest->cell[i][j].color=boardSource->cell[i][j].color;boardDest->cell[i][j].stable=boardSource->cell[i][j].stable;}}}//显示棋盘.void Chessboard::view( Chessboard *board){int i,j;cout<<"\n---";for(i=0;i<8;i++){cout<<"---"<<i+1;}cout<<"\n ────────────────\n";for(i=0;i<8;i++){cout<<i+1<<"--│";for(j=0;j<8;j++){switch(board->cell[i][j].color){case BLACK:cout<<"○│";break;case WHITE:cout<<"●│";break;case BLANK:if(board->cell[i][j].stable){cout<<" +│";}else{cout<<" │";}break;default: /* 棋子颜色错误*/cout<<"* │";}}cout<<"\n ────────────────\n";}cout<<"白棋(●)个数为:"<<board->whiteNum<<" ";cout<<"黑棋(○)个数为:"<<board->blackNum<<endl<<endl<<endl;}// 计算可落子的位置个数,及该位置落子后翻过的棋子的个数(board->cell[i][j].stable)int Chessboard::judge( Chessboard *board,enum Color player){int i,j;unsigned num=0;for(i=0;i<8;i++){for(j=0;j<8;j++){if(board->cell[i][j].color==BLANK){int x,y;board->cell[i][j].stable=0;for(x=-1;x<=1;x++){for(y=-1;y<=1;y++){if(x||y) /* 8个方向*/{int i2,j2;unsigned num2=0;for(i2=i+x,j2=j+y;i2>=0 && i2<=7 && j2>=0 && j2<=7;i2+=x,j2+=y){if(board->cell[i2][j2].color==(enum Color)-player){num2++;}else if(board->cell[i2][j2].color==player){board->cell[i][j].stable+=player*num2;break;}else if(board->cell[i2][j2].color==BLANK){break;}}}}}if(board->cell[i][j].stable){num++;}}}}return num;}//落子,翻子.int Chessboard::putChess( Chessboard *board,Choice *choice,enum Color player) {int i=choice->posX,j=choice->posY;int x,y;if(board->cell[i][j].color!=BLANK || board->cell[i][j].stable==0 || player==BLANK) {return -1;}board->cell[i][j].color=player;board->cell[i][j].stable=0;if(player==WHITE){board->whiteNum++;}else if(player==BLACK){board->blackNum++;}for(x=-1;x<=1;x++){for(y=-1;y<=1;y++){if(x||y) /* 8个方向*/{int i2,j2;unsigned num=0;for(i2=i+x,j2=j+y;i2>=0 && i2<=7 && j2>=0 && j2<=7;i2+=x,j2+=y){if(board->cell[i2][j2].color==(enum Color)-player){num++;}else if(board->cell[i2][j2].color==player){board->whiteNum+=(player*WHITE)*num;board->blackNum+=(player*BLACK)*num;for(i2-=x,j2-=y;num>0;num--,i2-=x,j2-=y){board->cell[i2][j2].color=player;board->cell[i2][j2].stable=0;}break;}else if(board->cell[i2][j2].color==BLANK){break;}}}}}return 0;}/** 设置棋子的稳定性(计算得分的依据),空白处除外.*/void Chessboard::setStable( Chessboard *board){int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){if(board->cell[i][j].color!=BLANK){int x,y;board->cell[i][j].stable=1;for(x=-1;x<=1;x++){for(y=-1;y<=1;y++){/* 4个方向*/if(x==0 && y==0){x=2;y=2;}else{int i2,j2,flag=2;for(i2=i+x,j2=j+y;i2>=0 && i2<=7 && j2>=0 && j2<=7;i2+=x,j2+=y){if(board->cell[i2][j2].color!=board->cell[i][j].color){flag--;break;}}for(i2=i-x,j2=j-y;i2>=0 && i2<=7 && j2>=0 && j2<=7;i2-=x,j2-=y){if(board->cell[i2][j2].color!=board->cell[i][j].color){flag--;break;}}if(flag) /* 在某一条线上稳定*/{board->cell[i][j].stable++;}}}}}}}}/** 评价棋手得分.*/int Chessboard::evaluate(Chessboard *board,enum Color player){int value=0;int i,j;setStable(board);for(i=0;i<8;i++){for(j=0;j<8;j++){value+=(board->cell[i][j].color)*(board->cell[i][j].stable);}}value+=64*board->cell[0][0].color;value+=64*board->cell[0][7].color;value+=64*board->cell[7][0].color;value+=64*board->cell[7][7].color;value-=32*board->cell[1][1].color;value-=32*board->cell[1][6].color;value-=32*board->cell[6][1].color;value-=32*board->cell[6][6].color;return value*player;}//考虑step步,选择最优方案.采用最大最小博弈和α-β剪裁算法Choice * maximin( Chessboard *board,enum Color player,int step,int min,int max, Choice *choice){int i,j,k,num;Choice *allChoices;choice->score=-MAX;choice->posX=-1;choice->posY=-1;num=board->judge(board,player);if(num==0) /* 无处落子*/{if(board->judge(board,(enum Color)-player)) /* 对方可以落子,让对方下.*/{Chessboard tempBoard;Choice nextChoice;Choice *pNextChoice=&nextChoice;board->clone(&tempBoard,board);pNextChoice=maximin(&tempBoard,(enumColor)-player,step-1,-max,-min,pNextChoice);choice->score=-pNextChoice->score;choice->posX=-1;choice->posY=-1;return choice;}else /* 对方也无处落子,游戏结束. */{int value=WHITE*(board->whiteNum) + BLACK*(board->blackNum);if(player*value>0){choice->score=MAX-1;}else if(player*value<0){choice->score=-MAX+1;}else{choice->score=0;}return choice;}}if(step<=0) /* 已经考虑到step步,直接返回得分*/{choice->score=board->evaluate(board,player);return choice;}allChoices=( Choice *)malloc(sizeof( Choice)*num);k=0;for(i=0;i<8;i++){for(j=0;j<8;j++){if(i==0 || i==7 || j==0 || j==7){if(board->cell[i][j].color==BLANK && board->cell[i][j].stable){allChoices[k].score=-MAX;allChoices[k].posX=i;allChoices[k].posY=j;k++;}}}}for(i=0;i<8;i++){for(j=0;j<8;j++){if((i==2 || i==5 || j==2 || j==5) && (i>=2 && i<=5 && j>=2 && j<=5)){if(board->cell[i][j].color==BLANK && board->cell[i][j].stable){allChoices[k].score=-MAX;allChoices[k].posX=i;allChoices[k].posY=j;k++;}}}}for(i=0;i<8;i++){for(j=0;j<8;j++){if((i==1 || i==6 || j==1 || j==6) && (i>=1 && i<=6 && j>=1 && j<=6)){if(board->cell[i][j].color==BLANK && board->cell[i][j].stable){allChoices[k].score=-MAX;allChoices[k].posX=i;allChoices[k].posY=j;k++;}}}}for(k=0;k<num;k++){Chessboard tempBoard;Choice thisChoice,nextChoice;Choice *pNextChoice=&nextChoice;thisChoice=allChoices[k];board->clone(&tempBoard,board);board->putChess(&tempBoard,&thisChoice,player);pNextChoice=maximin(&tempBoard,(enumColor)-player,step-1,-max,-min,pNextChoice);thisChoice.score=-pNextChoice->score;if(thisChoice.score>min && thisChoice.score<max) /* 可以预计的更优值*/{min=thisChoice.score;choice->score=thisChoice.score;choice->posX=thisChoice.posX;choice->posY=thisChoice.posY;}else if(thisChoice.score>=max) /* 好的超乎预计*/{choice->score=thisChoice.score;choice->posX=thisChoice.posX;choice->posY=thisChoice.posY;break;}/* 不如已知最优值*/}free(allChoices);return choice;}int main(void) /////////////主函数{Chessboard board;Chessboard *pBoard=&board;enum Color player=BLANK,nowPlayer=BLACK;//声明两个enum枚举变量player,nowplayer Choice choice;Choice *pChoice=&choice;int dif=-1,step=4,success=0;char restart=' ';start: /////////////////////////////////////////////player=BLANK; /////////////////////////////////////////////nowPlayer=BLACK;dif=-1;step=4;restart=' ';int b;cout<<"输入1为人人对战,否则为人机对战:";cin>>b;if(b==1){ /////////人人对战////////////while(player!=WHITE && player!=BLACK){cout<<"\n请选择执黑棋(○)(1),或执白棋(●)(-1)\t执黑棋先下:\n";scanf("%d",&player);///////////////////////////////////////////////////////////// if(player!=WHITE && player!=BLACK){cout<<"黑白设置错误.\n";}}board.initChessboard(pBoard); /////////初始化棋盘///////////while(step<64) /* 棋盘上未下满64子*/{char *nowPlayerName="";if(nowPlayer==BLACK){nowPlayerName="黑棋(○)";}else if(nowPlayer==WHITE){nowPlayerName="白棋(●)";}if(board.judge(pBoard,nowPlayer)==0){if(board.judge(pBoard,(enum Color)-nowPlayer)==0){break; /* 双方都不能落子,游戏结束*/}cout<<nowPlayerName<<"\n无子可下.\n";}else{int i,j;board.view(pBoard);if(nowPlayer==player) /* 轮到人下*/{while(1){cout<<nowPlayerName<<"请输入棋子坐标(i,j):\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.";board.view(pBoard);}else{break;}}}else //另外一个人下{while(1){cout<<nowPlayerName<<"请输入棋子坐标(i,j):\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.";board.view(pBoard);}else{break;}}}board.putChess(pBoard,pChoice,nowPlayer);step++;cout<<nowPlayerName<<"落子于坐标"<<i+1<<","<<j+1;}nowPlayer=(enum Color)-nowPlayer; /* 换对方下*/ }board.view(pBoard);success=pBoard->whiteNum - pBoard->blackNum;if(success>0){cout<<"\n白棋(●)获胜.\n";}else if(success<0){cout<<"\n黑棋(○)获胜.\n";}else{cout<<"\n平局.\n";}cout<<"\n游戏结束!\n";while(restart!='y' && restart!='n'){cout<<"再下一盘?(y,n)\n";cin>>restart;///////////////////////////////////////////////if(restart=='y'){goto start;}}}else{ ////////////人机对战///////////// while(dif<1 || dif>60) //设置难度{cout<<"请选择难度(1~60):\n";cin>>dif;if(dif<1 || dif>60){cout<<"难度设置错误.\n";}}while(player!=WHITE && player!=BLACK){cout<<"请选择执黑棋(○)(1),或执白棋(●)(-1)"<<endl;cout<<"执黑先行:";scanf("%d",&player);if(player!=WHITE && player!=BLACK){cout<<"黑白设置错误.\n";}}board.initChessboard(pBoard); /////////////////初始化棋盘while(step<64) // 棋盘上未下满64子{char *nowPlayerName="";if(nowPlayer==BLACK){nowPlayerName="黑棋(○)";}else if(nowPlayer==WHITE){nowPlayerName="白棋(●)";}if(board.judge(pBoard,nowPlayer)==0){if(board.judge(pBoard,(enum Color)-nowPlayer)==0){break; //双方都不能落子,游戏结束}cout<<nowPlayerName<<"无子可下.\n";}else{int i,j;board.view(pBoard);if(nowPlayer==player) // 轮到人下{while(1){cout<<nowPlayerName<<",请输入棋子坐标i,j:\n";cout<<"i=";cin>>i;i--;cout<<"j=";cin>>j;j--;pChoice->posX=i;pChoice->posY=j;if(i<0 || i>7 || j<0 || j>7 || pBoard->cell[i][j].color!=BLANK || pBoard->cell[i][j].stable==0){cout<<nowPlayerName<<"不能在"<<i+1<<","<<j+1<<"落子.\n";board.view(pBoard);}else{break;}}}else //* 轮到电脑下*/{cout<<nowPlayerName<<"思考中......";pChoice=maximin(pBoard,nowPlayer,dif,-MAX,MAX,pChoice);i=pChoice->posX;j=pChoice->posY;cout<<"score="<<pChoice->score<<endl;}board.putChess(pBoard,pChoice,nowPlayer);step++;cout<<nowPlayerName<<"落子于坐标"<<i+1<<","<<j+1;}nowPlayer=(enum Color)-nowPlayer; /* 换对方下*/ }board.view(pBoard);success=pBoard->whiteNum - pBoard->blackNum;if(success>0){cout<<"\n白棋(●)获胜.\n";}else if(success<0){cout<<"\n黑棋(○)获胜.\n";}else{cout<<"\n平局.\n";}cout<<"\n游戏结束!\n";while(restart!='y' && restart!='n'){cout<<"再下一盘?(y,n)\n";cin>>restart;if(restart=='y'){goto start;}}}return 0;}。