生活随笔
收集整理的這篇文章主要介紹了
三子棋游戏C实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三子棋游戲
注:本篇三子棋實現使用C語言,在VS編譯環境下實現。
- 文件的創建
- 三子棋代碼框架
- 初始化和打印函數
- 玩家下棋
- 電腦下棋
- 勝負判斷
- 效果演示
- 全部代碼
三子棋詳細步驟講解
1.文件的創建
為了讓代碼更加整潔和分工明確,我們需要在VS上創建三個不同的文件,1.創建test.c的源文件,用于測試三子棋游戲。2.創建game.c的頭文件,實現游戲函數的聲明。3.創建game.c源文件,用于游戲函數的實現。創建好后如下圖。
2.三子棋代碼框架
我們編寫任何一個復雜工程項目,都是先把框架寫出來,然后一步一步去實現它。
如圖,在test.c文件下設計框架:
框架設計好后,開始實現內容,menu作為菜單函數,可以這樣設計:
void menu()
{printf("******************************\n");printf("********* 1.play *********\n");printf("********* 0.exit *********\n");printf("******************************\n");
}
按F5編譯運行,我們輸入0,結果如下圖:
3.初始化和打印函數實現
如何設計三子棋游戲呢,我們先觀察三子棋樣貌,有三行三列,我們下棋一次棋,保存一下,然后電腦下棋…不難得出棋盤類似于一個二維數組,觀察棋盤圖,定義初始化數組,然后實現打印函數。
我們在test.c中創建初始化和打印函數,在game.h中聲明函數,在game.c中實現數組,之后實現函數同理,創建和聲明將不再贅述。
1.在test文件中創建初始化函數和打印函數
2.在game.h文件中聲明函數
3.初始化函數的實現
4.打印棋盤函數的實現
5.效果如圖
注:改變define中的值可以改變棋盤大小
4.玩家下棋
步驟1.先在test.c中的game()函數中創建。2.在game.h中聲明。3.在game.c中實現。前兩部操作同上,不展開講述,最后我會將全部代碼放到最后,這里詳細講解game.c中玩家下棋的實現。
void player(char board
[row
][col
], int r
, int c
)
{int i
= 0;int j
= 0;printf("玩家下棋:>\n");while (1) {printf("請輸入下棋位置:>");scanf("%d %d", &i
, &j
);if ((i
>= 1 && i
<= row
) && (j
>= 1 && j
<= col
)){if (board
[i
-1][j
-1] == ' '){board
[i
-1][j
-1] = '*';break;}else{printf("該位置已經下過,請重新下棋\n");}}else{printf("下棋位置錯誤,請重新下棋\n");}}
}
注:寫完玩家下棋函數后,在其下在接上之前的打印函數,這樣下一個子就可以立刻看到棋盤。
5.電腦下棋
基本步驟同上,rand(),srand(),time()函數可以去這個網站了解:https://legacy.cplusplus.com/
//game.cvoid computer(char board[row][col], int r, int c)
{int i = 0;int j = 0;printf("電腦下棋:>\n");while (1){//rand()隨機值函數,任何數模上一個數,得到范圍是0~這個數i = rand() % row; //使用rand函數需要用srand()函數,頭文件<stdlib.h>j = rand() % col; //srand()函數需要調用time()函數,頭文件<time.h>if (board[i][j] == ' '){board[i][j] = '#';break;}} //因為是電腦下棋,不需要提示錯誤,自己會循環
}//test.c
因為srand()函數只調用一次,所以在main()中加如下代碼srand((unsigned int)time(NULL));
6.判斷勝負
首先在game()函數中創建判斷勝負函數is_win(),分別在玩家下棋和電腦下完一次棋后進行判斷,根據判斷值返回值來看是繼續下棋還是誰贏了,或者是平局。
1.設計判斷函數之前game()函數內容
2.設計后game()函數內容
3.判斷函數is_win()的實現
注:因為函數是有返回值,字符,所以聲明是設計為char返回類型,而不是void
判斷滿沒滿full()函數的實現。注:寫在is_win()函數上面
7.效果演示
8.全部代碼
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void game()
{char board
[row
][col
] = { 0 }; Inital(board
,row
,col
); display(board
, row
, col
);while (1){player(board
, row
, col
);display(board
, row
, col
);if ('c' != is_win(board
, row
, col
)){break;}computer(board
, row
, col
);if ('c' != is_win(board
, row
, col
)){break;}display(board
, row
, col
);}if ('*' == is_win(board
, row
, col
)){printf("玩家贏\n");}if ('#' == is_win(board
, row
, col
)){printf("電腦贏\n");}if ('p' == is_win(board
, row
, col
)){printf("平局\n");}display(board
, row
, col
);
}
void menu()
{printf("******************************\n");printf("********* 1.play *********\n");printf("********* 0.exit *********\n");printf("******************************\n");}
int main()
{int input
= 0;srand((unsigned int)time(NULL));do {menu(); printf("請輸入數字:>");scanf("%d", &input
);switch (input
){case 1: game(); break;case 0:printf("退出游戲\n");break; default:printf("輸入錯誤,請重新輸入\n");break;}} while (input
); return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define row 3
#define col 3
void Inital(char board
[row
][col
], int r
,int c
);
void display(char board
[row
][col
], int r
, int c
);
void player(char board
[row
][col
],int r
,int c
);
void computer(char board
[row
][col
], int r
, int c
);
char is_win(char board
[row
][col
], int r
, int c
);
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void Inital(char board
[row
][col
], int r
, int c
)
{int i
= 0;for (i
= 0; i
< r
; i
++) { int j
= 0;for (j
= 0; j
< c
; j
++){board
[i
][j
] = ' '; }}
}void display(char board
[row
][col
], int r
, int c
)
{int i
= 0;for (i
= 0; i
< r
; i
++) {int j
= 0;for (j
= 0; j
< c
; j
++) {printf(" %c ", board
[i
][j
]);if (j
< c
- 1) {printf("|");}}printf("\n");if (i
< r
- 1) {for (j
= 0; j
< c
; j
++) {printf("---");if (j
< c
- 1) {printf("|");}}printf("\n");} }
}void player(char board
[row
][col
], int r
, int c
)
{int i
= 0;int j
= 0;printf("玩家下棋:>\n");while (1) {printf("請輸入下棋位置:>");scanf("%d %d", &i
, &j
);if ((i
>= 1 && i
<= row
) && (j
>= 1 && j
<= col
)){if (board
[i
-1][j
-1] == ' '){board
[i
-1][j
-1] = '*';break;}else{printf("該位置已經下過,請重新下棋\n");}}else{printf("下棋位置錯誤,請重新下棋\n");}}
}
void computer(char board
[row
][col
], int r
, int c
)
{int i
= 0;int j
= 0;printf("電腦下棋:>\n");while (1){i
= rand() % row
; j
= rand() % col
; if (board
[i
][j
] == ' '){board
[i
][j
] = '#';break;}}
}
int full(char board
[row
][col
], int r
, int c
)
{int i
= 0;int j
= 0;for (i
= 0; i
< r
; i
++){for (j
= 0; j
< c
; j
++){if (' ' == board
[i
][j
]){return 0;}}}return 1;
}
char is_win(char board
[row
][col
], int r
, int c
)
{int i
= 0;int j
= 0;for (i
= 0; i
< row
; i
++){if (board
[i
][0] == board
[i
][1] && board
[i
][0] == board
[i
][2] && board
[i
][0] != ' '){return board
[i
][0];}}for (i
= 0; i
< col
; i
++){if (board
[0][i
] == board
[1][i
] && board
[0][i
] == board
[2][i
] && board
[0][i
] != ' '){return board
[i
][0];}}if (board
[0][0] == board
[1][1] && board
[0][0] == board
[2][2] && board
[0][i
] != ' '){return board
[0][0];}if (board
[0][2] == board
[1][1] && board
[0][2] == board
[2][0] && board
[0][2] != ' '){return board
[0][0];}if (1 == full(board
,row
,col
)){return 'p'; }elsereturn 'c';
}
這里三子棋講解就結束啦,當然還有很多不足之處,如:1.三子棋寫死了,不能實現五子棋 2.打印屏幕沒設計清除等等,好了,同志們趕緊沖,搞起來。
總結
以上是生活随笔為你收集整理的三子棋游戏C实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。