(详解)用C语言实现一个三子棋游戏

·功能介绍

·这是我们要实现的游戏功能:

·代码实现以及解释

一、主函数的实现以及扫雷的构思框架(test.c)

int main()
{
	int input=0;
	do
	{
		menu();
		printf("请选择");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
				game();
				break;
		case 0:
				printf("退出游戏");
				break;
		default:
				break;
		}
	}
	while(input);
	return 0;
}

·首先使我们的主函数,一个菜单函数menu();一个游戏函数game();,通过switch让玩家进行选择。下面我们分别展示menu();和game();两个函数。

void menu()
{
	printf("**********************************************\n");
	printf("******************1.开始游戏******************\n");
	printf("******************0.退出游戏******************\n");
	printf("**********************************************\n");
}

·简单的一个界面用于展示。

void game()
{
	char board[ROW][COL]={0};
	char ret=0;
	InitBoard(board,ROW,COL);
	DisplayBoard(board,ROW,COL);

	while(1)
	{
		PlayMove(board,ROW,COL);
		DisplayBoard(board,ROW,COL);
		ComputerMove(board,ROW,COL);
		ret=IsWin(board,ROW,COL);
		if(ret==1)
			break;
		DisplayBoard(board,ROW,COL);
	}
	if(ret==0)
	{
		printf("平局");
	}
}

·InitBoard();这个函数用于初始化我们的棋盘,将3x3的格子都设定为' '.

·DisplayBoard();用于展示我们的棋盘给用户。

·PlayMove();用于玩家行动输入相应的坐标来下棋。

·ComputerMove();电脑自动生成坐标下棋。

·IsWin();这个函数用于判断是否有获胜的一方。

二、三子棋功能的实现(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]=' ';
		}
	}
}

·这是我们的初始化函数,将行和列都设定为空字符。

int DisplayBoard(char board [ROW][COL],int row, int col)

{
	int i=0;
	for(i=0; i<3; i++)
	{
		 printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
			if(i!=2)
				printf("---|---|---\n");
	}
	return 1;
}

·这边我们打印了棋盘,其中加上了|和——用于棋盘的美观。

int PlayMove(char board[ROW][COL],int row, int col)
{
	int x,y;
	scanf("%d%d",&x,&y);
	if(x>4||y>4||x<1||y<1)
	{
		printf("请重新输入");
		return 0;
	}
	if(board[x-1][y-1] != ' ')
	{
		printf("请重新输入\n");
		return 0;
	}
	board[x-1][y-1]='X';
}

·这边是玩家行动的函数。注意:我们判断的时候是1-4而不是0-3这是为什么呢?因为我们将这个棋盘存在一个二维数组里面,而玩家并非知道[0][0],所以我们的坐标只能为1-3.同样的,我们下面在输入坐标的时候,x和y分别减一得到真实的坐标。

·这里我们把玩家输入的坐标设定为X。

int ComputerMove(char board[ROW][COL],int row, int col)
{
	int i=0;
	int j=0;
	if(i = rand() % 3, j = rand() % 3, board[i][j] == ' ')  
    {    
        board[i][j] = 'Y';  
    } 
	else
		ComputerMove(board, row,col);

·电脑行动我们依然使用了rand来产生一个随机值,为了避免重复下棋,在if判断中加上了board[i][j] == ' '这一个条件。

·我们把电脑的坐标设定为Y。

int IsWin(char board[ROW][COL],int row, int col)
{  
    int i = 0;  
    if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))  
    {  
        if (board[1][1] == 'X')  
        {  
            printf("玩家赢了\n");  
            return 1;  
        }  
        if (board[1][1] == 'Y')  
        {  
            printf("对方赢了\n");  
            return 1;  
        }  
    }  
    if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))  
    {  
        if (board[1][1] == 'X')  
        {  
            printf("玩家赢了\n");  
            return 1;  
        }  
        if (board[1][1] == 'Y')  
        {  
            printf("对方赢了\n");  
            return 1;  
        }  
    }  
    for (i = 0;i < 3;i++)  
    {  
        if ((board[i][1] == board[i][0]) && (board[i][1] == board[i][2]))  
        {  
            if (board[i][1] == 'X')  
            {  
                printf("玩家赢了\n");  
                return 1;  
            }  
            if (board[i][1] == 'Y')  
            {  
                printf("对方赢了\n");  
                return 1;  
            }  
        }  
  
    }  
    for (i = 0;i < 3;i++)  
    {  
        if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))  
        {  
            if (board[0][i] == 'X')  
            {  
                printf("玩家赢了\n");  
                return 1;  
            }  
            if (board[0][i] == 'Y')  
            {  
                printf("对方赢了\n");  
                return 1;  
            }  
        }  
    }  
    return 0;  
}  

·这是一个判断输赢的函数,判断行列斜三个地方的字符是否全部为X或者全部为Y,返回一个int。

int IsFull(char board[ROW][COL], int row, int col)
{
	int i=0;
	int j=0;
	for(i=0; i<=2; i++)
	{
		for(j=0; j<=2; j++)
		{
			if(board[i][j]==' ')
				return 0;
		}
	}
	return 1;
}

·当然我们也会想到如果没有人赢怎么办,那么平局的判定标准就是棋盘是否下满?这边使我们一个判断棋盘状态的函数,如果返回为1,那么游戏就会重新开始了。

三、头文件的引用(game.h)

#include<stdio.h>
#include <stdio.h>
#include<stdlib.h>
#define	ROW 3
#define COL 3

void InitBoard(char board[ROW][COL],int row, int col);//初始化
int DisplayBoard(char board [ROW][COL],int row, int col);//打印棋盘
int PlayMove(char board[ROW][COL],int row, int col);//玩家走
int ComputerMove(char board[ROW][COL],int row, int col);//电脑走
int IsWin(char board[ROW][COL],int row, int col);//判断输赢
int IsFull(char board[ROW][COL], int row, int col);//判断棋盘状态

·头文件的引用以及函数的声明。

·我们将棋盘设定为ROW和COL,在头文件中可以直接改变棋盘的大小

·代码展示

test.c

#include"game.h"

void menu()
{
	printf("**********************************************\n");
	printf("******************1.开始游戏******************\n");
	printf("******************0.退出游戏******************\n");
	printf("**********************************************\n");
}

void game()
{
	char board[ROW][COL]={0};
	char ret=0;
	InitBoard(board,ROW,COL);
	DisplayBoard(board,ROW,COL);

	while(1)
	{
		PlayMove(board,ROW,COL);
		DisplayBoard(board,ROW,COL);
		ComputerMove(board,ROW,COL);
		ret=IsWin(board,ROW,COL);
		if(ret==1)
			break;
		DisplayBoard(board,ROW,COL);
	}
	if(ret==0)
	{
		printf("平局");
	}
}

int main()
{
	int input=0;
	do
	{
		menu();
		printf("请选择");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
				game();
				break;
		case 0:
				printf("退出游戏");
				break;
		default:
				break;
		}
	}
	while(input);
	return 0;
}

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]=' ';
		}
	}
}
int DisplayBoard(char board [ROW][COL],int row, int col)

{
	int i=0;
	for(i=0; i<3; i++)
	{
		 printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
			if(i!=2)
				printf("---|---|---\n");
	}
	return 1;
}

int PlayMove(char board[ROW][COL],int row, int col)
{
	int x,y;
	scanf("%d%d",&x,&y);
	if(x>4||y>4||x<1||y<1)
	{
		printf("请重新输入");
		return 0;
	}
	if(board[x-1][y-1] != ' ')
	{
		printf("请重新输入\n");
		return 0;
	}
	board[x-1][y-1]='X';
}

int ComputerMove(char board[ROW][COL],int row, int col)
{
	int i=0;
	int j=0;
	if(i = rand() % 3, j = rand() % 3, board[i][j] == ' ')  
    {    
        board[i][j] = 'Y';  
    } 
	else
		ComputerMove(board, row,col);

}
int IsWin(char board[ROW][COL],int row, int col)
{  
    int i = 0;  
    if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))  
    {  
        if (board[1][1] == 'X')  
        {  
            printf("玩家赢了\n");  
            return 1;  
        }  
        if (board[1][1] == 'Y')  
        {  
            printf("对方赢了\n");  
            return 1;  
        }  
    }  
    if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]))  
    {  
        if (board[1][1] == 'X')  
        {  
            printf("玩家赢了\n");  
            return 1;  
        }  
        if (board[1][1] == 'Y')  
        {  
            printf("对方赢了\n");  
            return 1;  
        }  
    }  
    for (i = 0;i < 3;i++)  
    {  
        if ((board[i][1] == board[i][0]) && (board[i][1] == board[i][2]))  
        {  
            if (board[i][1] == 'X')  
            {  
                printf("玩家赢了\n");  
                return 1;  
            }  
            if (board[i][1] == 'Y')  
            {  
                printf("对方赢了\n");  
                return 1;  
            }  
        }  
  
    }  
    for (i = 0;i < 3;i++)  
    {  
        if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))  
        {  
            if (board[0][i] == 'X')  
            {  
                printf("玩家赢了\n");  
                return 1;  
            }  
            if (board[0][i] == 'Y')  
            {  
                printf("对方赢了\n");  
                return 1;  
            }  
        }  
    }  
    return 0;  
}  

int IsFull(char board[ROW][COL], int row, int col)
{
	int i=0;
	int j=0;
	for(i=0; i<=2; i++)
	{
		for(j=0; j<=2; j++)
		{
			if(board[i][j]==' ')
				return 0;
		}
	}
	return 1;
}

game.h

#include<stdio.h>
#include <stdio.h>
#include<stdlib.h>
#define	ROW 3
#define COL 3

void InitBoard(char board[ROW][COL],int row, int col);//初始化
int DisplayBoard(char board [ROW][COL],int row, int col);//打印棋盘
int PlayMove(char board[ROW][COL],int row, int col);//玩家走
int ComputerMove(char board[ROW][COL],int row, int col);//电脑走
int IsWin(char board[ROW][COL],int row, int col);//判断输赢
int IsFull(char board[ROW][COL], int row, int col);//判断棋盘状态

猜你喜欢

转载自blog.csdn.net/q302989778/article/details/80250185