這次照著網站上的內容,寫了一個簡單的小遊戲,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進化的話,可以按照:人類將要輸入什麼地方獲得勝利,提前進行檢測,之後佔位,最終達到平局.....等想法來進行修改