C語言版的三子棋游戲
本文實例為大家分享了C語言版三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
一、游戲說明
三子棋相信大家都不陌生,小時候經(jīng)常在紙上畫出九宮格就可以直接和小伙伴一起玩,規(guī)則就是誰先在九宮格中下出同一行三個一樣,或者同一列三個一樣,又或者對角線的三個一樣的棋子,誰就獲勝;其實在編程中,代碼也能實現(xiàn)人機版的三子棋小游戲,讓我們一起來看看如何實現(xiàn)的吧!
二、游戲設計步驟
將三子棋游戲的實現(xiàn)邏輯分為以下步驟:
1.創(chuàng)建菜單(選擇玩游戲或者退出游戲)
2.創(chuàng)建和初始化游戲棋盤(本質(zhì)上為一個二維數(shù)組)
3.打印出棋盤
4.玩家下棋(用‘ * '表示棋子)
5.判斷輸贏或者是否平局
6.電腦下棋(用‘ # '表示棋子)
7.判斷輸贏(同第5步)
8.回到第3步直至確定輸贏
三、代碼實現(xiàn)
1.創(chuàng)建菜單
規(guī)定輸入 1 為玩游戲,輸入 0 為退出游戲
void menu() { printf("******************************\n"); printf("********** 1.play **********\n"); printf("********** 0.exit **********\n"); printf("******************************\n"); }
2.創(chuàng)建和初始化游戲棋盤
本質(zhì)為創(chuàng)建一個二維數(shù)組并初始化
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] = ' '; } } }
3.打印出棋盤
利用循環(huán)的方式將字符排版成棋盤的樣式(n x n 的棋盤也同樣可以打?。?/p>
void DisplayBoard(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++) { 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"); } }
4.玩家下棋
規(guī)定玩家的棋子為字符‘ * ',同時需判斷棋子坐標的合理性
void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走\n"); printf("請輸入坐標>:"); while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//判斷游戲合法性 { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else printf("坐標已被占用,請重新輸入\n"); } else printf("坐標非法,請重新輸入\n"); } }
5.電腦下棋
規(guī)定電腦的棋子為字符‘ # ',同樣需判斷棋子坐標的合理性
void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦走\n"); while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
6.判斷輸贏或者是否平局
規(guī)定電腦贏返回字符‘ # ',玩家贏返回字符‘ * ',游戲繼續(xù)返回字符‘C',平局(即棋盤滿但還未出現(xiàn)勝負)則返回字符‘Q';而這里我們又需要注意,判斷輸贏的函數(shù)需返回一個字符,所以判斷棋盤是否已滿的函數(shù)需在判斷輸贏的函數(shù)中并且能返回一個字符,這樣才能保證游戲輸贏判斷的完整性
(1)判斷輸贏函數(shù):
char IsWin(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//判斷行是否相等 return board[i][0]; } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判斷列是否相等 return board[0][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[2][0] != ' ')//判斷對角線 { return board[0][2]; } int ret = IsFull(board, row , col ); if (ret == 0) { return 'Q'; } else return 'C'; }
(2)判斷棋盤是否已滿的函數(shù)
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 1; } } return 0; }
以上是各各步驟函數(shù)的具體實現(xiàn),而為了方便,我們將代碼分為三個文件:
1.game.h------關于游戲相關的函數(shù)聲明,符號聲明及頭文件的包含
2.game.c------游戲相關函數(shù)的實現(xiàn)
3.test.c------測試游戲的邏輯
具體如下:
game.h文件:
#include<stdio.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);
game.c文件:
#include"game.h" 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] = ' '; } } } void DisplayBoard(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++) { 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 PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走\n"); printf("請輸入坐標>:"); while (1) { scanf("%d %d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else printf("坐標已被占用,請重新輸入\n"); } else printf("坐標非法,請重新輸入\n"); } } void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦走\n"); while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } 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 1; } } return 0; } char IsWin(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') return board[i][0]; } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') return board[0][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][2] && board[2][0] != ' ') { return board[0][2]; } int ret = IsFull(board, row , col ); if (ret == 0) { return 'Q'; } else return 'C'; }
test.c文件:
#include"game.h" void menu() { printf("******************************\n"); printf("********** 1.play **********\n"); printf("********** 0.exit **********\n"); printf("******************************\n"); } void game() { char board[ROW][COL];//定義棋盤 InitBoard(board, ROW, COL);//初始化棋盤 DisplayBoard(board, ROW, COL);//打印棋盤 char ret = 0; // 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"); } if(ret=='Q') { printf("平局\n"); } DisplayBoard(board, ROW, COL); } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("游戲結(jié)束\n"); break; default: printf(",文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下輸入錯誤,請重新輸入\n"); } } while (input); return 0; }
四、運行效果
玩游戲的三種情況分別如下:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++編程模板匹配超詳細的識別手寫數(shù)字實現(xiàn)示例
大家好!本篇文章是關于手寫數(shù)字識別的,接下來我將在這里記錄我的手寫數(shù)字識別的從零到有,我在這里把我自己的寫代碼過程發(fā)出來,希望能幫到和我一樣努力求知的人2021-10-10對比C語言中getc()函數(shù)和ungetc()函數(shù)的使用
這篇文章主要介紹了對比C語言中getc()函數(shù)和ungetc()函數(shù)的使用,是C語言入門學習中的基礎知識,需要的朋友可以參考下2015-08-08C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度
這篇文章主要為大家詳細介紹了C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10C++利用棧實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式
這篇文章主要為大家詳細介紹了C++利用棧實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04