C语言实现三子棋游戏含完整代码

目录
  • 一、text.c源文件部分
    • 1、main函数部分
    • 2、game函数部分
  • 二、game.h头文件部分
  • 三、game.c源文件部分
  • 运行

 三子棋是大家小时候和同桌在纸上都玩过的简单小游戏,这个游戏我们在c语言中就可以实现。

在这篇文章我推荐大家使用vs2013,vs2019,vs2022等的编译器。部分学校使用的vc6.0以及Devc++。前者是1998年推出的c语言编译器,在现在的win10或者win11的系统中并不兼容,可能会出现一些问题,后者也在2015年停更,这两款祖传c语言编译器并不推荐使用,但是如果你们学校考试需要使用或者有明确要求,那当我没说。

首先,我们要先创建一个项目,常见三个文件分别是头文件game.h,源文件game.c,text.c。在这个game.h的头文件中我们放入函数的声明,定义常量以及头文件的引用,在text.c文件中我们写入游戏进行的程序,在game.c文件中我们写入实现游戏的函数。 

一、text.c源文件部分

1、main函数部分

因为我们玩一把游戏肯定不过瘾,我们要多玩几把游戏,我们在text.c文件中的main函数里写入一个do while循环语句,实现多次进行游戏。然后我们在循环语句中写入一个menu函数用来打印菜单。然后我们要在键盘上输入一个值去判断是否进行游戏,这里使用一个switch分支。当使用者输入正确的输入值时开始进行游戏。这里使用一个game函数实现游戏流程。

int main()
{
	int n = 0;

	srand((size_t)time(NULL));
	do
	{
		menu();//打印菜单
		printf("请输入  ");
		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); break;
		case 0:printf("游戏结束\n"); break;
		default:printf("输入错误,请重新输入!\n"); break;
		}
	} while (n != 0);

}

main函数部分

​void menu()
{
	printf("******************************************\n");
	printf("********         1.play          *********\n");
	printf("********         0.exit          *********\n");
	printf("******************************************\n");
}

menu函数部分

2、game函数部分

在game函数中我们要实现游戏的主要流程,首先我们要打印一个3*3的棋盘,大概是这样的。

(在这里我们先把游戏的流程捋清楚,至于实现那些游戏步骤的函数我们放在后面game源文件部分去细说。)

 因为每个格子在游戏开始的时候都是空着的状态,而在玩家与电脑进行游戏中是要输入符号的,所以我们还要定义一个char型的二维数组,并初始化为‘  '。然后就是下棋阶段,我们要连续下很多次棋所以说这里使用一个while循环语句实现,这里可以写成一个死循环,当后面的函数判断到有玩家已经胜出或者平局的时候使用break跳出循环,因为不论是电脑还是玩家下棋后,我们要看到下到了哪里,所以说我们要在玩家和电脑下棋后面再打印一次棋盘。每个人在下完棋之后,我们要判断是否已经胜利所以我们使用条件语句来判断是否胜利,失败或是平局。在配合循环我们基本游戏流程已经写完了。

void game()
{
	char board[ROW][COL];//定义一个二维数组。
	initboard(board, ROW, COL);//初始化数组。
    printboard(board, ROW, COL);//打印棋盘。

	while (1)
	{
		//玩家下棋
		playerboard(board, ROW, COL);
		//打印棋盘
		printboard(board, ROW, COL);
		//判断是否胜利
		if (iswinboard(board, ROW, COL) == '*')
		{
			printf("玩家胜利\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == '#')
		{
			printf("电脑获胜\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == 'Q')
		{
			printf("平局\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}

		//电脑下棋
		computermove(board, ROW, COL);
		//打印棋盘
		printboard(board, ROW, COL);
		//判断是否胜利
		if (iswinboard(board, ROW, COL) == '*')
		{
			printf("玩家胜利\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == '#')
		{
			printf("电脑获胜\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == 'Q')
		{
			printf("平局\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
	}
}

game函数部分

二、game.h头文件部分

在头文件中我们需要对函数进行声明,定义常量。具体怎么实现可以看下面代码的注释。

在这里我们棋盘的行列在头文件使用ROW和COL来定义是为了方便我们以后在更改棋盘大小时,更加容易,只用在头文件中更改,在下面我们也能看到有很多地方使用这两个常量。

#pragma once
//在game头文件里面去声明函数,定义常量。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//定义常量
#define ROW 3//这里通过更改ROW,COL的值来改变棋盘的大小
#define COL 3//可以更改成为n*n的棋盘。

//函数声明
//打印棋盘
void printboard(char board[ROW][COL], int row, int col);

//初始化数组
void initboard(char board[ROW][COL], int row, int col);

//玩家下棋//二维数组进行函数传参时可以不用写行数
void playerboard(char board[][COL], int row, int col); 

//电脑下棋
void computermove(char board[ROW][COL], int row, int col);

//判断是否胜利
char iswinboard(char board[ROW][COL], int row, int col);

game.h部分

三、game.c源文件部分

还记得我们在text.c中使用了哪些函数吗?

  • 1、我们先要初始化二维数组
  • 2、打印棋盘
  • 3、玩家下棋
  • 4、电脑下棋
  • 5、判断胜利

接下来的game.c文件就是要写入实现这几个步骤的函数。

首先,初始化数组非常容易,两个for循环即可。

//初始化数组元素
void initboard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	//先对数组进行赋值,因为是n*n的数组所以要赋值n*n次
	//这里使用两个for循环来实现。
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

初始化数组元素函数

然后是打印棋盘函数。

在打印棋盘中我们要注意,需要打印一行数组,一行“---”符号。在每一行的最后“|”不打印。在最下面一行“---|---|---”不打印,在这里我们只需要去控制for循环条件即可实现,并不困难。

//打印棋盘
void printboard(char board[ROW][COL], int row, int col)
{
	int i = 0, 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 < row - 1)
		{
			for (j = 0; j < row; j++)
			{
				printf("---");
				if (j < row - 1)
				{
					printf("|");
				}

			}
		}

		printf("\n");

	}
}

然后是玩家下棋函数

也就是对数组进行赋值,因为玩家不一定学过c语言,也不一定知道c语言中数组的下标是从0开始的,所以我们要对输入的坐标-1之后在进行数组的相关操作。这里可以写上一个死循环,当玩家下出非法坐标时提醒玩家重新下,当玩家下出正确时再break跳出。

//玩家下棋函数
void playerboard(char board[][COL], int row, int col)
{
	int x = 0, y = 0;
	printf("请玩家下棋\n");
	while (1)//这里可以写上一个死循环,当玩家下出非法坐标时提醒玩家重新下。
			//当玩家下出正确时再break跳出。
	{
		printf("请输入坐标,请用空格隔开。    \n");
		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("坐标已被占用,请重新输入!");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!");
		}
	}
}

再然后是电脑下棋

相较于玩家下棋电脑下棋就比较容易了,只用使用rand()%3随机生成0-2之间的值,再判断是否已被占用即可。

//电脑下棋
void computermove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋:>\n");
	while (1)
	{
		x= rand() % ROW;//随机取值如果放在循环外面则可能陷入死循环。
		y= rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

最后是判断是否胜利的函数

这个比较长,但是基本就是if条件语句进行判断,分别判断行、列、对角线以及平局。如果胜利成立则返回已连成线的其中一个格中的符号即可,这样就不用再麻烦这判断到底是电脑赢还是玩家赢了。返回到text.c中再进行相应的输出。

//判断是否胜利
char iswinboard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, count = 0;

	//判断行是否胜利
	for (i=0;i<row;i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
			break;
		}
	}
	//判断列是否胜利
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
		{
			return board[0][j];
			break;
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
	{
		return board[0][2];
	}

	//判断是否平局
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				count++;
			}
		}
	}
	if (count == 0)
	{
		return 'Q';
	}
	return 'C';
}

这样我们的一个三子棋游戏就写好了。你就可以发给朋友,或是自己私藏了。(steam是上不了了,自己玩玩算了。)

运行

最后全部代码放在这里

game.h

#pragma once
//在game头文件里面去声明函数,定义常量。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//定义常量
#define ROW 3//这里通过更改ROW,COL的值来改变棋盘的大小
#define COL 3//可以更改成为n*n的棋盘。

//函数声明
//打印棋盘
void printboard(char board[ROW][COL], int row, int col);

//初始化数组
void initboard(char board[ROW][COL], int row, int col);

//玩家下棋//二维数组进行函数传参时可以不用写行数
void playerboard(char board[][COL], int row, int col); 

//电脑下棋
void computermove(char board[ROW][COL], int row, int col);

//判断是否胜利
char iswinboard(char board[ROW][COL], int row, int col);

text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("******************************************\n");
	printf("********         1.play          *********\n");
	printf("********         0.exit          *********\n");
	printf("******************************************\n");
}
void game()
{
	char board[ROW][COL];//定义一个二维数组。
	initboard(board, ROW, COL);//初始化数组。
    printboard(board, ROW, COL);//打印棋盘。

	while (1)
	{
		//玩家下棋
		playerboard(board, ROW, COL);
		//打印棋盘
		printboard(board, ROW, COL);
		//判断是否胜利
		if (iswinboard(board, ROW, COL) == '*')
		{
			printf("玩家胜利\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == '#')
		{
			printf("电脑获胜\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == 'Q')
		{
			printf("平局\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}

		//电脑下棋
		computermove(board, ROW, COL);
		//打印棋盘
		printboard(board, ROW, COL);
		//判断是否胜利
		if (iswinboard(board, ROW, COL) == '*')
		{
			printf("玩家胜利\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == '#')
		{
			printf("电脑获胜\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
		else if (iswinboard(board, ROW, COL) == 'Q')
		{
			printf("平局\n");
			printf("**********    是否进行下一局    **********\n");
			printf("\n");
			break;
		}
	}
}
int main()
{
	int n = 0;

	srand((size_t)time(NULL));
	do
	{
		menu();//打印菜单
		printf("请输入  ");
		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); break;
		case 0:printf("游戏结束\n"); break;
		default:printf("输入错误,请重新输入!\n"); break;
		}
	} while (n != 0);

}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化数组元素
void initboard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	//先对数组进行赋值,因为是n*n的数组所以要赋值n*n次
	//这里使用两个for循环来实现。
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void printboard(char board[ROW][COL], int row, int col)
{
	int i = 0, 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 < row - 1)
		{
			for (j = 0; j < row; j++)
			{
				printf("---");
				if (j < row - 1)
				{
					printf("|");
				}

			}
		}

		printf("\n");

	}
}

//玩家下棋函数
void playerboard(char board[][COL], int row, int col)
{
	int x = 0, y = 0;
	printf("请玩家下棋\n");
	while (1)//这里可以写上一个死循环,当玩家下出非法坐标时提醒玩家重新下。
			//当玩家下出正确时再break跳出。
	{
		printf("请输入坐标,请用空格隔开。    \n");
		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("坐标已被占用,请重新输入!");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!");
		}
	}
}

//电脑下棋
void computermove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋:>\n");
	while (1)
	{
		x= rand() % ROW;//随机取值如果放在循环外面则可能陷入死循环。
		y= rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//判断是否胜利
char iswinboard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, count = 0;

	//判断行是否胜利
	for (i=0;i<row;i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
			break;
		}
	}
	//判断列是否胜利
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
		{
			return board[0][j];
			break;
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
	{
		return board[0][2];
	}

	//判断是否平局
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				count++;
			}
		}
	}
	if (count == 0)
	{
		return 'Q';
	}
	return 'C';
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解用C语言实现三子棋游戏流程

    目录 三子棋游戏简介 一.分析及实现 1.棋盘 2.落子 3.判断输赢 二.程序演示 三.完整代码 1.main.c 2.game.c 3.game.h 总结 三子棋游戏简介 这是一个简单的三子棋小游戏,估计大家小时候都玩儿过,只要能连成三个,无论是行,列还是对角线,就可以胜利了.是不是很简单呢,那我们来尝试一下用C语言来写一个简单的三子棋游戏. 一.分析及实现 1.棋盘 想要玩游戏,那首先应该有一个棋盘吧.因为我们玩儿的是三子棋,所以来说一个3X3的棋盘应该可以满足要求.这里使用了一个三行三列

  • C语言小游戏之简易版三子棋(棋盘可自由扩展)

    目录 前言 step1.初始化棋盘内值为空格 step2.打印棋盘 step3.玩家下棋 step4.电脑下棋  step5.判断棋盘是不是满了 step6.判断输赢 step7.最终测试三种情况 game.h game.c  test.c 前言 test.c  放游戏的测试逻辑--调用game.c game.h 游戏模块: game.c   放游戏的实现逻辑 game.h  放游戏实现函数的声明 step1.初始化棋盘内值为空格 思路 1.初始化棋盘内的值 2.棋盘中的数组内容应当全部是空格

  • C语言版三子棋游戏实现代码

    本文实例为大家分享了C语言版三子棋游戏的具体代码,供大家参考,具体内容如下 实现一个三子棋小游戏 下面是实现步骤: 总共有需要三个文件 第一,test.c 我们要在这个文件里面实现游戏的主体流程 第二,game.c 在这个文件里我们可以实现各个游戏函数的分装 第三,game.h 在这个文件里我们实现的是各个函数的声明 test.c 1.首先要有一个菜单 让玩家可以做出选择 2.接着对玩家做出的不同选择进行实现 选1就是开始游戏,所以我们进入到game函数里就好了 选0就是退出游戏, 其他选择的话

  • C语言三子棋游戏的简单设计

    本文实例为大家分享了C语言三子棋游戏简单设计的具体代码,供大家参考,具体内容如下 题目思想: 用 3×3 的二维数组表示棋盘 每一个棋子的格子,也就是每个元素表示三种状态:分别是 1.未落子 ' ' 2.玩家落子 'X' 3.电脑落子 'O' 玩家通过输入数字作为落子位置的坐标(输入的行数与输入的列数) 直接上代码解析 1.创建出棋盘 #define _CRT_SECURE_NO_WARNINGS //利用宏定义行和列 #define MAX_ROW 3 #define MAX_COL 3 #i

  • C语言实现三子棋游戏含完整代码

    目录 一.text.c源文件部分 1.main函数部分 2.game函数部分 二.game.h头文件部分 三.game.c源文件部分 运行  三子棋是大家小时候和同桌在纸上都玩过的简单小游戏,这个游戏我们在c语言中就可以实现. 在这篇文章我推荐大家使用vs2013,vs2019,vs2022等的编译器.部分学校使用的vc6.0以及Devc++.前者是1998年推出的c语言编译器,在现在的win10或者win11的系统中并不兼容,可能会出现一些问题,后者也在2015年停更,这两款祖传c语言编译器并

  • C语言实现三子棋游戏的示例代码

    目录 1. 前言 2. 准备工作 3. 使用二维数组存储下棋的数据 4. 初始化棋盘为全空格 5. 打印棋盘 6. 玩家下棋 7. 电脑下棋 8. 判断输赢 9. 效果展示 10. 完整代码 game.h game.c test.c 1. 前言 大家好,我是努力学习游泳的鱼,今天我们会用C语言实现三子棋.所谓三子棋,就是三行三列的棋盘,玩家可以和电脑下棋,率先连成三个的获胜.话不多说,我们开始吧. 2. 准备工作 我们可以在一个项目中创建三个文件,分别是: test.c,测试游戏的逻辑. gam

  • 基于C语言实现三子棋游戏的示例代码

    1.创建文件  test.c (游戏的测试逻辑)game.c(游戏的实现逻辑)gane.h(游戏实现函数的声明) game.c 和game.h属于游戏实现 test.c属于游戏测试 test.c 源文件(源文件添加)——game.c 源文件(源文件添加)——game.h(头文件添加) 三个文件 2.首先在test.c文件写一个主函数,主函数里面有一个测试函数,测试函数里面写菜单.进入游戏.退出游戏 代码展示: void menu() { printf("*********************

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 //声明函数 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void PrintBoard(char board[ROW][COL], i

  • 利用C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 说明:该游戏的实现需要用到三个文件 1.test.c:放置主函数(main())和菜单函数(menu())和游戏函数(game()). 2.game.c:放置game()里面的相应操作的函数,例如玩家移动(PlayerMove(board)),电脑移动(ComputerMove(board)),以及每一次移动之后打印当前棋盘内容的函数(DisplayBoard(board))等等.由于这些函数内容较多,所以单独放在一个

  • C语言实现三子棋游戏附注释

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 概述 三子棋棋盘为九宫格形式,玩家和电脑分别轮流落子,若有一方有三个棋连在一起的情况则胜. 实现过程 1.玩家交互菜单创建 2.棋盘创建与初始化 3.玩家与电脑落子 4.判定胜负关系 多文件实现 头文件 game.h #ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <time.h> #include <stdlib.

  • 使用C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 先简单介绍一下我的三子棋小游戏是怎么玩的,就是自己跟电脑pk,只不过电脑没这么智能.自己输入想要下的坐标,电脑随机生成一个坐标,直到赢家产生.在这个过程中我觉得比较难的就是赢家的判定部分.在c语言中随机数的产生也就是调用srand()函数利用时间戳来获取随机值.算了游戏太简单,我想你们也都是冲着代码来的,直接上代码. 代码和实现 为了代码逻辑性更高,没那么繁杂,主要将代码分为三个部分,头文件game.h,和两个c文件,

  • 用C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 初始工作,通过#define 定义一个标识符来表示一个常量(棋盘的横纵坐标) (因为在代码的编写中,会有多处需要用到坐标.那么,在阅读代码时就可能会导致读者疲于理解当前的值到底是代表什么,即会对代码的解读造成困扰.所以,在该代码中通过使用宏定义解决了这个问题,同时也方便后续更改棋盘的大小.) #define MAX_ROW 3 #define MAX_COL 3 游戏创建流程 1. 创建棋盘 创建棋盘(二维数组),并将

随机推荐