【愚公系列】2022年03月 微信小程序-視圖容器
728
2022-05-28
游戲介紹:
三子棋是一種民間傳統游戲,又叫九宮棋、圈圈叉叉、一條龍等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了。
那我們如何實現這個游戲呢?
我們首先要捋清楚我們要實現什么:
1、先初始化棋盤,把未打印的數字置為空格。
void InitBoard(char board[ROW][COL], int row, int col);
2、打印棋盤。
void DisplayBoard(char board[ROW][COL], int row, int col)
3、實現玩家下棋過程。
void PlayerMove(char board[ROW][COL], int row, int col);
4、實現電腦下棋過程。
void ComputerMove(char board[ROW][COL], int row, int col);
5、判斷輸贏
char IsWin(char board[ROW][COL], int row, int col);
在這里用返回值來確定輸贏。
判斷游戲輸贏
要返回四種不同的狀態
玩家贏 – ‘*’
電腦贏 – ‘#’
平局 – ‘Q’
繼續 – ‘C’
主要過程分析:
打印棋盤:
棋盤拆成每一行:###|###|### 和—|---|— (#代表空格)
只要在最后一列中不打印‘|’就可以。在可以通過if判斷語句來實現if(j 在第0列和第一列打印。 void DisplayBoard(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++) { printf(" %c ", board[i][j]); if (j < col - 1) //控制最后一列不打印‘|’ { printf("|"); } } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) //控制最后一列不打印‘|’ { printf("|"); } } } printf("\n"); } } 打印效果: | | ---|---|--- | | ---|---|--- | | 實現玩家下棋: 1、在這里通過x-1、y-1就可以以常規識別坐標的方式來選擇坐標。 2、if (board[x - 1][y - 1] == ' ') 判斷在棋盤內可以落子的地方條件。只要選擇的位置為空,就說明這個地方沒有被占用,可以下在這個地方。 3、if (x >= 1 && x <= row && y >= 1 && y <= col) 判斷選擇的范圍是否在棋盤內。 void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家走:>\n"); int x = 0; int y = 0; while (1) { printf("請輸入坐標:>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) //判斷可以落子在棋盤內的條件 { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐標被占用,請重新輸入\n"); } } else { printf("坐標非法,超出范圍\n"); } } } 實現電腦下棋: x = rand() % row; //隨機產生0~2的數字 y = rand() % col; //隨機產生0~2的數字 首先讓電腦隨機產生隨機值,由于row和col都是3,那么產生的數字%3就可以得到0~2的隨機數。 void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦走:>\n"); while (1) { x = rand() % row; //隨機產生0~2的數字 y = rand() % col; //隨機產生0~2的數字 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } 下棋過程: 分析這塊代碼邏輯: PlayerMove(board, ROW, COL); //實現玩家下棋 DisplayBoard(board, ROW, COL); //打印棋盤,方便看到每次下棋后的結果 ret = IsWin(board, ROW, COL); //每次下完棋后要分析接下來能否繼續下棋 if (ret != 'C') { break; } ComputerMove(board, ROW, COL); //實現電腦下棋 DisplayBoard(board, ROW, COL); //打印棋盤,方便看到每次下棋后的結果 ret = IsWin(board, ROW, COL); // //每次下完棋后要分析接下來能否繼續下棋 if (ret != 'C') { break; } char ret = 0; while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家贏\n"); } else if (ret == '#') { printf("電腦贏\n"); } else { printf("平局\n"); } } 主函數控制過程: srand( (unsigned int)time(NULL) ); //和之前的rand函數搭配使用,生成時間戳。要在循環外使用,防止時間戳被不停地改變, 之后形成的數字將不在隨機。 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("退出游戲"); break; default: printf("選擇錯誤"); break; } } while (input); return 0; } game.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include game.c #include "game.h" void InitBoard(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] = ' '; } } } void DisplayBoard(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++) // { // printf("%c", board[i][j]); // } // printf("\n"); //} //int i = 0; //for (i = 0;i < row; i++) //{ // //打印數據 // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[2]); //} 打印分割行 //if (i < row - 1) //{ // printf("---|---|---\n"); //} int i = 0; for (i = 0; i < row; i++) { //打印數據 int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } } printf("\n"); } } void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家走:>\n"); int x = 0; int y = 0; while (1) { printf("請輸入坐標:>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐標被占用,請重新輸入\n"); } } else { printf("坐標非法,超出范圍\n"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦走:>\n"); while (1) { x = rand() % row; //隨機產生0~2的數字 y = rand() % col; //隨機產生0~2的數字 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } char IsWin(char board[ROW][COL], int row, int col) { int flag = 1; int i = 0; int j = 0; //1、判斷輸贏 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][0] == '*' && board[i][1] == '*' && board[i][2] == '*' || board[0][j] == '*' && board[1][j] == '*' && board[2][j] == '*' || board[0][0] == '*' && board[1][1] == '*' && board[2][2] == '*' || board[0][2] == '*' && board[1][1] == '*' && board[2][0] == '*') { return '*'; } else if (board[i][0] == '#' && board[i][1] == '#' && board[i][2] == '#' || board[0][j] == '#' && board[1][j] == '#' && board[2][j] == '#' || board[0][0] == '#' && board[1][1] == '#' && board[2][2] == '#' || board[0][2] == '#' && board[1][1] == '#' && board[2][0] == '#') { return '#'; } else if (board[i][j] == ' ') { flag = 0; } } } //2、判斷平局 if (flag == 1) { return 'Q'; } //3、游戲繼續 else { return 'C'; } } test.c #include "game.h" void menu() { printf("***************************************\n"); printf("*********** 1. play *************\n"); printf("*********** 2. exit *************\n"); printf("***************************************\n"); } void game() { //三子棋的過程 char board[ROW][COL]; //棋盤數組 //初始化棋盤 - board的元素都給成空格 InitBoard(board, ROW, COL); //打印棋盤 DisplayBoard(board, ROW, COL); //下棋 char ret = 0; while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家贏\n"); } else if (ret == '#') { printf("電腦贏\n"); } else { 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("退出游戲"); break; default: printf("選擇錯誤"); break; } } while (input); return 0; } 來看看實現后的結果~ 5G游戲 C 語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。