C語言三子棋小游戲?qū)崿F(xiàn)全程
前言
很高興為大家?guī)砣制宓臄U(kuò)展版本
game.h
在這個文件中我們完成對代碼的函數(shù)聲明,常量的定義和頭文件的包含。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> #include<stdlib.h> //定義行和列 #define ROW 3 #define COL 3 //函數(shù)聲明 void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayMove(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); int IsFull(char board[ROW][COL], int row, int col);
test.c
這里我們測試三子棋游戲?qū)崿F(xiàn)的邏輯
#define _CRT_SECURE_NO_WARNINGS #include"game.h" void menu() { printf("***********************\n"); printf("****1.play 0.exit ****\n"); printf("***********************\n"); } void game() { char board[ROW][COL] = { 0 }; //初始化棋盤 InitBoard(board, ROW, COL); //打印棋盤 DisplayBoard(board, ROW, COL); char ret = 0; //下棋 while (1) { //玩家下 PlayMove(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"); } if (ret == '#') { printf("人機(jī)都打不過,好好反省噢!\n"); } if (ret == 'Q') { printf("遇見了旗鼓相當(dāng)?shù)膶κ謀n"); } } int main() { srand((unsigned int)time(NULL));//設(shè)置隨機(jī)數(shù)的種子 int input = 0; do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤,請重新選擇\n"); break; } } while (input); return 0; }
game.c
在這個文件中,我們主要完成對游戲代碼的實現(xiàn)。
#define _CRT_SECURE_NO_WARNINGS #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 < row;j++) { //打印數(shù)據(jù) printf(" %c ", board[i][j]); //打印| if (j < col - 1) { printf("|"); } } printf("\n"); //打印分割線 if (i < row - 1) { for (j = 0;j < row;j++) { printf("---"); //打印| if (j < col - 1) { printf("|"); } } } printf("\n"); } printf("\n"); } //玩家下棋"*" void PlayMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下\n"); while (1) { printf("請輸入坐標(biāo):>"); scanf("%d%d", &x, &y); //坐標(biāo)判斷 if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐標(biāo)被占用,請重新選擇坐標(biāo)\n"); } } else { printf("坐標(biāo)非法,請重新選擇\n"); } } } //電腦下 //電腦找空位置隨機(jī)下 void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦下\n"); while (1) { int x = rand() % row;//生成0~2的數(shù) int y = rand() % col;//生成0~2的數(shù) if (board[x][y] == ' ') { board[x ][y ] = '#'; break; } } } //判斷棋盤是否滿 //滿了就返回 1 //不滿就返回 0 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; } //判斷輸贏 //玩家贏返回 "*" //電腦贏 "#" //平局 "Q" //繼續(xù) "C" char IsWin(char board[ROW][COL], int row, int col) { //每行相等 int i = 0; int j = 0; int count = 0;//記錄相同棋子數(shù) for (i = 0;i < row;i++) { count = 0; for (j = 0;j < col - 1;j++) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') { count++; } } if (count == row - 1) { return board[i][j]; } } //每列相等 for (i = 0;i < col;i++) { count = 0; for (j = 0;j < row - 1;j++) { if (board[j][i] == board[j+1][i] && board[j][i] != ' ') { count++; } } if (count == col - 1) { return board[j][i]; } } //對角線相等 //第一條 count = 0; for(i = 0,j = 0;i<row-1&&j<col-1;i++,j++) { if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } //第二條對角線 //此次要記得把count重新歸零 count = 0; 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] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } if (IsFull(board, ROW, COL)) { return 'Q'; } return 'C'; }
游戲代碼實現(xiàn)的過程
對于三子棋游戲?qū)崿F(xiàn)的思路是很重要的,讓博主帶領(lǐng)大家看看到底是如何實現(xiàn)的吧。
1 初始化棋盤
我們要實現(xiàn)棋盤的設(shè)計,要借助于二維數(shù)組board,很明顯剛剛開始棋盤中是上面都沒有的,我們就要二維數(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] = ' '; } } }
2 打印棋盤
為了打印出我們所需要的棋盤,這里我們要好好研究一下。棋盤如下:
我們可以看到棋盤可以分為三個部分:
一部分:打印數(shù)據(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 < row;j++) { //打印數(shù)據(jù) printf(" %c ", board[i][j]); //打印| if (j < col - 1) { printf("|"); } } printf("\n"); //打印分割線 if (i < row - 1) { for (j = 0;j < row;j++) { printf("---"); //打印| if (j < col - 1) { printf("|"); } } } printf("\n"); } printf("\n"); }
3 玩家下
這里我們用" * "代表玩家下的棋子。
//玩家下棋"*" void PlayMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下\n"); while (1) { printf("請輸入坐標(biāo):>"); scanf("%d%d", &x, &y); //坐標(biāo)判斷 if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐標(biāo)被占用,請重新選擇坐標(biāo)\n"); } } else { printf("坐標(biāo)非法,請重新選擇\n"); } } }
4 電腦下
這里我們就讓電腦隨機(jī)找個空位下,后期博主會繼續(xù)完善代碼,讓電腦看起來跟加智能。
//電腦下 //電腦找空位置隨機(jī)下 void ComputerMove(char board[ROW][COL], int row, int col) { printf("電腦下\n"); while (1) { int x = rand() % row;//生成0~2的數(shù) int y = rand() % col;//生成0~2的數(shù) if (board[x][y] == ' ') { board[x ][y ] = '#'; break; } } }
5 判斷棋盤是否已滿
我們規(guī)定 :
滿了就返回 1
不滿就返回 0
//判斷棋盤是否滿 //滿了就返回 1 //不滿就返回 0 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; }
6 判斷輸贏
我們規(guī)定:
玩家贏就返回:" * "
電腦贏就返回:" # "
平局就返回:" Q "
繼續(xù)就返回:" C "
//判斷輸贏 //玩家贏返回 "*" //電腦贏 "#" //平局 "Q" //繼續(xù) "C" char IsWin(char board[ROW][COL], int row, int col) { //每行相等 int i = 0; int j = 0; int count = 0;//記錄相同棋子數(shù) for (i = 0;i < row;i++) { count = 0; for (j = 0;j < col - 1;j++) { if (board[i][j] == board[i][j + 1] && board[i][j] != ' ') { count++; } } if (count == row - 1) { return board[i][j]; } } //每列相等 for (i = 0;i < col;i++) { count = 0; for (j = 0;j < row - 1;j++) { if (board[j][i] == board[j+1][i] && board[j][i] != ' ') { count++; } } if (count == col - 1) { return board[j][i]; } } //對角線相等 //第一條 count = 0; for(i = 0,j = 0;i<row-1&&j<col-1;i++,j++) { if (board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } //第二條對角線 //此次要記得把count重新歸零 count = 0; 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] != ' ') { count++; } } if (count == col - 1) { return board[i][j]; } if (IsFull(board, ROW, COL)) { return 'Q'; } return 'C'; }
到這里游戲的設(shè)計就完成了,大家心里有了一些理解吧,我們這個三字棋,不僅僅可以下三字棋,還可以下五字棋,甚至N字棋大家要改只要改變ROW和COL的定義的常量就可以了。
//定義行和列
#define ROW 3
#define COL 3
到此這篇關(guān)于C語言三子棋小游戲?qū)崿F(xiàn)全程的文章就介紹到這了,更多相關(guān)C語言三子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析c語言中"函數(shù)調(diào)用中缺少哨兵"的情況分析
本篇文章是對c語言中"函數(shù)調(diào)用中缺少哨兵"的情況進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Matlab實現(xiàn)極坐標(biāo)堆疊柱狀圖的繪制
極坐標(biāo)堆疊圖也是風(fēng)玫瑰圖的常用形式,MATLAB的bar繪制的條形圖可以繪制成堆疊形式,但是并沒有一個自帶函數(shù)可以繪制極坐標(biāo)堆疊圖。本文將為大家提供Matlab繪制極坐標(biāo)堆疊柱狀圖的示例代碼,需要的可以參考一下2022-08-08C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題
這篇文章我們九里講講C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容2021-09-09C語言使用ffmpeg實現(xiàn)單線程異步的視頻播放器
這篇文章主要為大家詳細(xì)介紹了C語言如何使用ffmpeg實現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-12-12