重溫c語言之,7天開整,就是隨便的寫寫,第九天

我是一个小笨蛋發表於2024-11-11

這次照著網站上的內容,寫了一個簡單的小遊戲,3字棋,其實也可以n字棋

附上程式碼,

這裡是:game.h

 1 #pragma once
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<time.h>
 5 
 6 //遊戲程式碼的宣告(函式宣告,符號定義)
 7 
 8 #define Row 3
 9 #define Col 3
10 
11 //初始化棋盤
12 void InitBoard(char board[Row][Col], int Row_n, int Col_n);
13 //列印棋盤
14 void DisplayBoard(char board[Row][Col], int Row_n, int Col_n);
15 //玩家下棋
16 void PlayerMove(char board[Row][Col], int Row_n, int Col_n);
17 //電腦下棋,隨機生成座標
18 void ComputerMove(char board[Row][Col], int Row_n, int  Col_n);
19 
20 //玩家贏:Congratulation!---'*'
21 //電腦贏:Lost!-----"#'
22 //平局:The game ends in a tie.---'Q'
23 //繼續:Go on!-----'C'
24 char IsWin(char board[Row][Col], int Row_n, int  Col_n);

之後是:game.c

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include "game.h"
  3 
  4 //三子棋
  5 //程式碼的實現
  6 
  7 
  8 void InitBoard(char board[Row][Col], int Row_n, int Col_n) {
  9     int i = 0;
 10     int j = 0;
 11     for (i = 0; i < Row_n; i++)
 12     {
 13         for (j = 0; j < Col_n; j++) {
 14             board[i][j] = ' ';
 15         }
 16     }
 17 }
 18 
 19 //第一版本
 20 //void DisplayBoard(char board[Row][Col], int Row_n, int Col_n) {
 21 //    int i = 0;
 22 //    for (i = 0; i < Row_n; i++)
 23 //    {
 24 //        //列印資料
 25 //        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
 26 //        //列印分隔符
 27 //        if (i < Row_n - 1) {
 28 //            printf("---|---|---\n");
 29 //        }
 30 //    }
 31 //}
 32 
 33 //第二版本,為了更好的擴充套件地圖
 34 void DisplayBoard(char board[Row][Col], int Row_n, int Col_n) {
 35     int i = 0, j = 0, z = 0;
 36     for (i = 0; i < Row_n; i++)
 37     {
 38         for (j = 0; j < Col_n; j++)
 39         {
 40             //列印資料
 41             printf(" %c ", board[i][j]);
 42             //列印分隔符
 43             if (j < Col_n - 1)
 44             {
 45                 printf("|");
 46             }
 47         }
 48         printf("\n");
 49         if (i < Row_n - 1) {
 50             for (z = 0; z < Col_n; z++)
 51             {
 52                 printf("---");
 53                 if (z < Row_n - 1) {
 54                     printf("|");
 55                 }
 56             }
 57             printf("\n");
 58         }
 59 
 60     }
 61 }
 62 
 63 void PlayerMove(char board[Row][Col], int Row_n, int Col_n) {
 64     int x = 0, y = 0;
 65     printf("玩家下棋:\n");
 66     while (1) {
 67         printf("請輸入座標(x:%d-%d之間,y:%d-%d之間):>", 1, Row_n, 1, Col_n);
 68         if (scanf("%d %d", &x, &y) == 2) { // 檢查是否成功讀取兩個整數
 69             if (x >= 1 && x <= Row_n && y >= 1 && y <= Col_n) {
 70                 if (board[x - 1][y - 1] == ' ') {
 71                     board[x - 1][y - 1] = '*';
 72                     break;
 73                 }
 74                 else {
 75                     printf("座標被佔用,不能被下棋,請選擇其他的位置\n");
 76                 }
 77             }
 78             else {
 79                 printf("座標非法,請重新輸入\n");
 80             }
 81         }
 82         else {
 83             printf("輸入錯誤,請輸入兩個整數座標\n");
 84         }
 85         while (getchar() != '\n'); // 清空輸入緩衝區
 86     }
 87 
 88 }
 89 
 90 void ComputerMove(char board[Row][Col], int Row_n, int  Col_n) {
 91     printf("電腦下棋:>\n");
 92     int x = 0, y = 0;
 93     while (1) {
 94         x = rand() % Row_n;//0~Row_n-1
 95         y = rand() % Col_n;//0~Col_n-1
 96         if (board[x][y] == ' ') {
 97             board[x][y] = '#';
 98             break;
 99         }
100     }
101 
102 }
103 //如果滿了,則返回1
104 //不滿,則返回0
105 int IsFull(char board[Row][Col], int Row_n, int  Col_n) {
106     int i = 0,j=0;
107     for (i = 0; i < Row_n; i++)
108     {
109         for ( j = 0; j < Col_n; j++)
110         {
111             if (board[i][j] == ' ') {
112                 return 0;
113             }
114         }
115     }
116     return 1;
117 }
118 char IsWin(char board[Row][Col], int Row_n, int Col_n) {
119     // 判斷行
120     for (int i = 0; i < Row_n; i++) {
121         char rowChar = board[i][0];
122         for (int j = 0; j < Col_n; j++) {
123             if (board[i][j] == '|' || board[i][j] == '---' || board[i][j] == ' ') {
124                 continue; // 跳過分隔符和空位
125             }
126             if (board[i][j] != rowChar) {
127                 break; // 如果字元不匹配,則檢查下一行
128             }
129             if (j == Col_n - 1) { // 如果整行元素都相等
130                 return rowChar;
131             }
132         }
133     }
134 
135     // 判斷列
136     for (int j = 0; j < Col_n; j++) {
137         char colChar = board[0][j];
138         for (int i = 0; i < Row_n; i++) {
139             if (board[i][j] == '|' || board[i][j] == '---' || board[i][j] == ' ') {
140                 continue; // 跳過分隔符和空位
141             }
142             if (board[i][j] != colChar) {
143                 break; // 如果字元不匹配,則檢查下一列
144             }
145             if (i == Row_n - 1) { // 如果整列元素都相等
146                 return colChar;
147             }
148         }
149     }
150 
151     // 判斷主對角線
152     char diagMainChar = board[0][0];
153     for (int i = 1; i < Row_n; i++) {
154         if (board[i][i] == '|' || board[i][i] == '---' || board[i][i] == ' ') {
155             continue; // 跳過分隔符和空位
156         }
157         if (diagMainChar != board[i][i]) {
158             break; // 如果字元不匹配,則遊戲繼續
159         }
160         if (i == Row_n - 1) { // 如果主對角線相等且不為空
161             return diagMainChar;
162         }
163     }
164 
165     // 判斷副對角線
166     char diagSecChar = board[0][Col_n - 1];
167     for (int i = 0; i < Row_n; i++) {
168         if (board[i][Col_n - 1 - i] == '|' || board[i][Col_n - 1 - i] == '---' || board[i][Col_n - 1 - i] == ' ') {
169             continue; // 跳過分隔符和空位
170         }
171         if (diagSecChar != board[i][Col_n - 1 - i]) {
172             break; // 如果字元不匹配,則遊戲繼續
173         }
174         if (i == Row_n - 1) { // 如果副對角線相等且不為空
175             return diagSecChar;
176         }
177     }
178 
179     // 檢查是否平局或遊戲繼續
180     if (IsFull(board, Row_n, Col_n)) {
181         return 'Q';  // 平局
182     }
183 
184     return 'C';  // 遊戲繼續
185 }

最後是:test.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 
 4 //測試遊戲的邏輯
 5 
 6 #include"game.h"
 7 
 8 void manu() {
 9     printf("************************\n");
10     printf("*****    1.play    *****\n");
11     printf("*****    0.exit    *****\n");
12     printf("************************\n");
13 }
14 
15 void game() {
16     char ret = 'C';
17     char board[Row][Col] = { 0 };
18     //初始化棋盤的功能
19     InitBoard(board, Row, Col);
20     //列印棋盤
21     DisplayBoard(board, Row, Col);
22     //下棋,玩家先下
23     while (1) {
24         PlayerMove(board, Row, Col);
25         //判斷輸贏
26         ret = IsWin(board, Row, Col);
27         if (ret != 'C') {
28             break;
29         }
30         DisplayBoard(board, Row, Col);
31         ComputerMove(board, Row, Col);
32         //判斷輸贏
33         ret = IsWin(board, Row, Col);
34         if (ret != 'C') {
35             break;
36         }
37         DisplayBoard(board, Row, Col);
38     }
39     if (ret == '*')
40     {
41         printf("恭喜玩家獲勝!\n");
42     }
43     else if (ret == '#') {
44         printf("電腦獲勝!\n");
45     }
46     else if(ret=='Q')
47     {
48         printf("平局!\n");
49     }
50     
51     DisplayBoard(board, Row, Col);
52 }
53 
54 
55 int main() {
56     srand((unsigned int)time(NULL));
57     int input = 0;
58     do {
59         manu();
60         printf("請輸入選項:");
61         scanf("%d", &input);
62         switch (input) {
63         case 1:
64             game();
65             break;
66         case 0:
67             printf("退出遊戲\n");
68             break;
69         default:
70             printf("輸入錯誤!\n");
71             break;
72         }
73     } while (input != 0); // 只有當input為0時,迴圈才會結束
74     return 0;
75 }

我這裡的用法都比較簡單,只是運用了if-else,for迴圈,函式等用法,沒有用到十分高明的手段

注:我這裡的電腦判斷部分比較人機,十分的差勁,如果想要進一步改進or進化的話,可以按照:人類將要輸入什麼地方獲得勝利,提前進行檢測,之後佔位,最終達到平局.....等想法來進行修改

相關文章