C語言三子棋小游戲?qū)崿F(xiàn)全程
前言
很高興為大家?guī)砣制宓臄U展版本
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("人機都打不過,好好反省噢!\n");
}
if (ret == 'Q')
{
printf("遇見了旗鼓相當(dāng)?shù)膶κ謀n");
}
}
int main()
{
srand((unsigned int)time(NULL));//設(shè)置隨機數(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("請輸入坐標:>");
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;
}
else
{
printf("坐標被占用,請重新選擇坐標\n");
}
}
else
{
printf("坐標非法,請重新選擇\n");
}
}
}
//電腦下
//電腦找空位置隨機下
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("請輸入坐標:>");
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;
}
else
{
printf("坐標被占用,請重新選擇坐標\n");
}
}
else
{
printf("坐標非法,請重新選擇\n");
}
}
}4 電腦下
這里我們就讓電腦隨機找個空位下,后期博主會繼續(xù)完善代碼,讓電腦看起來跟加智能。
//電腦下
//電腦找空位置隨機下
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)用中缺少哨兵"的情況進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題
這篇文章我們九里講講C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容2021-09-09
C語言使用ffmpeg實現(xiàn)單線程異步的視頻播放器
這篇文章主要為大家詳細介紹了C語言如何使用ffmpeg實現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下2022-12-12

