版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、井字旗C語言程序:運行環(huán)境:Turbo C/C+for Windows集成實驗與學(xué)習(xí)環(huán)境或VC+6.0#define MAX 3#define Status int#define HUMAN_WIN 0 /人取得了勝利#define DRAW 1 /平局#define PLAYING 2 /沒有決出勝負,正在進行游戲#define COMPUTER_WIN 3 /電腦取得了勝利#define HUMAN 0 /人#define COMPUTER 1 /機器#define EMPTY 2 /空#define FALSE 0 /假#define TRUE 1 /真 #include <std
2、io.h>#include "malloc.h"/記錄一步棋所需的所有信息:行數(shù),列數(shù),判斷值typedef struct int column; int row; int val;Nodes;int boardMAXMAX;/InitBoard初始化棋盤Status InitBoard() int row,column; for(row=0; row<MAX; row+) for(column=0; column<MAX; column+) boardrowcolumn=EMPTY; return TRUE;/PostionIsEmpty判斷在棋盤上在給
3、定的置是否為空Status PositionIsEmpty(int row , int column) if(boardrowcolumn=2) return TRUE; else return FALSE;/Place在指定的地方落子Status Place(int row,int column, int piece) boardrowcolumn=piece; return TRUE;/BoardIsFull判斷棋盤是否己滿Status BoardIsFull() int i=0,j=0; for(i=0;i<MAX;i+) for(j=0;j<MAX;j+) if(board
4、ij =2) return FALSE; return TRUE;/IsWin判斷是否有一方己經(jīng)勝利Status IsWin( int side ) int row, column; /判斷一行 for( row = 0; row < MAX; row+ ) for( column = 0; column < MAX; column+ ) if( board row column != side ) break; if( column >= MAX ) return TRUE; /判斷一列 for( column = 0; column < MAX; column+ )
5、 for( row = 0; row < MAX; row+ ) if( board row column != side ) break; if( row >= MAX ) return TRUE; /判斷主對角線 if( board 1 1 = side && board 2 2 = side && board 0 0 = side ) return TRUE; /判斷副對角線 if( board 0 2 = side && board 1 1 = side && board 2 0 = side ) return
6、 TRUE; return FALSE;/PositonValue返回落子后的狀態(tài) 有四種狀態(tài)在ConstNum.h中定義 COMPUTER_WIN, HUMAN_WIN, DRAW, PLAYINGStatus PostionValue() return IsWin(COMPUTER)?COMPUTER_WIN:(IsWin(HUMAN)?HUMAN_WIN:(BoardIsFull()?DRAW:PLAYING);/BestMovement判斷最佳落子位置,采用遞歸 ,求出最佳位置Nodes BestMovement(int side) int opp;/對手 Nodes nodes, n
7、ode2; /nodes記錄當前最佳位置,node2返回最佳位置 int simpleEval; /記當中間結(jié)果 int bestRow=0, row; int bestColumn=0, column; int value; /判斷是否游戲己經(jīng)結(jié)束 if( (simpleEval=PostionValue() != PLAYING) node2.row=0; node2.column=0; node2.val=simpleEval; return node2; if(side=COMPUTER) opp=HUMAN; value=HUMAN_WIN; else opp=COMPUTER; v
8、alue=COMPUTER_WIN; for(row=0; row<MAX; row+) for(column=0; column<MAX; column+) if(PositionIsEmpty(row, column) ) Place(row, column, side); nodes = BestMovement(opp); Place(row,column,EMPTY); / 到更好的位置,更新信息 if( (side =COMPUTER && nodes.val > value) | (side=HUMAN && nodes.val
9、< value) ) value=nodes.val; bestRow=row; bestColumn=column; node2.row=bestRow; node2.column=bestColumn; node2.val=value; return node2;/Print打印出當前棋盤狀態(tài)Status Print() int row,column; for(row=0; row<MAX; row+) for(column=0; column<MAX; column+) if(boardrowcolumn=2) printf(" "); else i
10、f(boardrowcolumn=1) printf("X "); else printf("O "); if(column!=0) && (column%2 =0) printf("n"); return TRUE;int main(void) Nodes playNode; int first,a, b, result,opera; /first決定誰先下第一步棋。result記錄每下一步棋后的結(jié)果 while(TRUE) while(TRUE) printf("請選擇你要進行的操作: n");
11、 printf("1:開局n"); printf("2: 退出n"); scanf("%d",&opera); if(opera=1) break; if(opera=2) return TRUE; printf("你的輸入有誤,請重新輸入n"); InitBoard(); while(TRUE) printf("請決定人機對戰(zhàn)時誰先走第一步?0:人 1:電腦"); scanf("%d",&first); if(first=0 | first =1) brea
12、k; printf("輸入錯誤,請重新選擇nn"); printf("人的棋子為O,電腦的棋子X,空位用表示n"); if(first=0) while(TRUE) while(TRUE) printf("請輸入你落子所在的行數(shù),列數(shù)(格式:a,b(a,b在02之間):"); scanf("%d,%d",&a,&b); if(a>=0 && a<MAX && b>=0 && b<=MAX && PositionI
13、sEmpty(a,b) break; printf("你輸入的位置不合法,請重新輸入:nn"); Place(a,b,HUMAN); Print(); /下一步棋后打印出棋盤狀態(tài),并判斷是否結(jié)束,如結(jié)束,則跳出 if( (result=PostionValue() != PLAYING) break; playNode=BestMovement(COMPUTER); Place( playNode.row, playNode.column, COMPUTER); printf("n電腦落子后的棋盤為:n"); Print(); /下一步棋后打印出棋盤狀態(tài)
14、,并判斷是否結(jié)束,如結(jié)束,則跳出 if( (result=PostionValue() != PLAYING) break; else if(first=1) while(TRUE) printf("n電腦落子后棋盤狀態(tài)為n"); playNode = BestMovement(COMPUTER); Place( playNode.row, playNode.column,COMPUTER); Print(); /下一步棋后打印出棋盤狀態(tài),并判斷是否結(jié)束,如結(jié)束,則跳出 if( (result=PostionValue() != PLAYING) break; while(
15、TRUE) printf("請輸入你落子所在的行數(shù),列數(shù)(格式:a,b(a,b在02之間):"); scanf("%d,%d",&a,&b); if(a>=0 && a<MAX && b>=0 && b<=MAX && PositionIsEmpty(a,b) break; printf("你輸入的位置不合法,請重新輸入:nn"); Place(a,b, HUMAN); Print(); /下一步棋后打印出棋盤狀態(tài),并判斷是否結(jié)束,
16、如結(jié)束,則跳出 if( (result=PostionValue() != PLAYING) break; if(result=COMPUTER_WIN) printf("哈哈,你輸了!nn"); else if(result = HUMAN_WIN) printf("恭喜,你贏了!nn"); else printf("平局!nn"); return 0;英文版本運行環(huán)境:Turbo C 或Turbo C/C+for Windows集成實驗與學(xué)習(xí)環(huán)境 或VC+6.0 或Turbo C2.0英文版等。#include "std
17、io.h"#include "malloc.h"#define SIZE 3#ifndef FALSE #define FALSE 0#endif#ifndef TRUE #define TRUE 1#endif#define NONE 0#define PLAYER_A 1#define PLAYER_B 2#define WARNNING 255#define COMPETITOR 200#define WINNER -1char chessboardSIZESIZE;struct CHESS_MAN int row; int col;/*get the va
18、lue of current chess board: count and retrun how many ways the player can win the game*/int get_value(int player) int i,j,ret=0; int row,col,inc; int bNONE=FALSE; /*check the row*/ for(i=0;i<SIZE;i+) row=SIZE; bNONE=FALSE; for(j=0;j<SIZE;j+) /*if there is a competitor's chess man at the lo
19、cation sub row*/ if(chessboardij=player) row-; /*if there is any empty location in the row, set bNONE as TRUE*/ if(chessboardij=NONE) bNONE=TRUE; /*computer : one empty and others are competitor's chess man, oh my god, danger, you may lose the game*/ if(row=1&&bNONE=TRUE) return WARNNING
20、; /*computer : no competitor's chess man in the row, there is one way to make me win the game*/ else if(row=SIZE) ret+; /*check the col*/ for(i=0;i<SIZE;i+) col=SIZE; bNONE=FALSE; for(j=0;j<SIZE;j+) if(chessboardji=player) col-; if(chessboardji=NONE) bNONE=TRUE; /*computer : warnning : the
21、 competitor may be win the game*/ if(col=1&&bNONE=TRUE) return WARNNING; /*computer : this is my chance.*/ else if(col=SIZE) ret+; /*check inc*/ inc=SIZE; bNONE=FALSE; for(i=0,j=0;i<SIZE;i+,j+) if(chessboardij=player) inc-; if(chessboardij=NONE) bNONE=TRUE; /*computer : i won't lose t
22、he game*/ if(inc=1&&bNONE=TRUE) return WARNNING; /*my chance?*/ else if(inc=SIZE) ret+; /*check inc*/ inc=SIZE; bNONE=FALSE; for(i=0,j=SIZE-1;i<SIZE;i+,j-) if(chessboardij=player) inc-; if(chessboardij=NONE) bNONE=TRUE; /*be careful*/ if(inc=1&&bNONE=TRUE) return WARNNING; /*anoth
23、er chance*/ else if(inc=SIZE) ret+; return ret;/*display the chess board*/void disp_chess_board(void) int i,j; /*print the head*/ for(i=0;i<SIZE*4+1;i+) printf("-"); printf("n"); /*print the contect*/ for(i=0;i<SIZE;i+) printf("|"); for(j=0;j<SIZE;j+) if(chessb
24、oardij=PLAYER_A) printf(" o |"); else if(chessboardij=PLAYER_B) printf(" x |"); else printf(" |"); printf("n"); /*print the floor*/ for(j=0;j<SIZE*4+1;j+) printf("-"); printf("n"); return;/*init the chess board*/void init_chess_board(voi
25、d) int i,j; for(i=0;i<SIZE;i+) for(j=0;j<SIZE;j+) chessboardij=NONE; return;int enter_chess_man(int row, int col, int player) /*out of size*/ if(row>=SIZE|col>=SIZE) return FALSE; /*the pionted location is not empty*/ if(chessboardrowcol!=NONE) return FALSE; /*okay, put down the chess ma
26、n*/ chessboardrowcol=player; return TRUE;/*check whetch the player win the game*/int chk_winner(int player) int i,j; int col,row,inc; /*are there all the player's chess men in the same row*/ for(i=0;i<SIZE;i+) row=TRUE; for(j=0;j<SIZE;j+) if(chessboardij!=player) row=FALSE; if(row=TRUE) re
27、turn TRUE; /*are there all the player's chess men in the same col*/ for(i=0;i<SIZE;i+) col=FALSE; for(j=0;j<SIZE;j+) if(chessboardji!=player) col=FALSE; if(col=TRUE) return TRUE; /*what about the inc*/ inc=TRUE; j=0; for(i=0;i<SIZE;i+) if(chessboardii+j!=player) inc=FALSE; if(inc=TRUE)
28、return TRUE; /*and this?*/ inc=TRUE; j=SIZE-1; for(i=0;i<SIZE;i+) if(chessboardij-i!=player) inc=FALSE; if(inc=TRUE) return TRUE; /*sorry, the player has not won yet.*/ return FALSE;/*get the best chess man for player*/int get_best_chess(struct CHESS_MAN *best_chess, int player, int other) int ta
29、t_num=SIZE*SIZE; int chess_value9; struct CHESS_MAN chess9; int i,j,cur=0; /*init chess*/ for(i=0;i<SIZE;i+) for(j=0;j<SIZE;j+) chesscur.row=i; chesscur+.col=j; /*when i take one of the chess man, what's the chess_value of my competitor i will choose the min value, because it means that
30、9;s the worst case for him*/ for(i=0;i<tat_num;i+) /*i try to take this chess_man*/ if(enter_chess_man(chessi.row,chessi.col,player)=TRUE) chess_valuei=get_value(other); /*/ if(chk_winner(player)=TRUE) chess_valuei=WINNER; chessboardchessi.rowchessi.col=NONE; else /*can not take, means that chess
31、_board has layed my cpmpetitor's chess_man*/ chess_valuei=COMPETITOR; /*choose the lowest chess_value*/ cur=0; for(i=0;i<tat_num;i+) if(chess_valuecur>chess_valuei) cur=i; /*my best is my competitor's worst*/ best_chess->row=chesscur.row; best_chess->col=chesscur.col; return ches
32、s_valuecur;int chk_full(void) int i,j; for(i=0;i<SIZE;i+) for(j=0;j<SIZE;j+) if(chessboardij=NONE) return FALSE; return TRUE;int main() struct CHESS_MAN best_chess; int player=PLAYER_A; int competitor=PLAYER_B; int bEND=FALSE; /*whetch need end of the program*/ int row,col; /*user's input location*/ /best_chess=(struct CHESS_MAN*)malloc(sizeof(struct CHESS_MAN); init_chess_board(); disp_chess_board(); while(bEND=FALSE) if(player=PLAYER_A) /*user's turn*/ do printf(" Input your chess location : n"); printf("
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《Kappa阿片受體激動劑salvinorin A對深低溫停循環(huán)術(shù)后腦損傷保護作用的研究》
- 《24小時動態(tài)血壓變異性和β2微球蛋白與缺血性卒中患者血管周圍間隙擴大的相關(guān)性研究》
- 家教與科技如何結(jié)合家庭教育培養(yǎng)孩子的科技創(chuàng)新能力
- 小學(xué)數(shù)學(xué)與日常生活聯(lián)系緊密的實例
- 家長參與下的學(xué)生評價體系優(yōu)化
- 2025年度蓄水池施工安全教育與培訓(xùn)合同范本2篇
- 2024預(yù)拌混凝土生產(chǎn)加工及銷售合作協(xié)議書3篇
- 二零二五年度電力設(shè)施安全生產(chǎn)標準化改造協(xié)議3篇
- 2024年職場雇傭新條款合同版B版
- 當代家居風(fēng)格中的材料語言與情感表達
- 2024年大學(xué)試題(宗教學(xué))-佛教文化筆試考試歷年高頻考點試題摘選含答案
- 七年級語文下冊專項練習(xí)知識(對聯(lián))
- 三年級下冊語文必背古詩詞
- 老年人譫妄中西醫(yī)結(jié)合診療專家共識
- 團餐食品安全年度匯報
- 華西解剖學(xué)課件緒論和骨學(xué)總論
- 2024平安保險測評題庫
- 膀胱癌診斷治療指南
- 僵尸企業(yè)注銷工作總結(jié)范文
- 人教版五年級上冊數(shù)學(xué)脫式計算練習(xí)200題及答案
- 80四川省內(nèi)江市2023-2024學(xué)年八年級上學(xué)期期末考試歷史試題
評論
0/150
提交評論