欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用c语言实现简单三子棋游戏

程序员文章站 2022-07-15 10:47:13
...
首先,把全部代码罗列如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"time.h"
#define ROWS 3  
#define COLS 3  

//菜单函数
void menu()
{
	printf("******************************\n");
	printf("*****欢迎进入三子棋游戏区*****\n");
	printf("****    1:开始进入游戏    ****\n");
	printf("****    0:结束本次游戏    ****\n");
	printf("******************************\n");
	printf("请输入0或1进行游戏:-->  ");
}

//对棋盘进行初始化
void init_board(char board[ROWS][COLS], int row, int col)
{
	memset(board, ' ', row*col*sizeof(char));
}   
    //memset是以字节为单位,初始化内存块
	//当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值
	//在这里也可以用for循环来进行棋盘初始化,具体代码如下:
	/*{
		int x = 0;
		int y = 0;
		for (x = 0; x < 3; x++)
		{
			for (y = 0; y < 3; y++)
			{
				board[x][y] = ' ';
			}
		}
	}
*/

//实现棋盘函数
//主要是打印出三子棋盘上的九方格图形
void display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i<row; i++)
	{
		printf(" %c | %c | %c \n",
			board[i][0], board[i][1], board[i][2]);//控制只输入三列
		if (i != 2)//控制只输入两行
			printf("---|---|---\n");
	}
}

//打印人进行的棋盘函数
void player_move(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入棋子对应坐标:->   ");
		scanf("%d,%d", &x,&y);
		x--;
		y--;//因为下标是从0开始的,所以各自减去1
		if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))
		{
			if (board[x][y] == ' ')
			{
				board[x][y] = 'X';
				break;
			}
			else
			{
				printf("输入的下标有误,请重新输入!");
			}
		}
		else
		{
			printf("输入的下标有误,请重新输入!");
		}
	}
}

//打印电脑所进行的棋盘游戏函数
void computer_move(char board[ROWS][COLS], int row, int col)
{
	while (1)
	{
		//rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长
		//因此在一定范围内,可以看成是随机的
		//比如是用rand()函数产生1-100以内的随机整数:int num=rand()%100
		int x = rand() % 3;
		int y = rand() % 3;
		if (board[x][y] == ' ')
		{
			board[x][y] = '0';
			break;
		}
	}
}

//对棋盘进行判满运算
int chess_full(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	for (x = 0; x < row; x++)
	{
		for (y = 0; y < col; y++)
		{
			if (board[x][y] == ' ')
				return 0;
		}
	}
	return 1;//表示棋盘已满
}

//判断输赢函数
//主要是三行和三列,以及两个交叉实现三子排成一排
char check_win(char board[ROWS][COLS], 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][1] != ' '))
		{
			return board[i][1];
		}
	}
	for (i = 0; i<col; i++)
	{
		if ((board[0][i] == board[1][i])
			&& (board[1][i] == board[2][i])
			&& (board[1][i] != ' '))
		{
			return board[1][i];
		}
	}
	if ((board[0][0] == board[1][1])
		&& (board[1][1] == board[2][2])
		&& (board[1][1] != ' '))
	{
		return board[1][1];
	}
	if ((board[0][2] == board[1][1])
		&& (board[1][1] == board[2][0])
		&& (board[1][1] != ' '))
	{
		return board[1][1];
	}
	if (chess_full(board, row, col))
	{
		return 's';//表示棋盘已满
	}
	return ' ';
}

//通过在主函数中调用game()函数来具体实现各个函数的相关功能
void game()
{
	int ret = 0;
	char board[ROWS][COLS] = { 0 };
	init_board(board, ROWS, COLS);
	display_board(board, ROWS, COLS);//函数的嵌套调用
	while (1)
	{
		printf("player moves:\n");
		player_move(board, row, col);
		display_board(board, row, col);
		ret = check_win(board, row, col);
		if (ret != ' ')
			break;
		printf("computer moves:\n");
		computer_move(board, row, col);
		display_board(board, row, col);
		check_win(board, row, col);
		if (ret != ' ')
			break;
	}
	if (ret == 'X')
	{
		printf("Congratulatons! player wins!\n");
	}
	else if (ret == '0')
	{
		printf("Undortunately! player loses!\n");
	}
	else
	{
		printf("It's a tie,please play again!\n");
	}
}

//通过运用enum常亮,来实现枚举声明,并附上相应的默认值0,1
 enum  Option
{
	EXIT,//0  
	PLAY //1  
};

//主函数
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	//time函数可以获取当前的系统时间(但是获取的是秒数,是从1970年1月1日零时零分零秒到目前为止所经过的时间)
	do
	{
		menu();
		printf("please choose:-->  ");
		scanf("%d", &input);//srand函数是随机数发生器的初始化函数
		//为了让每一次程序的调用都产生不同的值,常常使用系统时间来初始化
		switch (input)
		{
		case PLAY:
			game();
			break;
		case EXIT:
			break;
		default:
			printf("default!please choose again!\n");
			break;
		}
	} while (input);
	system("pause\n");
	return 0;
}

此次程序的成功运行,主要是通过对八个自定义函数,以及对一个enum常量结构体的调用来实现的,以下是对整个程序过程的深入分析:

1.menu函数:在这里,主要是对游戏开始界面的设置。整体来说比较简单,主要是运用了几个printf()函数来具体实现的;

2.init_board函数:此函数主要是进行棋盘的初始化操作。在这里用到了memset()函数,主要是对棋盘的初始化,即对每个方格进行置空,当然,在这里也可以通过两个for循环语句来实现函数初始化;

3.display_board函数:主要用于实现对棋盘井字形框架的打印,在这里要特别注意(i!=2)判断语句,因为在这里主要是打印两行,所以控制两行输出即可;

4.player_move函数:此函数是由玩家来进行完成的,输入任意坐标时,要特别注意坐标的越界问题,在这里通过一个if语句来加以限制;

5.computer_move函数:主要是针对电脑进行游戏的设置,这里通过调用rand()函数来实现1-3之间随机数的抽取;

6.chess_full函数:主要是用来判断棋盘是否已经满格;

7.check_win函数:主要用于判断是否有一方已经赢得了比赛,即对是否出现了三行,三列,或者两个交叉列排成一排进行判断,如果都没有出现,则进行判断是否棋盘已满;

8.game函数:通过对函数的嵌套调用,以此来实现各函数的功能,从而来进行游戏;

9:enum:通过运用enum来定义结构体常量;

10.最后,通过主函数来实现程序的运行,在这里运用到了srand()函数和time()函数,具体用法在此不再累述,请自行查阅,同时也用到switch控制语句来进行判断选择;