資源簡介
這是一個用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?????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算法
評論
共有 條評論