C語言:3*3棋盤實現三子棋
阿新 • • 發佈:2019-01-09
三子棋的實現功能:
通過輸入座標確認下棋地點,與電腦對戰,電腦產生隨機數(隨機座標)。
輸出棋盤,並判斷玩家與電腦的輸贏,輸出贏家。
text.c寫大概的邏輯,通過呼叫各個函式判斷是否開始遊戲,並寫一個簡易的判斷輸贏的函式。text.c需要呼叫標頭檔案#include "game.h"。#include<stdio.h> #include<stdlib.h> #include"game.h" #include<windows.h> void start_game(char arr[ROWS][COLS]) { show_arr(arr, ROWS, COLS); //輸出棋盤; while (1) { player_game(arr, ROWS, COLS);//玩家開始玩遊戲; if (check(arr) == 'p') { break; } show_arr(arr, ROWS, COLS); printf("電腦開始下棋:>\n"); computer_game(arr, ROWS, COLS);//電腦開始玩遊戲; if (check(arr) == 'c') { break; } Sleep(1000); show_arr(arr, ROWS, COLS); } if (check(arr) == 'p') { printf("玩家獲勝\n"); } else { printf("電腦獲勝\n"); } } void menu() //簡易的選單輸出; { printf("**************************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("**************************\n"); } void game() { int tmp = 0; char arr[ROWS][COLS] = { 0 };//初始化棋盤輸出 ROWS,COLS巨集定義大小; init_arr(arr, ROWS, COLS); srand((unsigned)time(NULL));//產生隨機數,此處需要呼叫標頭檔案#include<time.h> menu(); printf("請選擇是否開始玩遊戲:>"); scanf("%d", &tmp); switch (tmp) { case PLAY: start_game(arr); break; case EXIT: break; } } int main() { game(); system("pause"); return 0; }
game.c主要寫text.c呼叫的函式,實現三子棋的主要函式功能。#include<stdio.h> #include<stdlib.h> #include"game.h" void init_arr(char arr[ROWS][COLS]) //給棋盤複製為空格’ ’; { int i = 0; int j = 0; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { arr[i][j] = ' '; } } } void show_arr(char arr[ROWS][COLS]) //按一定格式輸出棋盤; { int i = 0; for (i = 0; i < ROWS; i++) { printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]); if (i != 2) { printf("---|---|--- \n"); } } } void player_game(char arr[ROWS][COLS]) //玩家開始玩遊戲 { int x = 0; int y = 0; while (1) { printf("請玩家輸入座標:>"); scanf("%d %d", &x, &y); //判斷座標是否合法; if ((x > 0 && x <= 3) && (y > 0 && y <= 3)) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = 'X'; break; } else { printf("座標不可以使用.\n"); } } else { printf("座標輸入不合法\n"); } } } void computer_game(char arr[ROWS][COLS]) //電腦開始玩遊戲 { while (1) { int x = rand() % 3; //此處產生隨機數,對3取餘,使x,y的座標數為0或者1或者2; int y = rand() % 3; if (arr[x][y] == ' ') { arr[x][y] = '0'; break; } } } char check(char arr[ROWS][COLS]) { int i = 0; //判斷玩家的輸贏; for (i = 0; i < ROWS; i++)//判斷三個行數是否均為X,是的話返回p,代表player獲勝; { if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])) && (arr[i][0] == 'X')) return 'p'; } for (i = 0; i < COLS; i++)//判斷三個列數是否均為X,是的話返回p,代表player獲勝; { if (((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i])) && (arr[0][i] == 'X')) return 'p'; } //用兩個if語句判斷兩個對角是否均為X,是的話返回p,代表player獲勝; if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2])) && (arr[1][1] == 'X')) { return 'p'; } if (((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0])) && (arr[1][1] == 'X')) { return 'p'; } //判斷電腦的輸贏; for (i = 0; i < ROWS; i++) { if (((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])) && (arr[i][0] == '0')) return 'c'; } for (i = 0; i < COLS; i++) { if (((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i])) && (arr[0][i] == '0')) return 'c'; } if (((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2])) && (arr[1][1] == '0')) { return 'c'; } if (((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0])) && (arr[1][1] == '0')) { return 'c'; } }
1、初始化棋盤;
2、輸出棋盤;
3、玩家和電腦分別下棋;
4、判斷輸贏;
此處的函式宣告均放在下面的game.h標頭檔案中,因此此處應該寫入#include "game.h"
三子棋的主要程式碼如上。可以寫在一個.c檔案中,像上面這樣,程式碼容易讀懂。#define _CRT_SECURE_NO_WARNINGS 1 #ifndef __GAME_H__ #define __GAME_H__ #define ROWS 3 //定義行數; #define COLS 3 //定義列數; enum XP //列舉 使得選擇選單容易理解1.play 0.exit; { PLAY = 1, EXIT = 0 }; //函式的宣告; void init_arr(char arr[ROWS][COLS]); void show_arr(char arr[ROWS][COLS]); void player_game(char arr[ROWS][COLS]); void computer_game(char arr[ROWS][COLS]); char check(char arr[ROWS][COLS]); #endif