C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
游戲截圖
源代碼
person.h
//玩家對(duì)戰(zhàn) void person() { int i,j; initMap(map); //打印棋局 displayMap(map); //未分出勝負(fù)且棋局未落滿子前無(wú)限循環(huán) while(1) { //獲取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); //清屏 system("cls"); //打印棋局 displayMap(map); //玩家落子后判斷是否已經(jīng)分出勝負(fù) if(isWin(map)==1) { //輸出獲勝方 displayWinner(); break; } //是否棋局已滿 else if(count==row*col) { printf("平局!\n"); break; } //交替到對(duì)手回合 exchangeTurn(); } }
computer.h
//局面價(jià)值 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; } //不能獲勝,落子在分?jǐn)?shù)最多的地方 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); //未分出勝負(fù)且棋局未落滿子前無(wú)限循環(huán) while(1) { //電腦落子 if(nowType==computerType) { printf("電腦落子:"); think(map); } //玩家落子 else { //獲取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); } //清屏 system("cls"); //打印棋局 displayMap(map); //玩家落子后判斷是否已經(jīng)分出勝負(fù) if(isWin(map)==1) { //輸出獲勝方 displayWinner(); break; } //是否棋局已滿 else if(count==row*col) { printf("平局!\n"); break; } //交替到對(duì)手回合 exchangeTurn(); } }
main.c
#include<stdio.h> #include<stdlib.h> //棋局 char map[3][3]; //行列 int row=3,col=3; //棋子類(lèi)型 char o='O',x='X',m=' '; //當(dāng)前棋子類(lèi)型 char nowType='O'; //已落子數(shù)量 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; } } } //打印當(dāng)前棋局 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"); } } //獲取用戶(hù)輸入 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++; } //判斷是否分出勝負(fù),分別從橫豎斜三個(gè)方向數(shù)數(shù) 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); } //給局面打分的基礎(chǔ)表(站位分) 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.人機(jī)對(duì)戰(zhàn)\n其他.玩家對(duì)戰(zhàn)\n"); scanf("%d",&gameType); if(gameType==1) { computer(); } else { person(); } return 0; }
代碼解析
1、 其實(shí)棋類(lèi)游戲設(shè)計(jì)最重要的就是模擬下棋的過(guò)程。
2、 我們知道井字棋是雙方交替下子,一方執(zhí)O,一方執(zhí)X。
3、 比如O先下,玩家下完子后,我們判斷一下此時(shí)他是否已經(jīng)獲勝(即是否出現(xiàn)橫或豎或兩斜線出現(xiàn)三子連珠的情況),沒(méi)有獲勝則判斷是否已經(jīng)將棋局下滿子了,還是沒(méi)有的話,輪到X的回合。再次執(zhí)行此步驟。
4、 了解了過(guò)程就自然好設(shè)計(jì)了。因?yàn)槠寰直容^簡(jiǎn)單,我們用一個(gè)二維字符數(shù)組即可存儲(chǔ)。落子位置用坐標(biāo)(x,y),通過(guò)玩家輸入即可進(jìn)行模擬。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)井字棋(三子棋)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲
- C語(yǔ)言實(shí)現(xiàn)井字棋游戲(人機(jī)對(duì)弈)
- C語(yǔ)言代碼實(shí)現(xiàn)井字棋游戲
- C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)算法
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易井字棋游戲
- 利用C語(yǔ)言實(shí)現(xiàn)三子棋(井字棋)小游戲
- 基于C語(yǔ)言實(shí)現(xiàn)井字棋游戲
- C語(yǔ)言實(shí)現(xiàn)井字棋游戲
- C語(yǔ)言二維數(shù)組應(yīng)用之井字棋游戲
相關(guān)文章
C語(yǔ)言之字符串模糊查詢(xún)方法的實(shí)現(xiàn)
本篇文章主要為大家介紹字符串模糊查詢(xún)的C語(yǔ)言程序編寫(xiě)方法,有需要的朋友可以參考下2015-07-07c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-09-09C語(yǔ)言通過(guò)棧實(shí)現(xiàn)小人走迷宮
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言通過(guò)棧實(shí)現(xiàn)小人走迷宮,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03