三子棋的實作
本篇主要講述三子棋實作的思路
一、檔案的構成
1. test .c
游戲的主要功能的實作,包括選單、游戲棋盤、玩家操作、電腦操作、判斷輸贏,
//陣列的創立 char board[ROW][COL]; //初始化棋盤 InitBoard(board,ROW ,COL) //InitBoard(board[ROW][COL]); 這么寫是錯誤的 //列印棋盤 DisplayBoard(board , ROW , COL); //玩家下棋 PlayerMove(board, ROW, COL); //電腦下棋 ComputerMove(board, ROW, COL); //判斷玩家或電腦是否贏得游戲 char IsWin (char board [ROW][COL] , int row , int col);
2. game .c
主要是游戲功能的實作 自定義的一些函式
如初始化棋盤、列印棋盤、玩家下棋、電腦下棋
3 . game .h
主要是游戲包含的一些頭檔案和game .c和test .c需要參考的函式
#include<stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3 #define COL 3 //函式宣告 //初始化棋盤 void InitBoard (char board[ROW][COL], int row, int col); //列印棋盤 void DisplayBoard (char board[ROW][COL],int row, int col); //玩家下棋 void PlayerMove (char board[ROW][COL],int row , int col); //電腦下棋 void ComputerMove(char board[ROW][COL], int row, int col); char IsWin (char board [ROW][COL] , int row , int col);;
二、實作步驟分析
1. 選單欄
游戲開始時必須顯示游戲選單
游戲選單包括開始游戲 退出游戲
實作此程序用switch陳述句,輸入1開始游戲,輸入0退出游戲
選單代碼如下
void men() { printf("*************************\n"); printf("******1. play **********\n"); printf("******0. exit **********\n"); printf("*************************\n"); }因為我們要重復多次進入游戲
所以整個游戲必當在一個回圈里面
所以使用 ==do{}while()==回圈
int main() { srand((unsigned int)time(NULL)); int input = 0; do { men(); scanf("%d", &input); switch (input) { case 1: //printf("三子棋游戲\n"); game(); break;//==break跳出的是swich陳述句== case 0: break; default: printf("請重新輸入\n"); break; } } while (input); return 0; }
2. 準備棋盤
因為三子棋游戲的運行需要一個3*3的棋盤
我們用3*3的二維陣列代替棋盤
因為我們要在棋盤上放入#(電腦棋子)*(玩家棋子)所以我們創建字符型陣列
//陣列的創立 char board[ROW][COL];這里的ROW COL 我們要在game .h檔案中創建
#define ROW 3 #define COL 3
3. 初始化棋盤
我們在test .c檔案中創建初始化棋盤的函式
//初始化棋盤 InitBoard(board,ROW ,COL)我們還需在game .h中宣告函式
//初始化棋盤 在game .h中的宣告 void InitBoard (char board[ROW][COL], int row, int col); //board[ROW][COL]交代陣列的大小 用兩個整形row col接受我們在game .c 檔案中完成對函式的實作
void InitBoard(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++) { board[i][j] = ' '; } } }
4. 列印棋盤
列印棋盤就是列印陣列
在test .c檔案中創建列印棋盤的函式
//列印棋盤 DisplayBoard(board , ROW , COL);在game .h中宣告函式
//列印棋盤 void DisplayBoard (char board[ROW][COL],int row, int col);在game .c 檔案中完成對函式的實作
void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; //列印行 兩行看作一組 先列印第一行帶字符的 最后會有 “|”不列印 所以我們要在條件j《col-1 下進行列印“|” //因為第二行 最后不列印 “---|” 所以我們要在條件 i《 row - 1下進行 //在列印第二行 最后也會有“|”不列印 所以我們要在條件j《col-1 下進行列印“|” for (i = 0; i < row; i++) { 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"); } }
5. 玩家下棋
玩家下棋時要查看坐標是否被占用即當前二維陣列的位置是否為空格
玩家下棋 棋子使用 * 代替
切記 玩家使用的坐標第一行第一列坐標為(1 ,1)
所以在往陣列里輸入是我們需要行列皆減一
在test .c檔案中創建玩家下棋的函式
//玩家下棋 PlayerMove(board, ROW, COL);在game .h中宣告函式
//玩家下棋 void PlayerMove (char board[ROW][COL],int row , int col);在game .c 檔案中完成對函式的實作
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; } printf("坐標被占用請重新輸入"); //break; 不用跳出 } else { printf("請重新輸入"); //break; } } }
6.電腦下棋
電腦下棋則沒有像玩家下棋時那么麻煩 我們可以控制電腦只在有空格的地方下棋
其次**電腦下棋 使用的坐標和陣列的坐標一樣 **不需行列坐標減一
電腦下棋 棋子用 # 代替
%a 余數就是0 到 a-1之間
在test .c檔案中創建電腦下棋的函式
//電腦下棋 ComputerMove(board, ROW, COL);在game .h中宣告函式
//電腦下棋 void ComputerMove(char board[ROW][COL], int row, int col);在game .c 檔案中完成對函式的實作
這里需要使用**rand()函式 **我們需要添加兩個頭檔案
#include <stdlib.h> #include <time.h>還需再主函式里
srand((unsigned int)time(NULL));void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦走\n"); while (1) { int x = 0; int y = 0; x = rand() % row;//%a 余數就是0 到 a-1之間 y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
7.判斷輸贏
判斷輸贏的函式我們要在玩家和電腦每次下完棋后進行檢測
游戲有以下幾種結果
玩家贏 — 回傳 ‘ * ’
電腦贏 — 回傳 ‘ # ’
平局 — 回傳 ‘ Q ’
游戲繼續 — 回傳 ‘ c ’
注 一定要區分大小寫
我們要寫 Is Win 函式當回傳值是 “ * # Q ”時游戲結束 回傳值是 “c”時 游戲繼續
我們創建一個 全域變數 ret
當 ret 的回傳值 !=c (這里的意思是不等于c) 即游戲有結果了 使用break跳出回圈即可 代碼如下
判斷游戲是否有結果 ret = IsWin(board, ROW, COL); if (ret != 'c') break; if (ret == '*') { printf("玩家贏得游戲\n"); } else if (ret == '#') { printf("電腦贏得游戲\n"); } else { printf("平局\n"); } DisplayBoard(board, ROW, COL); //最后在列印一下棋盤即可接下來我們開始寫 Is Win 函式
在game .h 中宣告 Is Win 函式
//判斷輸贏 char IsWin (char board [ROW][COL] , int row , int col);在game .c 檔案中完成對函式的實作
驗證三行 三列 對角線 中的字符是否一樣 一樣的話回傳當前字符即可
列如 三行中 我們只需利用for回圈 驗證每行中 的字符是否一樣
平局如何實作呢
我們需要創建一個Is Full函式 有空格回傳0 沒有空格回傳1
當棋盤上沒有空格時 即為平局
int IsFull(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; }char IsWin(char board[ROW][COL], int row, int col) { int i = 0; //int j = 0; //驗證 三行 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') { return board[i][1]; } } //驗證三列 for (i= 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][i]; } } //驗證對角線 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } int ret = IsFull(board , row , col); if (ret == 1) { return 'Q'; } return 'c'; }
三、test .c 檔案
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "game.h" void men() { printf("*************************\n"); printf("******1. play **********\n"); printf("******0. exit **********\n"); printf("*************************\n"); } void game() { char ret = 0; char board[ROW][COL]; //初始化棋盤 InitBoard(board , ROW , COL); //列印棋盤 DisplayBoard(board , ROW , COL); 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"); } DisplayBoard(board, ROW, COL); } int main() { srand((unsigned int)time(NULL)); int input = 0; do { men(); scanf("%d", &input); switch (input) { case 1: //printf("三子棋游戲\n"); game(); break; case 0: break; default: printf("請重新輸入\n"); break; } } while (input); return 0; }————————————— 游戲結束——————————————
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317681.html
標籤:其他
上一篇:【C語言基礎】井字棋小游戲
下一篇:關于unity 目錄出錯的問題
