C語言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡(jiǎn)單井字棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
游戲截圖


源代碼
person.h
//玩家對(duì)戰(zhàn)
void person()
{
int i,j;
initMap(map);
//打印棋局
displayMap(map);
//未分出勝負(fù)且棋局未落滿子前無限循環(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ù)且棋局未落滿子前無限循環(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;
//棋子類型
char o='O',x='X',m=' ';
//當(dāng)前棋子類型
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");
}
}
//獲取用戶輸入
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í)棋類游戲設(shè)計(jì)最重要的就是模擬下棋的過程。
2、 我們知道井字棋是雙方交替下子,一方執(zhí)O,一方執(zhí)X。
3、 比如O先下,玩家下完子后,我們判斷一下此時(shí)他是否已經(jīng)獲勝(即是否出現(xiàn)橫或豎或兩斜線出現(xiàn)三子連珠的情況),沒有獲勝則判斷是否已經(jīng)將棋局下滿子了,還是沒有的話,輪到X的回合。再次執(zhí)行此步驟。
4、 了解了過程就自然好設(shè)計(jì)了。因?yàn)槠寰直容^簡(jiǎn)單,我們用一個(gè)二維字符數(shù)組即可存儲(chǔ)。落子位置用坐標(biāo)(x,y),通過玩家輸入即可進(jìn)行模擬。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c語言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于c語言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10

