1. 程式人生 > >三子棋(五子棋)---c語言

三子棋(五子棋)---c語言

用c語言來實現三子棋和五子棋 //寫出整個程式的大概個構造 //建立一個二維陣列來表示棋盤 //因為棋盤是一個全域性變數,所以我們在其前面加上g_,表示這個變數是全域性變數 //因為此處建立陣列的時候建立了一個3*3的二維陣列,在之後進行修改時會比較麻煩 //所以我們用巨集定義兩個常量來表示陣列的大小 //之後進行修改時對巨集進行修改即可 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> #include<stdlib.h> //注意此處巨集表示時,後面是不加冒號的 #define ROW 3 #define COL 3

//1.列印一個二維陣列表示棋盤 char g_chess_board[ROW][COL]; void Init() { //2.需要對棋盤進行一次初始化,先預設的讓棋盤的內容都為空格 //此處有一個改變vs中變數的技巧,當我們在變數上按住shift+alt+r //就可以將變數名改為你想要的名字 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL ; j++) { //將變數初始化為空格 g_chess_board[i][j] = ’ '; } } } void Print() { //此處呼叫一個print函式來列印棋盤 //一行一行的列印 for (int i = 0; i < ROW; i++) { printf("| %c | %c | %c |\n", g_chess_board[i][0], g_chess_board[i][1], g_chess_board[i][2]); if (i != ROW-1) //上邊界和下邊界都不進行列印 { printf("|—|---|—|\n"); } } } int IsFull() { for (int row = 0; row < ROW; row++) { for (int col = 0; col < COL; row++) { return 0; } } return 1; } void PlayMove() { while (1) { printf(“請您輸入您要落子的座標,row,col”); //玩家落子
//1.讓玩家輸入相應的落子的座標
int row = -1; int col = -1; scanf("%d %d", &row,&col); //2.判斷輸入是否合法,若不合法請玩家重新輸入 if (row >= ROW || col >= COL || row < 0 || COL < 0) { //a>是否滿足棋盤的範圍條件 printf(“輸入有誤!!請重新輸入!!\n”); continue; } if (g_chess_board[row][col] != ’ ') { printf(“當前位置上已經落子!!請落子其他位置!!\n”); continue; //b>落子的位置上是否已經有棋子 } g_chess_board[row][col] = ‘x’; break;
//3.落子
,在棋盤上玩家指定的座標位置上顯示"x" } } char WhoWin() { //判定玩家是否獲勝 //使用x表示玩家,使用o表示電腦,當玩家獲勝時,返回x,當電腦獲勝時返回o //當和棋時返回q,但勝負未分時返回 空格 for (int row=0; row < ROW; row++) { if (g_chess_board[row][0] == g_chess_board[row][1] && g_chess_board[row][0] == g_chess_board[row][2] && g_chess_board[row][0] != ’ ') { //1.檢查所有的行是否連在一起 //判斷所有的行是否連在一起的同時,要判斷當所有為空格時是不能判定誰勝利的 //當勝利時,我們返回第一個位置輸入的內容就可以了 return g_chess_board[row][0]; } } //檢查列 for (int col=0; col < COL; col++) { if (g_chess_board[0][col] == g_chess_board[1][col] && g_chess_board[0][col] == g_chess_board[2][col] && g_chess_board[0][col] != ’ ‘) { return g_chess_board[0][col]; } } //檢查對角線 if (g_chess_board[0][0] == g_chess_board[1][1] && g_chess_board[0][0] == g_chess_board[2][2]&&g_chess_board[0][0]!=0) { return g_chess_board[0][0]; } if (g_chess_board[2][0] == g_chess_board[1][1] && g_chess_board[2][0] == g_chess_board[0][2]&&g_chess_board[2][0]!=0) { return g_chess_board[2][0]; } //檢查是否和棋 //此處呼叫一下IsFull函式來判斷是否和棋 if (IsFull()) { //判斷是否為和棋 //當為和棋的時候,返回’q’ return ‘q’; } //當勝負未分時,返回空格 return ’ ';

} void CompMove() { //5.電腦進行落子 //這個電腦的難度不是一般的底,能不能贏完全隨緣 //我們產生一個隨機數,然後判定一下能否放入 printf(“電腦要開始落子了!!!\n”); int row = 0; int col = 0; while (1) { //用rand()函式來產生隨機數 //用ROW和COL來給它取餘,則它的範圍為[0,2] row = rand() % ROW; col = rand() % COL; if (g_chess_board[row][col] == ’ ‘) { //判斷是否空格,當為空格時賦值為’o’ g_chess_board[row][col] = ‘o’; break; } else { continue; } } } int main()

{ char winner = ’ '; //此處呼叫一個init()函式對棋盤進行一次初始化 Init(); //3.先列印一個棋盤 while (1) { Print(); //呼叫一下PlayerMove()函式,來讓玩家進行下棋 PlayMove(); //呼叫一下WhoWin函式,來判斷玩家是否獲勝 winner = WhoWin(); if (winner != ’ ') { //有三種情況,遊戲是結束的,和棋.玩家勝利,或者電腦勝利 //當不滿足這三種情況時,遊戲是繼續的 break; } //5.計算機再進行落子,判斷計算機是否獲勝

	 winner = WhoWin();
	 if (winner != ' ')
	 {
		 //有三種情況,遊戲是結束的,和棋.玩家勝利,或者電腦勝利
		 //當不滿足這三種情況時,遊戲是繼續的
		 break;
	 }
 }
	 if (winner == 'x')
	 {
		 printf("玩家獲勝!!\n");
	 }
	 else if (winner == 'o')
	 {
		 printf("電腦獲勝\n");
	 }
	 else if (winner == 'q')
	 {
		 printf("和棋\n");
	 }

	 //若無法判定兩者誰取勝,就回到第三步,再次列印棋盤
 system("pause");
 return 0;

}