本文是使用C语言实现三子棋过程中的的思路详解,阅读代码时结合本文可以对代码起到答疑的作用,加快理解。
项目链接:三子棋项目链接
一、功能介绍
本三子棋项目实现了最基础的三子棋功能,详细功能如下:
1、可以改变棋盘的大小(通过宏定义改变)
2、可以连续进行游戏
3、人先下棋,电脑后下棋
4、电脑下棋无智能性,为随机下棋
二、整体流程
整体流程图如下,其中云朵气泡中为函数名称:
三、函数详解
1、PrintChessboard
棋盘打印函数,功能:在初始时打印空棋盘、在玩家和电脑每一步下棋后打印当前棋盘。
想要达成的棋盘格式如下:
它是由符号‘_’和符号‘|’组成的。最后一列无‘|’,最后一行无‘_ _ _’。实现代码如下所示:
//打印棋盘格
void PrintChessboard(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!=col-1){//最后一行不打印‘_ _ _’
for(j=0;j<col;j++){
printf("---");
if(j!=col-1) printf("|");//最后一列不打印‘|’
else printf("\n");
}
}
}
printf("\n");
}
同时,在每一局开始时都要对棋盘格中的内容进行初始化。将棋盘每一个格子中的内容都初始化为’ '。
InitChessboard函数如下:
初始化棋盘,功能,在每一局游戏结束后/开始前将期盼中每一个格子的元素都更改为空格。代码如下:
//初始化棋盘格
void InitChessboard(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、PlayerPlay
人下棋函数,功能:在玩家输入的指定坐标处的内容更改为‘*’。
想要达成的下棋效果如下:
实现代码如下:
//玩家下棋
void PlayerPlay(char board[ROW][COL],int row,int col){
int i=0;
int j=0;
while(1){
printf("请输入你要下的位置坐标(格式:x y):");
scanf("%d %d",&i,&j);
printf("\n");
if(board[i-1][j-1]==' '){//数组中的横坐标为0~COL-1,纵坐标为0~ROW-1
board[i-1][j-1]='*';//而人们常用的坐标为从1开始
break;//即我们输入的坐标(1,1)与实际存储的坐标(0,0)相差1.此处-1
}
else printf("输入有误,请重新输入\n");//若此处已有棋子,输入有误
}
}
3、RobotPlay
电脑下棋函数,功能:实现电脑在棋盘中的随机下棋,棋子内容为‘#’。
想要得到的下棋效果如下:
实现代码:
//电脑下棋
void RobotPlay(char board[ROW][COL],int row,int col){
int i=0;
int j=0;
while(1){
i=rand()%row;//电脑下棋的横坐标在0~ROW-1随机
j=rand()%col;//电脑下棋的纵坐标在0~COL-1随机
if(board[i][j]==' '){
board[i][j]='#';
break;
}
}
}
4、IfWin
判断比赛结果,功能:比赛共可能有3种结果——人赢、电脑赢或平局,本函数对比赛的结果进行判断。
以下情况为人赢:
1、一行有三个’*’
2、一列有三个‘*’
3、斜线方向有三个‘*’
同理,以下情况为机器赢:
若棋盘下满却没有人赢,则为平局。
实现代码如下:
//判断棋盘是否满
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;
}
//判断是否赢
int IfWin(char board[ROW][COL],int row,int col){
int i=0;
int j=0;
int ret=0;
//一列有三个相同
for(i=0;i<row;i++){
for(j=0;j<col-2;j++){
if(board[i][j]==board[i][j+1]&&board[i][j+1]==board[i][j+2]&&board[i][j+2]=='*'){
ret=1;
return ret;
}
else if(board[i][j]==board[i][j+1]&&board[i][j+1]==board[i][j+2]&&board[i][j+2]=='#'){
ret=1;
return ret;
}
}
}
//一行有三个相同
for(i=0;i<row-2;i++){
for(j=0;j<col;j++){
if(board[i][j]==board[i+1][j]&&board[i+1][j]==board[i+2][j]&&board[i+2][j]=='*'){
ret=1;
return ret;
}
else if(board[i][j]==board[i+1][j]&&board[i+1][j]==board[i+2][j]&&board[i+2][j]=='#'){
ret=2;
return ret;
}
}
}
//右斜线方向有三个相同
for(i=0;i<row-2;i++){
for(j=0;j<col-2;j++){
if(board[i][j]==board[i+1][j+1]&&board[i+1][j+1]==board[i+2][j+2]&&board[i+2][j+2]=='*'){
ret=1;
return ret;
}
else if(board[i][j]==board[i+1][j+1]&&board[i+1][j+1]==board[i+2][j+2]&&board[i+2][j+2]=='#'){
ret=2;
return ret;
}
}
}
//左斜线方向有三个相同
for(i=2;i<row;i++){
for(j=2;j<col;j++){
if(board[i][j]==board[i-1][j-1]&&board[i-1][j-1]==board[i-2][j-2]&&board[i-2][j-2]=='*'){
ret=1;
return ret;
}
else if(board[i][j]==board[i-1][j-1]&&board[i-1][j-1]==board[i-2][j-2]&&board[i-2][j-2]=='#'){
ret=2;
return ret;
}
}
}
int full=0;
//棋盘已满,仍无三个相连位置元素相同,则为平局
full=IsFull(board,row,col);
if(full==1){
ret=3;
return ret;
}
return ret;
}
5、main函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
int main(){
int begin=0;
int ret=0;
char board[ROW][COL]={0};
int row=ROW;
int col=COL;
srand((unsigned int)time(NULL));
do{
printf("------ ------\n");
printf("Hello sanzi chess!\n");
printf("------ ------\n");
printf("\n");
printf("@@@@@ @@@@@\n");
printf(" 1.play 0.exit \n");
printf("@@@@@ @@@@@\n");
printf("\n");
printf("开始游戏?>");
scanf("%d",&begin);
printf("\n");
//判断是否开始游戏
if(!begin) break;
//初始化棋盘格
InitChessboard(board,row,col);
//打印棋盘格
PrintChessboard(board,row,col);
while(1){
//人下棋
PlayerPlay(board,row,col);
//打印棋盘格
PrintChessboard(board,row,col);
//判断是否赢
//int ret=0;//写在这不行?为什么
ret=IfWin(board,row,col);
if(ret==1){
printf("本局游戏结束,您已获胜\n");
printf("\n");
break;
}
if(ret==3){
printf("本局游戏结束,平局\n");
printf("\n");
break;
}
//电脑下棋
RobotPlay(board,row,col);
//打印棋盘格
PrintChessboard(board,row,col);
//判断是否赢
ret=IfWin(board,row,col);
if(ret==2){
printf("本局游戏结束,电脑已获胜\n");
printf("\n");
break;
}
if(ret==3){
printf("本局游戏结束,平局\n");
printf("\n");
break;
}
}
}while(1);
return 0;
}
四、实现效果
本文为个人学习所总结,如有问题欢迎指正。
你的点赞收藏将给我很大的鼓励。