我先說(shuō)一下,之所以說(shuō)一學(xué)就會(huì)是因?yàn)橄敕ê芎?jiǎn)單,只要你會(huì)寫三子棋,我這個(gè)五子棋你就一定會(huì)寫!因?yàn)槲疫@個(gè)五子棋是按照我寫三子棋的模板復(fù)刻的,到最后我會(huì)總結(jié)我是怎么復(fù)刻的!
能力有限,做的不是很好,如果有什么地方可以優(yōu)化可以告訴我,感謝你們~!
重要的地方我會(huì)仔細(xì)講解,有的一看就會(huì)的地方我就用幾句話描述了,而且代碼里也有我寫的標(biāo)識(shí),很容易看懂的!!!
好!!!現(xiàn)在開始教學(xué)!!!
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//設(shè)置隨機(jī)生成數(shù)
do
{
menu();//菜單
printf("請(qǐng)輸入:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();//游戲
break;
case 0:
printf("已成功退出!\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");
break;
}
} while (input);
return 0;
}
void menu()
{
printf("\n");
printf("********** 菜單 *************\n");
printf("********************************\n");
printf("****** 1.play 0.exit ******\n");
printf("********************************\n");
printf("\n");
}
這里的定義的ROW和COL是棋盤是幾行幾列,看你們的需求可以隨意改變。
當(dāng)然我還要說(shuō)一下,這里我設(shè)計(jì)的是玩家和電腦下棋,這里如果把電腦下棋的那一步換為玩家下棋你們就可以和自己的好朋友一起玩耍了,當(dāng)然有人可能會(huì)說(shuō),有現(xiàn)成的為什么要玩自己寫的,那就大漏特漏了!!!
? 當(dāng)你寫出來(lái)后你玩著都開心,自己寫的代碼,那能不開心么,我下面自己設(shè)置的棋盤不是很好看,你如果用心,可以把棋盤設(shè)置的超級(jí)好看,那不比玩現(xiàn)成的要香么!!!
? 那么接下來(lái)我們就要開始了!!!
#pragma once
#include#include#include#define ROW 15//行
#define COL 15//列
void Init_Board(char board[ROW][COL], int row, int col);//初始化棋盤
void Display_Board(char board[ROW][COL], int row, int col);//打印棋盤
//下棋
void Player_Move(char board[ROW][COL], int row, int col);//玩家下
void Computer_Move(char boar[ROW][COL], int row, int col);//電腦下
int Is_Win(char board[ROW][COL], int row, int col);//是否贏
首先我們要先用數(shù)組對(duì)棋盤進(jìn)行初始化,
然后打印棋盤,
然后再循環(huán)跟電腦下棋,而且每次下完棋后要再次打印棋盤,這樣才叫下棋嘛~
在下棋的過(guò)程中進(jìn)行對(duì)對(duì)局的判斷輸贏。
(寫完這里大概輪廓就已經(jīng)出來(lái)了!接下來(lái)該對(duì)其進(jìn)行“填色”啦!)
void game()
{
int ret = 0;
char board[ROW][COL] = { 0 };
//初始化棋盤
Init_Board(board, ROW, COL);
//打印棋盤
Display_Board(board, ROW, COL);
//下棋
while (1)
{
Player_Move(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
Display_Board(board, ROW, COL);
Computer_Move(board, ROW, COL);
ret = Is_Win(board, ROW, COL);
if (ret != 'C')
{
break;
}
Display_Board(board, ROW, COL);
}
//判斷
if (ret == '*')
{
printf("\n");
printf("玩家勝利!\n");
}
else if (ret == '#')
{
printf("\n");
printf("電腦勝利!\n");
}
else
{
printf("\n");
printf("平局!\n");
}
Display_Board(board, ROW, COL);
}
這里就是對(duì)棋盤進(jìn)行初始化了,因?yàn)殚_始的棋盤是空的,所以可以將棋盤都初始化為“空格”,這樣看著棋盤就是空空的啦!
void Init_Board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< ROW; i++)
{
int j = 0;
for (j = 0; j< COL; j++)
{
board[i][j] = ' ';
}
}
}
?
這里要打印棋盤的樣子還要打印每行每列對(duì)應(yīng)的數(shù)字,
? 首先我先用三子棋的棋盤分析一下如何打印棋盤,五子棋的棋盤只不過(guò)是下圖所示多打印幾行罷了~!
這就是我設(shè)計(jì)的棋盤,有點(diǎn)簡(jiǎn)陋,如果你想設(shè)計(jì)的好看,自己可以重新設(shè)置哦~!
void Display_Board(char board[ROW][COL], int row, int col)
{
int i = 0;
//給棋盤每一列填寫數(shù)字到下面為止!!!
if (ROW >= 10)
{
for (i = 1; i< 10; i++)
{
printf(" %d ", i);
}
for (i = 10; i<= ROW; i++)
{
printf(" %d ", i);
}
printf("\n");
}
else
{
for (i = 1; i< ROW; i++)
{
printf(" %d ", i);
}
printf("\n");
}
//從上面開始到這里將每一列的數(shù)字填寫完畢!!!
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
printf(" ---");
}
printf("\n");
for (j = 0; j< col; j++)
{
printf("| %c ", board[i][j]);
}
if (j == col)
printf("| %d", i + 1);//打印每一行的數(shù)字
printf("\n");
}
if (i == row)
{
int x = 0;
for (x = 0; x< row; x++)
{
printf(" ---");
}
}
printf("\n");
}
? 這里就是寫玩家下棋和電腦下棋的過(guò)程了,玩家和電腦下棋的時(shí)候,肯定是在不是空格的地方下棋,要是這地方有自己的棋,再下一遍那不是比電腦少下一步么,要是下的電腦上面把電腦的棋覆蓋了,那不是耍賴嘛。
? 所以我們?cè)傧轮耙獙?duì)那個(gè)位置進(jìn)行判斷是不是空格!
? 當(dāng)然電腦下棋的時(shí)候就是隨機(jī)下棋了,找一個(gè)空著的地方就可以下(如果你有時(shí)間可以對(duì)電腦進(jìn)行優(yōu)化哦~讓他思想,我之所以沒寫絕對(duì)不是因?yàn)槲蚁脍A電腦,絕對(duì)不是!)
? (下面感覺有點(diǎn)難度的代碼我寫上解釋了,保證每個(gè)人都可以看懂!)
void Player_Move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋:>\n");
while (1)
{
printf("請(qǐng)輸入坐標(biāo):>");
scanf("%d %d", &x, &y);
if (x >= 1 && y >= 1 && x<= ROW && y<= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標(biāo)已被占用,不能下棋,請(qǐng)下在其他位置\n");
}
}
else
{
printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
}
}
}
void Computer_Move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦下棋:>\n");
while (1)
{
x = rand() % ROW + 1;//隨機(jī)生成坐標(biāo),因?yàn)?棋盤的行列數(shù)得到的是比行列數(shù)少1;
y = rand() % COL + 1;//所以加1就是讓它和棋盤的行列數(shù)相同了;
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
}
}
? 平局好說(shuō),先說(shuō)平局吧,當(dāng)棋盤上沒有位置下棋了,而你們也沒有五個(gè)子連在一起,那么肯定就是平局啦~!
? 然后就是判斷輸贏,我這里完全按照三子棋判斷輸贏的方法寫的!可能你看著很多,但是你仔細(xì)看是不是寫起來(lái)很簡(jiǎn)單很簡(jiǎn)單,就只是代碼看著多僅此而已!!!
? 判斷輸贏就是一行五個(gè)連續(xù)的在一起,或者一列五個(gè)連續(xù)的在一起,或者從左上到右下五個(gè)連在一起,或者右上到左下連在一起,就這么四種情況!!!
? 如果有五個(gè)相同的就返回判斷的那個(gè)點(diǎn)就行,返回去就是下棋用的符號(hào),到時(shí)候只要判斷返回去的是玩家的符號(hào)還是電腦的符號(hào)就可以判斷輸贏了~
? 這里重要的就是那個(gè)推移,其實(shí)就是先判斷5×5時(shí)贏的情況,根據(jù)自己用ROW和COL設(shè)置的行列進(jìn)行推移就可以了,
? 我就用一行五子舉例子,比方說(shuō):你下的是(1,1)(1,2)(1,3)(1,4)(1,5)這樣已經(jīng)算贏了吧,然后+1推移后得到(1,2)(1,3)(1,4)(1,5)(1,6),以此類推,這就是這個(gè)五子棋唯一有點(diǎn)難的點(diǎn),但是其實(shí)還是很好想到的,就是運(yùn)行起來(lái)復(fù)雜,每次下完棋判斷的時(shí)候要這樣判斷很多很多次,這也是我的方法不好的地方,如果你們?cè)趯懙臅r(shí)候發(fā)現(xiàn)好的方法一定要告訴我!!!
? 最后就是如果有人贏的話就返回玩家或者電腦的棋子,如果平局就返回‘D’(draw),如果沒人贏也沒平局,那么就繼續(xù),返回‘C’(continue)。
int Is_Full(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i< row; i++)
{
int j = 0;
for (j = 0; j< col; j++)
{
if (board[i][j] == ' ')//有位置
{
return 0;
}
}
}
return 1;//沒位置
}
int Is_Win(char board[ROW][COL], int row, int col)
{
int R = 0;//行推移
int C = 0;//列推移
//int RC = 0;//行列一起推移
//行是否 有三子
int i = 0;
for (i = 0; i< ROW; i++)
{
for (R = 0; R< ROW - 2; R++)//推移
{
if (board[i][R] == board[i][R + 1] &&
board[i][R] == board[i][R + 2] &&
board[i][R] == board[i][R + 3] &&
board[i][R] == board[i][R + 4] &&
board[i][R] != ' ')
{
return board[i][R];
}
}
}
//列是否 有三子
int j = 0;
for (j = 0; j< COL; j++)
{
for (C = 0; C< COL - 2; C++)//推移
{
if (board[C][j] == board[C + 1][j] &&
board[C][j] == board[C + 2][j] &&
board[C][j] == board[C + 3][j] &&
board[C][j] == board[C + 4][j] &&
board[C][j] != ' ')
{
return board[C][j];
}
}
}
//倆對(duì)角是否 有三子
for (C = 0, R = 0; C< COL - 2; C++, R++)
{
if (board[R][C] == board[R + 1][C + 1] &&
board[R][C] == board[R + 2][C + 2] &&
board[R][C] == board[R + 3][C + 3] &&
board[R][C] == board[R + 4][C + 4] &&
board[R][C] != ' ')
{
return board[R][C];
}
if (board[R][C + 4] == board[R + 1][C + 3] &&
board[R][C + 4] == board[R + 2][C + 2] &&
board[R][C + 4] == board[R + 3][C + 1] &&
board[R][C + 4] == board[R + 4][C] &&
board[R][C + 4] != ' ')
{
return board[R][C + 4];
}
}
if (Is_Full(board, row, col))
{
return 'D';
}
return 'C';
}
如果你看到這里,說(shuō)明你已經(jīng)會(huì)了我這個(gè)愚笨但是簡(jiǎn)單的五子棋了,
? 還記不記得我要總結(jié)我是怎么復(fù)刻的,其實(shí)你現(xiàn)在已經(jīng)知道是怎么復(fù)刻的了,就是打印行列圖形的時(shí)候用for循環(huán)帶上ROW和COL就可以在你改ROW和COL的時(shí)候,打印的圖形就跟著改變,還有就是判斷輸贏的時(shí)候用我上面說(shuō)的推移的方法,本來(lái)三子棋不需要推移,因?yàn)樗芎?jiǎn)易,但是五子棋的話就要棋盤大點(diǎn),所以同樣用到ROW和COL。
? 這樣就是我說(shuō)的復(fù)刻啦,很簡(jiǎn)單吧。
? 創(chuàng)作不易,如果看懂了蠻煩您發(fā)財(cái)?shù)男∈贮c(diǎn)個(gè)贊吧,這樣我就更有動(dòng)力出其他的詳細(xì)解析了!!!謝謝你們~!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:C語(yǔ)言編寫五子棋(詳細(xì)教學(xué)版,一學(xué)就會(huì))-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article0/jgjoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、Google、網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容