c语言实现简单三子棋

我们学习c语言的过程中,我们不能只学习枯燥的语法知识,还需要做一两个小游戏来锻炼自己的编程能力以及逻辑思维,所以今天我们就利用C语言来实现一个简单的三子棋。

文章目录

  • 一、游戏的整体思路
  • 二、游戏菜单的创建
  • 三、游戏主体的实现
    • 1、初始化棋盘
    • 2、打印棋盘
    • 3、电脑移动
    • 4、玩家移动
    • 5、判断输赢
  • 四、game.h文件及test.c文件
    • 五、游戏运行
  • 总结


一、游戏的整体思路

我们需要三个文件:
1、game.h文件——用来声明函数,定义宏以及引入头文件;
2、game.c文件——用来定义函数,实现游戏功能;
3、test.c文件——用来测试游戏,实现游戏

二、游戏菜单的创建

在我们进入游戏时,首先出现的就应该是我们的菜单界面。

我们选择使用菜单函数”(menu())来实现这一功能,提高程序的可重复性,确保代码块的函数分块使用。

游戏菜单应该实现这几个功能:

1、游戏的进入
2、游戏的退出
3、非法输入的返回提示和说明

接下来是我们实现这一功能的代码块

代码如下(示例):

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

void test()
{
	int input=0;
	do {
		menu();
		printf("请选择->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("输入错误");
		}
	} while (input);
}

此时我们就能够实现进入游戏的功能,接下来需要完成游戏主体的逻辑

三、游戏主体的实现

在我们写程序过程中,我们可以先写好所有的函数,再进行整合使用;也可以一步步去写,这好比建房子,我们是先准备好所有材料呢,还是走一步看一步,这个就看我们自己喜好了!这里我们采用先准备材料的方法。

1、初始化棋盘

在游戏刚开始时,我们需要对棋盘进行初始化操作,对棋盘进行清空,以保证后续游戏的正常进行。我们将使用“InitBoard()”函数来进行棋盘的初始化操作。

void InitBoard(char board[ROW][COL], int row, int col)
{

	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
		printf("\n");
	}
}

2、打印棋盘

在完成棋盘的初始化操作后,我们需要将初始化后的棋盘展现出来,以便玩家进一步的游戏。

在这里,我们使用“BoardDisplay()”这一函数来进行实现。

代码如下:

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//打印第一行
	for (j = 0; j < row; j++)
	{
		printf("---|");
	}
	printf("\n");
	//
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("  %c|", board[i][j]);
		}
		printf("\n");

		for (j = 0; j < col; j++)
		{
			printf("---|");
		}
		printf("\n");
	}
}

我们可以看一下棋盘,来分析一下这段代码是什么意思:
c语言实现简单三子棋_第1张图片
我们首先打印了“—|”作为分隔符,打印一行后换行;然后打印“ %c”作为留白,以下入棋子;接着再打印分隔符,由于我们第一行已经打印了一行分隔符,所以我们可以将下面的看成三组,每一组包含一行分隔符,一行留白,用一个for循环三次就可以实现棋盘的打印!

3、电脑移动

当我们需要电脑自动下棋时,我们需要电脑生成两个随机数,所以我们介绍一下关于随机数的用法:

我们需要调用rand函数生成随机数,在此之前我们需要调用srand函数初始化,而srand()中需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子,后面的rand函数会出现一样的随机数,所以我们需要用time(0),也就是时间戳,来提供不同的种子。

c语言实现简单三子棋_第2张图片

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>\n");
	printf("\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		//为了让坐标在棋盘范围内,我们只需要模上每行棋格数
		if (board[x][y] == ' ')
		{
			board[x][y] = '0';
			break;
		}
		else
			continue;
	}
}

4、玩家移动

在玩家输入的过程中,我们不仅需要考虑坐标是否被占用的问题,还需要判断坐标是否非法。

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走:>\n");
	printf("\n");
	printf("请输入坐标(%d,%d):>", row, col);
	while (1)
	{
		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] = 'x';
				break;
			}
			else
			{
				printf("该坐标已经被占用\n");
				printf("请重新输入:>\n");
				continue;
			}
		}
		else
		{
			printf("坐标非法\n");
			printf("请重新输入:>\n");
			continue;
		}
	}
}

5、判断输赢

在这里我们用了最简单的方法去判断,如果我们写五子棋,除了这种方法,还可以选择一个棋子延伸出去,判断有没有五子连珠

//判断棋盘是否为满,如果满了就为平局
int isFull(char chessBoard[ROW][COL]) {
	for (int row = 0; row < ROW; row++) {
		for (int col = 0; col < COL; col++) {
			if (chessBoard[row][col] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}

char isWin(char chessBoard[ROW][COL]) {
	//判断每一行是否有三子连珠
	for (int row = 0; row < ROW; row++) 
	{
		if (chessBoard[row][0] != ' '
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2]) 
			{
			return chessBoard[row][0];
			}
		}
	//判断每一列是否有三子连珠
	for (int col = 0; col < COL; col++)
	 {
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col]) 
			{
			return chessBoard[0][col];
			}
	 }
	 	//判断对角线
		if (chessBoard[0][0] != ' '
			&& chessBoard[0][0] == chessBoard[1][1]
			&& chessBoard[0][0] == chessBoard[2][2]) 
			{
			return chessBoard[0][0];
			}
			
		if (chessBoard[2][0] != ' '
			&& chessBoard[2][0] == chessBoard[1][1]
			&& chessBoard[2][0] == chessBoard[0][2])
			 {
			return chessBoard[2][0];
			 }
		if (isFull(chessBoard)) 
			{
				return 'q';
			}
		return ' ';
}

四、game.h文件及test.c文件

这是game.c文件:

#ifndef __GAME_H__
#define __GAME_H__

# define _CRT_SECURE_NO_WARNINGS

#include 
#include 
#include 
#include 

#define ROW 3
#define COL 3

void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
char isWin(char board[ROW][COL]);
int isFull(char chessBoard[ROW][COL]);

#endif  __GAME_H__

这是test.c文件:

#include"game.h"

void menu();

void game()
{
	int ret;
	char board[ROW][COL]={0};
	InitBoard(board, ROW, COL);
	while (1)
	{
		ComputerMove(board, ROW, COL); //电脑走
		ret = isWin(board, ROW, COL);
		if (ret != ' ')
		{
			break;
		}
		//system("CLS"); //清屏,优化界面
		DisplayBoard(board, ROW, COL); //打印棋盘
		printf("\n");

		PlayerMove(board, ROW, COL); //玩家走
		ret = isWin(board, ROW, COL);
		if (ret != ' ')
		{
			break;
		}
		DisplayBoard(board, ROW, COL); //打印棋盘
		printf("\n");
	}

	if (ret == 'q')
	{
		printf("平局\n");
		DisplayBoard(board, ROW, COL);
	}
	if (ret == '0')
	{
		printf("电脑赢\n");
		DisplayBoard(board, ROW, COL);
	}
	else if(ret == 'x')
	{
		printf("玩家赢\n");
		DisplayBoard(board, ROW, COL);
	}

}

void test()
{
	int input=0;
	do {
		menu();
		printf("请选择->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("输入错误");
		}
	} while (input);
}



int main()
{
	srand((unsigned int)time(0));
	test();
}

五、游戏运行

现在,我们便可以跟电脑斗智斗勇了!
c语言实现简单三子棋_第3张图片


总结

至此,我们的三子棋游戏就结束了,通过这个小项目,我们能够对完成一个项目的编写,包括头文件的设置,函数的定义等,而不是简单的写一个main函数,如果我们能蕴乐于学的话,相信会有更多收获!

你可能感兴趣的:(c语言,开发语言,c++)