11.C語言實現【N子棋】
阿新 • • 發佈:2022-12-04
C語言實現一個大家小時候都玩過的小遊戲的進階版本,不止是三子棋,可以根據玩家需要設定棋盤大小。的可讀性,我將原始碼分為了三個部分,分別是原始檔test.c
、game.c
、game.h
。
test.c
部分是遊戲進入、開始、結束的骨幹程式碼。
game.c
是遊戲的具體如何實現的程式碼。
game.h
是所有自定義函式以及庫函式的標頭檔案包含、函式宣告以及巨集定義。
可以根據需要自行設定ROW和COL的值達到改變棋盤大小以及勝利條件。
標頭檔案
game.h
#pragma once #include<stdio.h> #include<time.h> #include<stdlib.h> #include<Windows.h> #define ROW 3 //棋盤的行數 #define COL 3 //棋盤的列數 //game函式 void game(); //列印簡易遊戲選單 void menu(); //初始化棋盤 void init_board(char board[ROW][COL], int row, int col); //列印棋盤 void print_board(char board[ROW][COL], int row, int col); //電腦下棋 void computer_chess(char board[ROW][COL], int row, int col); //玩家下棋 void player_playing_chess(char board[ROW][COL], int row, int col); //判斷是否有一方獲勝 char judge_wins(char board[ROW][COL], int row, int col); //判斷是否已經平局 int is_full(char board[ROW][COL], int row, int col);
主函式
test.c
#include"game.h" int main() { //播種由函式 rand 使用的隨機數發生器 srand((unsigned int)time(NULL)); menu(); int input = 0; do { printf("請輸入->\n"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出遊戲\n"); break; default: printf("輸入錯誤:\n"); break; } } while(input); return 0; }
具體實現遊戲的函式
game.c
#include"game.h" void game() { char board[ROW][COL] = { 0 }; init_board(board, ROW, COL); print_board(board, ROW, COL); char ret = 0; while (1) { computer_chess(board, ROW, COL); //判斷是否結束 ret = judge_wins(board, ROW, COL); print_board(board, ROW, COL); if (ret) break; player_playing_chess(board, ROW, COL); //判斷是否結束 ret = judge_wins(board, ROW, COL); print_board(board, ROW, COL); if (ret) break; } //結束後列印棋盤 print_board(board, ROW, COL); //根據返回值ret判斷勝利的一方 if (ret == '#') printf("玩家勝利!\n"); else if (ret == '*') printf("電腦勝利!\n"); else if (ret == 'Y') printf("平局\n"); } //選單 void menu() { printf("***************************\n"); printf("* ****** MENU ******* *\n"); printf("* ******1.play******* *\n"); printf("* ******0.exit******* *\n"); printf("* ******************* *\n"); printf("***************************\n"); } //初始化棋盤 void init_board(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 print_board(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"); } } } //玩家下棋,玩家下棋記為 # void player_playing_chess(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; printf("玩家下棋\n"); printf("請輸入座標\n"); while (1) { scanf("%d %d", &i, &j); if (i > 0 && i <= row && j > 0 && j <= col && board[i - 1][j - 1] == ' ') { board[i - 1][j - 1] = '#'; break; } else printf("座標非法,請重新輸入:\n"); } } //電腦下棋,記為 * void computer_chess(char board[ROW][COL], int row, int col) { printf("電腦下棋\n"); while (1) { int i = rand() % row;//滿足棋盤的座標 int j = rand() % col; if (board[i][j] == ' ') { board[i][j] = '*'; break; } } } //判斷是否有一方已經贏下對局 char judge_wins(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; char ret = 0; //檢查行 for (i = 0; i < row; ++i) { ret = 1; for (j = 0; j < col - 1; ++j) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ' ) ; else { ret = 0; break; } } if (ret) return board[i][j]; } //檢查列 for (j = 0; j < col; j++) { ret = 1; for (i = 0; i < row - 1; i++) { if (board[i][j] == board[i + 1][j] && board[i][j] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][j]; } //檢查對角線 ret = 1; for (i = 0,j = 0; i < row - 1 && j < col -1; i++,j++) { if (board[i][i] == board[i + 1][i + 1] && board[i][i] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][i]; //檢查對角線 ret = 1; for (i = 0,j = col - 1; i < row - 1 && j > 0; i++,j--) { if (board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ') ; else { ret = 0; break; } } if (ret) return board[i][j]; //檢查是否平局 if (is_full(board, row, col)) return 'Y'; //繼續 return 0; } //檢查是否棋盤是否已滿 int is_full(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++) { if (board[i][j] == ' ') return 0; } } return 1; }