资源简介
这是一个用C编写的一字棋游戏程序,用到了α-β剪枝算法,其用法相当独特,跟极大极小结合在一起,另外程序还可输出走棋步数和分析的棋局数。程序附有详细的注释,ppt和实验报告,有利于参考学习!
代码片段和文件信息
#include
#include
#include
#define MAX_CHILD_NODES 9
//代表棋盘上位置情况,空、X、O三种情况
#define EMPTY 0
#define X_Player 1
#define O_Player 2
//最终的结果
#define MAX_INFINITY 1 //玩家胜利
#define DRAW 0 //平局
#define MIN_INFINITY -1 //玩家输了
int boards_checked; //用于记录电脑分析棋局数目
int model; //模式选择
/*键盘上获取输入要输入的位置用一个32位的值表示整个棋局,因为棋局有三种状态,所以用两位来表示,00表示空,01表示“X”,10表示“O”。这样左边的14位
不用,只用右边的18位,这样使得算法的效率会比较高*/
int getCell( int cell unsigned int board )
{
return ((board >> (cell*2)) & 0x3);//*2是因为用两位表示一种状态,与16进制的3进行“与运算”是为了保留下来最末尾的两位
}
//按键盘输入要求,取得输出位置
void putCell( int player int cell unsigned int *board )
{
cell=*board |= (player << (cell*2)); //复位操作,即找到刚才的输入位置,因为在getcell函数中已经更改了位置
}
//设置输出标志,玩家输出为“X”,电脑输出为“O”,否则为空
char convert( int contents )
{
if (contents == X_Player) return ‘X‘;
else if (contents == O_Player) return ‘O‘;
return ‘ ‘;
}
//设置棋盘
void emitBoard( unsigned int board )
{
printf(“\n棋盘对应的标号为:\n“);
printf( “ 0 | 1 | 2\n“);
printf( “ ---------\n“);
printf( “ 3 | 4 | 5\n“);
printf( “ ---------\n“);
printf( “ 6 | 7 | 8\n“);
printf(“\n“);
printf(“\n“);
printf(“\n“);
printf(“ %c | %c | %c \n“
convert(getCell(0board))
convert(getCell(1board))
convert(getCell(2board)) ); //记录棋盘中对应的标号位置
printf(“-----------\n“);
printf(“ %c | %c | %c \n“
convert(getCell(3board))
convert(getCell(4board))
convert(getCell(5board)) );
printf(“-----------\n“);
printf(“ %c | %c | %c \n\n“
convert(getCell(6board))
convert(getCell(7board))
convert(getCell(8board)) );
}
//玩家走棋
void getHumanMove( unsigned int *board )
{
char a[5]; //存放玩家输入的字符
int selection;
while (1)
{
loop:printf(“您要走哪一步,请输入数字(0-8): “);
scanf(“%s“ a);
if(a[0]>=‘0‘&&a[0]<‘9‘&&a[1]==0) //输入判断,只有当输入正确时,才会赋值给selection
{
selection=(int)a[0]-48; //字符转成数字
}
else
{
printf(“\n输入错误,请输入0-8之间的数字!\n\n“); //输入错误,重新输入
goto loop;
}
printf(“\n“);
if (getCell(selection *board) == EMPTY) break; //位置为空,跳出循环
printf(“此位置已有棋子,请重新输入!\n\n“); //位置不空时,说明此位置已有棋子,重新输入信息
}
putCell( X_Player selection board ); //在相应位置输出玩家所走棋子“X”
}
//定义一个结构体,用于记录棋盘棋子位置情况,不用结构体,直接用二维数组进行判断也可以实现相同的效果
#define MAX_TESTS 8
typedef struct {
unsigned char test[3];
} test_t;
const test_t tests[MAX_TESTS]={
{{ 8 7 6 }} {{ 5 4 3 }}
{{ 2 1 0 }} {{ 8 5 2 }}
{{ 7 4 1 }} {{ 6 3 0 }}
{{ 6 4 2 }} {{ 8 4 0 }} };
//判断输赢的函数
int checkPlayerWin( int player unsigned int cur_board )
{
int i;
for (i = 0 ; i < MAX_TESTS ; i++) {
if ((getCell(tests[i].test[0] cur_board) == player) &&
(getCell(tests[i].test[1] cur_board) == player) &&
(getCell(tests[i].test[2] cur_board) == player))
re
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 211385 2011-12-09 16:08 α-β剪枝实现的一字棋程序2.pptx
文件 41984 2011-12-08 20:55 Debug\vc60.idb
文件 53248 2011-12-03 19:51 Debug\vc60.pdb
文件 184392 2011-12-03 19:51 Debug\yiziqichengxu.exe
文件 511296 2011-12-03 19:51 Debug\yiziqichengxu.ilk
文件 17668 2011-12-03 19:51 Debug\yiziqichengxu.obj
文件 226184 2011-11-24 21:11 Debug\yiziqichengxu.pch
文件 467968 2011-12-03 19:51 Debug\yiziqichengxu.pdb
文件 7799 2011-11-24 21:12 yiziqichengxu.cpp
文件 3485 2011-11-19 19:48 yiziqichengxu.dsp
文件 534 2011-11-19 21:44 yiziqichengxu.dsw
文件 41984 2011-12-08 20:57 yiziqichengxu.ncb
文件 48640 2011-12-08 20:57 yiziqichengxu.opt
文件 260 2011-12-08 20:54 yiziqichengxu.plg
文件 93204 2011-12-09 16:07 一字棋实验报告.docx
目录 0 2011-12-03 19:51 Debug
----------- --------- ---------- ----- ----
1910031 16
- 上一篇:安徽大学数据结构期末考试试卷
- 下一篇:用FPGA实现1024点FFT算法
评论
共有 条评论