C語言實現簡單井字棋游戲
更新時間:2021年04月28日 09:30:23 作者:冰凌呀
這篇文章主要為大家詳細介紹了C語言實現簡單井字棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現簡單井字棋游戲的具體代碼,供大家參考,具體內容如下
游戲截圖
源代碼
person.h
//玩家對戰(zhàn) void person() { int i,j; initMap(map); //打印棋局 displayMap(map); //未分出勝負且棋局未落滿子前無限循環(huán) while(1) { //獲取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); //清屏 system("cls"); //打印棋局 displayMap(map); //玩家落子后判斷是否已經分出勝負 if(isWin(map)==1) { //輸出獲勝方 displayWinner(); break; } //是否棋局已滿 else if(count==row*col) { printf("平局!\n"); break; } //交替到對手回合 exchangeTurn(); } }
computer.h
//局面價值 int getSum(char map[][col]) { int sumO=0,sumX=0; int i,j; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(map[i][j]=='O') { sumO+=score[i][j]; } else if(map[i][j]=='X') { sumX+=score[i][j]; } } } return sumX-sumO; } //思考 void think(char map[][col]) { int canWin=0; int i,j; int x=-1,y=-1; int sum; int maxSum=-20; count++; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(map[i][j]==m) { map[i][j]='X'; //能獲勝,直接落子此處 if(isWin(map)) { return; } //不能獲勝,落子在分數最多的地方 else { map[i][j]='O'; if(isWin(map)) { map[i][j]='X'; return; } map[i][j]='X'; sum=getSum(map); if(sum>maxSum) { maxSum=sum; x=i; y=j; } } map[i][j]=m; } } } map[x][y]='X'; } void computer() { int i,j; char computerType='X'; initMap(map); //打印棋局 displayMap(map); //未分出勝負且棋局未落滿子前無限循環(huán) while(1) { //電腦落子 if(nowType==computerType) { printf("電腦落子:"); think(map); } //玩家落子 else { //獲取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); } //清屏 system("cls"); //打印棋局 displayMap(map); //玩家落子后判斷是否已經分出勝負 if(isWin(map)==1) { //輸出獲勝方 displayWinner(); break; } //是否棋局已滿 else if(count==row*col) { printf("平局!\n"); break; } //交替到對手回合 exchangeTurn(); } }
main.c
#include<stdio.h> #include<stdlib.h> //棋局 char map[3][3]; //行列 int row=3,col=3; //棋子類型 char o='O',x='X',m=' '; //當前棋子類型 char nowType='O'; //已落子數量 int count=0; //初始化棋局 void initMap(char map[][col]) { int i,j; for(i=0;i<row;i++) { for(j=0;j<col;j++) { map[i][j]=m; } } } //打印當前棋局 void displayMap(char map[][col]) { int i,j; printf(" "); for(i=0;i<col;i++) { printf("%d ",i); } printf("\n "); for(i=0;i<2*col+1;i++) { printf("*"); } printf("\n"); for(i=0;i<row;i++) { printf("%d ",i); for(j=0;j<col;j++) { printf("%c ",map[i][j]); } printf("\n "); for(j=0;j<2*col+1;j++) { printf("*"); } printf("\n"); } } //獲取用戶輸入 void getXY(int *i,int *j) { while(1) { printf("落子方:%c\n",nowType); printf("落子位置(x,y)="); scanf("%d %d",i,j); if(*i<0||*i>=row||*j<0||*j>=col||map[*i][*j]!=m) { printf("輸入不合法!\n"); } else { return; } } } //交替下子 void exchangeTurn() { if(nowType==o) { nowType=x; } else { nowType=o; } } //下子 void setPiece(char map[][col],int i,int j) { map[i][j]=nowType; count++; } //判斷是否分出勝負,分別從橫豎斜三個方向數數 int isWin(char map[][col]) { int i,j; int flagR,flagC; for(i=0;i<row;i++) { flagR=0,flagC=0; for(j=0;j<col;j++) { if(map[i][j]==o) { flagR++; } else if(map[i][j]==x) { flagR--; } if(map[j][i]==o) { flagC++; } else if(map[j][i]==x) { flagC--; } } if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col)) { return 1; } } flagR=0,flagC=0; for(i=0,j=0;i<row&&j<col;i++,j++) { if(map[i][j]==o) { flagR++; } else if(map[i][j]==x) { flagR--; } if(map[i][col-j-1]==o) { flagC++; } else if(map[i][col-j-1]==x) { flagC--; } } if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col)) { return 1; } else { return 0; } } //輸出勝方 void displayWinner() { printf("%c方獲得勝利!\n",nowType); } //給局面打分的基礎表(站位分) int score[3][3]={ {4,2,4}, {2,8,2}, {4,2,4} }; //引入自定義頭文件 #include"person.h" #include"computer.h" int main() { int gameType; printf("1.人機對戰(zhàn)\n其他.玩家對戰(zhàn)\n"); scanf("%d",&gameType); if(gameType==1) { computer(); } else { person(); } return 0; }
代碼解析
1、 其實棋類游戲設計最重要的就是模擬下棋的過程。
2、 我們知道井字棋是雙方交替下子,一方執(zhí)O,一方執(zhí)X。
3、 比如O先下,玩家下完子后,我們判斷一下此時他是否已經獲勝(即是否出現橫或豎或兩斜線出現三子連珠的情況),沒有獲勝則判斷是否已經將棋局下滿子了,還是沒有的話,輪到X的回合。再次執(zhí)行此步驟。
4、 了解了過程就自然好設計了。因為棋局比較簡單,我們用一個二維字符數組即可存儲。落子位置用坐標(x,y),通過玩家輸入即可進行模擬。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。