目錄
1、需求分析
2、程式架構
3、代碼實作(分函式呈現)
(1)主函式代碼實作
分析:
例外處理:
(2)選單函式的實作
分析:
(3)游戲函式的實作
分析:
(4)棋盤的初始化
分析:
(5)棋盤展示代碼實作
分析:
(6)玩家下棋
分析:
例外處理:
(7)電腦下棋
分析:
(8)判斷是否結束
分析:
(9)判斷誰獲勝
分析:
(10)特別說明
4、代碼實作(總代碼)
test.c代碼
game.c代碼
game.h代碼
1、需求分析
需求:通過C語言實作三子棋小游戲,
注:由于作者水平有限,只能將計算機下棋設定為隨機下棋,所以看起來略顯呆笨,并且程式中也沒有采用影像界面的方式,敬請諒解!
2、程式架構
程式分為test.c、game.c兩個源檔案和game.h一個頭檔案,
test.c:主函式介面引入,
game.c:游戲的相關函式實作,
game.h:頭檔案引入、函式宣告,
3、代碼實作(分函式呈現)
(1)主函式代碼實作
int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請選擇:->"); scanf("%d", &input); system("cls"); switch (input) { case 1: game(); break; case 0: int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請選擇:->"); scanf("%d", &input); system("cls"); switch (input) { case 1: game(); break; case 0: printf("已退出!\n"); break; default: break; } } while (input); return 0; } break; default: break; } } while (input); return 0; }
分析:
1.主函式主要是引入了隨機種子(后續計算機下棋時會用到),并且通過switch()提供了游戲的介面,讓玩家可以通過輸入1開始游戲或者通過輸入0結束游戲,
2.為了讓用戶能夠多次進行游戲,采用了do while死回圈的方式,同時,采用while陳述句的另一個原因就是可以利用該陳述句程式執行陳述句比條件運算式執行多一次的特點,來讓玩家無論是否玩游戲,打開后先看到的是選單,
例外處理:
在主函式中對于用戶輸入非0和非1的數字采用了重新進入回圈的方式,
(2)選單函式的實作
void menu() { printf("*************************\n"); printf("******* 1.play ********\n"); printf("******* 0.exit ********\n"); printf("*************************\n"); }
分析:
利用簡單的printf陳述句進行輸出即可將選單呈現給玩家,(注意不要忘記'\n\進行換行操作)
(3)游戲函式的實作
//游戲函式 void game() { char board[ROW][COL] = { 0 }; Init_board(board, ROW, COL);//棋盤初始化 Display_board(board, ROW, COL);//棋盤展示 while (1) { player_board(board, ROW, COL);//玩家下棋 Display_board(board, ROW, COL);//棋盤展示 printf("\n"); if (is_end(board, ROW, COL) != 'c') { is_win(is_end(board, ROW, COL)); break; } computer_board(board, ROW, COL);//電腦下棋 Display_board(board, ROW, COL);//棋盤展示 printf("\n"); if (is_end(board, ROW, COL) != 'c') { is_win(is_end(board, ROW, COL)); break; } } }
分析:
1、先定義并初始化存放資料的棋盤(利用二維陣列實作)
2、初始化棋盤并展示棋盤
3、玩家下棋,然后電腦下棋,只要有一方獲勝就停止游戲,同時在任何一方下完棋后都進行棋盤的呈現,
(4)棋盤的初始化
void Init_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } }
分析:
利用兩個for回圈將二維陣列的每個元素賦值為空格即可,
(5)棋盤展示代碼實作
void Display_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (j < col - 1) printf(" %c |", board[i][j]); else printf(" %c \n", board[i][j]); } if (i < row-1 ) { for (int j = 0; j < col; j++) { if (j < col - 1) printf("___|"); else printf("___\n"); } } else { for (int j = 0; j < col; j++) { if (j < col - 1) printf(" |"); else printf(" \n"); } } } }
分析:
大家先看成品代碼:
具體思路:首先這個地方需要用到雙層for回圈這是毋庸置疑的,但我們在列印的時候一定要注意,我們在列印一行的每個的時候,前面的元素即前兩個形式為 (空格)棋盤元素(空格)(豎線),最后面即第三個元素為(空格)棋盤元素(空格)(換行符),當我們列印完一行帶有棋盤的元素后,我們需要列印出分割線,分割線也是通過for回圈列印的,思路同上,前兩個元素為(下劃線)(下劃線)(下劃線)(豎線),第三個即最后一個元素為(下劃線)(下劃線)(下劃線)(換行符),
另外需要注意的是最后一行即原本應該列印分割線的位置不需要分割線,所以列印方式為:前兩個元素為(空格)(空格)(空格)(豎線)(換行符),與前面相比,少了下劃線,
總結來說,就是注意前兩個元素或者前兩行與最后一個元素或者最后一行的區別即可,此處一樣是通過for回圈實作,
(6)玩家下棋
void player_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; while (1) { int i = 0; int j = 0; printf("請輸入下棋位置->"); scanf("%d %d", &i, &j); if (i <= row && i >= 1 && j <= col && j >= 1) { if (board[i-1][j-1] == ' ') { board[i-1][j-1] = '*'; break; } else { printf("坐標已有棋,清重新輸入!\n"); } } else { printf("坐標非法,清重新輸入!\n"); } } }
分析:
這個函式中主要是通過對想要下棋的位置判斷該位置處有無元素即可,如果沒有元素,即可正常下棋,
例外處理:
對輸入的棋盤位置資料進行篩選后對于不符合要求的資料或者輸入的坐標位置處有棋都會要求玩家重新輸入,
(7)電腦下棋
void computer_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; while (1) { i = rand() % 3; j = rand() % 3; if (board[i][j] ==' ') { board[i][j] = '#'; break; } else continue; } }
分析:
此處利用隨機種子生成亂數即可,只要生成的隨機的位置處為空白就正常下棋,反之重新生成亂數直到為空白處下棋后停止,
(8)判斷是否結束
//判斷是否結束 char is_end(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; //行相同 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] &&board[i][1]== board[i][2] && board[i][0] != ' ') return board[i][0]; } //列相同 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] &&board[1][i]== board[2][i] && board[0][i] != ' ') return board[0][i]; } //’\'對角線 if (board[0][0] == board[1][1] && board[1][1]== board[2][2] && board[0][0] != ' ') return board[0][0]; //'/'對角線 if (board[2][0] == board[1][1] == board[0][2] && board[2][0] != ' ') return board[2][0]; //未結束 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 'c'; } } //平局 return '-'; }
分析:
當棋盤并未填滿并且玩家與電腦均為未勝利時回傳字符'c'說明可以繼續,同時根據獲勝的要求回傳不同的值,當回傳字符'*'時玩家獲勝,回傳'#'說明電腦獲勝,回傳字符'-'說明平局,回傳字符'c'說明可以不符合上面的任意一種條件,可以正常繼續,
(9)判斷誰獲勝
//判斷誰獲勝 void is_win(char flag) { if (flag == '*') { printf("玩家獲勝!\n"); system("pause"); system("cls"); } else if (flag == '#') { printf("電腦獲勝!\n"); system("pause"); system("cls"); } else if (flag == '-') { printf("平局!\n"); system("pause"); system("cls"); } }
分析:
根據上面判斷是否結束的回傳時來進行判斷并且輸出即可,
(10)特別說明
1、代碼中使用的system("cls")是清屏命令,system("pause")是使螢屏暫停的命令,按任意鍵后可以使程式正常進行,這兩者均需要引windows.h頭檔案,
2、生成亂數的函式rand需要引stdlib.h頭檔案,使用時間戳time()需要引time.h頭檔案,
4、代碼實作(總代碼)
test.c代碼
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請選擇:->"); scanf("%d", &input); system("cls"); switch (input) { case 1: game(); break; case 0: break; default: printf("已退出!\n"); break; } } while (input); return 0; }game.c代碼
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //選單實作 void menu() { printf("*************************\n"); printf("******* 1.play ********\n"); printf("******* 0.exit ********\n"); printf("*************************\n"); } //游戲函式 void game() { char board[ROW][COL] = { 0 }; Init_board(board, ROW, COL);//棋盤初始化 Display_board(board, ROW, COL);//棋盤展示 while (1) { player_board(board, ROW, COL);//玩家下棋 Display_board(board, ROW, COL);//棋盤展示 printf("\n"); if (is_end(board, ROW, COL) != 'c') { is_win(is_end(board, ROW, COL)); break; } computer_board(board, ROW, COL);//電腦下棋 Display_board(board, ROW, COL);//棋盤展示 printf("\n"); if (is_end(board, ROW, COL) != 'c') { is_win(is_end(board, ROW, COL)); break; } } } //棋盤初始化 void Init_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } } //棋盤展示 void Display_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (j < col - 1) printf(" %c |", board[i][j]); else printf(" %c \n", board[i][j]); } if (i < row-1 ) { for (int j = 0; j < col; j++) { if (j < col - 1) printf("___|"); else printf("___\n"); } } else { for (int j = 0; j < col; j++) { if (j < col - 1) printf(" |"); else printf(" \n"); } } } } //玩家下棋 void player_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; while (1) { int i = 0; int j = 0; printf("請輸入下棋位置->"); scanf("%d %d", &i, &j); if (i <= row && i >= 1 && j <= col && j >= 1) { if (board[i-1][j-1] == ' ') { board[i-1][j-1] = '*'; break; } else { printf("坐標已有棋,清重新輸入!\n"); } } else { printf("坐標非法,清重新輸入!\n"); } } } //電腦下棋 void computer_board(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; while (1) { i = rand() % 3; j = rand() % 3; if (board[i][j] ==' ') { board[i][j] = '#'; break; } else continue; } } //判斷是否結束 char is_end(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; //行相同 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] &&board[i][1]== board[i][2] && board[i][0] != ' ') return board[i][0]; } //列相同 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] &&board[1][i]== board[2][i] && board[0][i] != ' ') return board[0][i]; } //’\'對角線 if (board[0][0] == board[1][1] && board[1][1]== board[2][2] && board[0][0] != ' ') return board[0][0]; //'/'對角線 if (board[2][0] == board[1][1] == board[0][2] && board[2][0] != ' ') return board[2][0]; //未結束 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 'c'; } } //平局 return '-'; } //判斷誰獲勝 void is_win(char flag) { if (flag == '*') { printf("玩家獲勝!\n"); system("pause"); system("cls"); } else if (flag == '#') { printf("電腦獲勝!\n"); system("pause"); system("cls"); } else if (flag == '-') { printf("平局!\n"); system("pause"); system("cls"); } }game.h代碼
#include<stdio.h> #include<time.h> #include<stdlib.h> #include<windows.h> #define ROW 3 #define COL 3 //選單函式宣告 void menu(); //游戲函式宣告 void game(); //棋盤初始化函式宣告 void Init_board(char board[ROW][COL], int row, int col); //棋盤展示函式宣告 void Display_board(char board[ROW][COL], int row, int col); //玩家下棋函式宣告 void player_board(char board[ROW][COL], int row, int col); //電腦下棋函式宣告 void computer_board(char board[ROW][COL],int row,int col); //判斷是否結束函式宣告 char is_end(char board[ROW][COL], int row, int col); //判斷誰獲勝函式宣告 void is_win(char flag);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352039.html
標籤:其他
上一篇:三子棋的簡單實作
下一篇:三子棋(C語言實作)

