C語言版五子棋遊戲的實現代碼
這次看瞭幾位大佬的做法,我們也做瞭很多修改嘗試。算是第一次嘗試合作完成項目。
我認為學到的東西:
1、第一次嘗試寫項目,把函數分到不同的.c文件中後更好看瞭一些。
2、在研究過程中應該分清主次。代碼正確運行才是基礎要求,其他什麼美化界面,調字體調顏色都並非重點。
3、從代碼中學到的,①是采用落子數來判斷該輪到黑方下還是白方下(落子數為2的倍數時黑方下,否則白方下),這樣也能判斷出是哪一方勝利,而且落子數還可以判斷棋盤是否下滿(==16*16時棋盤落滿,平局) ②是勝利條件的判斷,以中間子為參考,看兩邊的四個子是否和他顏色相同。
規則
在一個1616的棋盤上,黑白雙方交替落子,每次落下子後如果棋盤上出現瞭五個同色棋子橫向/豎向/斜向連接,則該方勝利。如果在棋盤下滿後(即下瞭1616個子後)仍未分出勝負,則為平局。
邏輯
初始化棋盤,是一個16*16的二維數組(定義宏 N=16),一開始每一格都初始化為0。用一個不斷++的落子數變量%2來判斷本回合是黑方下還是白方下,;每次玩傢輸入橫縱坐標,該處的變量值改變(黑子為1,白子為2)。每次落子判斷全盤是否有五子連珠,如果有則結束遊戲,如果沒有則繼續下。當落子數達到N*N即棋盤下滿,還沒有出現五子連珠時,則判斷為平局,結束遊戲。
五子棋勝負條件判斷
判斷原理:
勝負的判斷是在每顆棋子落下之後進行,所以用這一子的坐標為基準前後左右斜各個方向來看是否取勝。
具體思想:
按照五子棋規則,當一方的棋子,在橫向,縱向或斜向連續五個均為同一用戶的棋子時,代表勝利。
另外,勝利判斷隻需要在一個新子落子時判斷,且僅需要判斷新子所在的四條線上(縱橫加兩個斜線)是否滿足條件即可。
所以,可以以新子坐標為基準點,判斷四次。
比如橫向的,需要判斷左側和右側連續的同類棋子個數,如果左側+右側+1(自身)總數>=5,則為勝利。
在判斷勝利的時候,首先我們要排除空子的情況,然後當兩個斜線的時候, 無勝情況下,判斷直線,當為兩斜線及直線無勝情況下,判斷橫線。
參考代碼如下:
int win() { extern int arr[100][100]; int k = 0,l = 0; int flag = 0; for(k=2;k<N-2;k++) for(l=2;l<N-2;l++) { if(arr[k][l]!=0&&arr[k-2][l-2]==arr[k][l]&&arr[k-1][l-1]==arr[k][l]&&arr[k+1][l+1]==arr[k][l]&&arr[k+2][l+2]==arr[k][l]) { flag=1; break; } if(arr[k][l]!=0&&arr[k+2][l-2]==arr[k][l]&&arr[k+1][l-1]==arr[k][l]&&arr[k-1][l+1]==arr[k][l]&&arr[k-2][l+2]==arr[k][l]) { flag=1; break; } } if(flag==0) for(k=0;k<N;k++) for(l=2;l<N-2;l++) { if(arr[k][l]!=0&&arr[k][l-2]==arr[k][l]&&arr[k][l-1]==arr[k][l]&&arr[k][l+1]==arr[k][l]&&arr[k][l+2]==arr[k][l]) { flag=1; break; } } if(flag==0) for(k=2;k<N-2;k++) for(l=0;l<N;l++) { if(arr[k][l]!=0&&arr[k+2][l]==arr[k][l]&&arr[k+1][l]==arr[k][l]&&arr[k-1][l]==arr[k][l]&&arr[k-2][l]==arr[k][l]) { flag=1; break; } } return flag; }
註:
1.中的arr[k][l]!=0是排除空子的情況。
2.最後返回判斷結果時, 有勝為1,無為0,誰勝無必要判斷,因為,誰尾手瞭的一定是勝的。
演示
開始
輸入坐標
第二回合
遊戲結束
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。