c____三子棋小游戏

时间:2025-03-26 12:37:34

  用c语言实现一个三子棋的小游戏,玩家和电脑的对弈,那么思路是:首先创建出一个二维数组的棋盘,然后创建出电脑的行走方式,因此需要创建出一个范围以内的随机数,然后判断输赢,就可以实现这个程序。

那么接下来就开始实现这个游戏;

首先:,作为游戏的初始框架

#define _CRT_SECURE_NO_WARNINGS	

#include""    //引用自己创建的game函数,要用双引号
void  menu()           //创建菜单
{
	printf("                           \n");
	printf("                           \n");
	printf("    1,play      0,exit     \n");
	printf("                           \n");
}

void game()   //游戏的内容
{
	char ret = 0;//创建返回值
	char board[row][col] = { 0 };//存放棋盘信息   ,内容一开始全是空格
													  //创建棋盘的数组

	initboard(board, row, col);//定义函数,                初始化棋盘
	displayboard(board, row, col);  //定义函数             打印棋盘

	while (1)   //下棋
	{
		playermove(board, row, col);    //玩家下棋
		displayboard(board, row, col);//每下一次打印一次  
		//判断玩家输赢
		ret = iswin(board, row, col);
		if (ret != '$')
		{
			break;
		}

		computermove(board, row, col);//电脑下棋
		displayboard(board, row, col);

		//判断电脑输赢
		ret = iswin(board, row, col);
		if (ret != '$')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}

}


void test()   //test函数内容
{
	rand((unsigned int)time(NULL));//生成随机值
	int input = 0;  //创建输入值
	do
	{
		menu();                 //引用菜单
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
			break;
		}
	} while (input);//面跳出了,如果input非零就继续循环

}

int main()
{
	test();//引用test函数
	return 0;
}

 这里为框架内的函数的实现,也是最重要的地方

#define _CRT_SECURE_NO_WARNINGS
#include""//因为下面的行和列定义在.h函数中,要引用过来

//函数的实现
void initboard(char board[row][col], int r, int c)//对棋盘进行初始化
{
	int i = 0;//行
	int j = 0;//列
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			board[i][j] = ' ';//定义现在数组内容为空格
		}
	}
}

/*
void displayboard(char board[row][col], int v, int m)//创建出棋盘的长相
{
	int a = 0;//定义行
	for (a = 0; a < v; a++) //只用打印行的内容,每循环一次下一行,与列无关
	{
	  printf(" %c | %c | %c \n",board[a][0],board[a][1],board[a][2]);//第a行下标为0的元素,第a行下标为1的元素
	  if(a<v-1)//只打印前两行,最后一行不用打印
	  printf("---|---|---\n");//第一次循环打印的内容
	}
}
*/

//优化 
//按列打印
void displayboard(char board[row][col], int v, int m)//创建出棋盘的长相
								   //1,打印出第一行
{
	int a = 0;//定义行
	for (a = 0; a < v; a++)
	{
		int b = 0;//定义列
		for (b = 0; b < m; b++)
		{
			printf(" %c ", board[a][b]);  //打印第一行 ,空格,字符,空格
			if (b < m - 1)   //小于最后一次循环      
				printf("|");   //分隔符
		}
		printf("\n");
		//2,打印出第一行下面的分割线
		if (a < v - 1)  //打印第一行下面的分割线
		{
			for (b = 0; b < m; b++)
			{
				printf("---");
				if (b < m - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

//玩家输入
void playermove(char board[row][col], int r, int c)
{
	int x = 0;   //横坐标
	int y = 0;   //纵坐标
	printf("玩家走:\n");
	while (1)
	{
		printf("请输入坐标:\n");
		scanf("%d%d", &x, &y);    //输入坐标x,y
		if (x >= 1 && x <= r && y >= 1 && y <= c)  //输入值的合法性 ,&&为并且,都得要同时满足条件
		{
			if (board[x - 1][y - 1] == ' ')//数组的角度是下标,所以减一与输入的值对等,等于空格说明里面没有棋子
			{
				board[x - 1][y - 1] = '*';//满足条件可以输入*
				break;//落子成功跳出去
			}
			else
			{
				printf("该坐标已被占用\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");//继续循环
		}
	}
}
//电脑输入
void computermove(char board[row][col], int n, int m)
{
	int x = 0;
	int y = 0;
	printf("电脑走:\n");
	while (1)
	{
		x = rand() % n;//随机值横坐标的余数
		y = rand() % m;//随机值纵坐标得到余数
		if (board[x][y] == ' ')//如果下的位置是空格
		{
			board[x][y] = '#';//坐标位置为&
			break;//可以输入就跳出
		}

	}

}
//返回1代表棋盘满了
//返回0代表棋盘没满
int isfull(char board[row][col], int z, int x)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < z; i++)
	{
		for (j = 0; j < x; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//没满
			}
		}
	}
	return 1;//满了
}

//判断输赢
char iswin(char board[row][col], int f, int g)
{
	int i = 0;
	//判断横3行
	for (i = 0; i < f; i++)
	{
		//第一行的第一个等于第二行的第一个等于第三行的第一个                第一个不能等于空格     并且代表都要满足
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];//返回上面的随便一个都可以,因为都有满足
		}
	}
	//判断竖3列
	for (i = 0; i < g; 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[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
		return board[1][1];//返回上面的随便一个都可以,因为都有满足

//判断平局
	if (1 == isfull(board, row, col))//判断平局函数
	{
		return'&';
	}
	return'$';
}

最后便是函数的声明:

//函数的声明引用
#include<>//一起引用,不要有两个主函数
//为随机值引用头文件
#include<>
#include<>

#define row  3 //定义行
#define col  3 //定义列

//创建棋盘
void initboard(char board[row][col], int r, int c);//棋盘的初始数据
void displayboard(char board[row][col], int v, int m);//棋盘的模型

//输入数据
void playermove(char board[row][col], int r, int c);//玩家输入
void computermove(char board[row][col], int n, int m);//电脑输入

//判断输赢
//4种情况  返回
// 玩家赢--'*'
// 电脑赢--'#'
// 平局  --'&'
// 继续  --'$'

char iswin(char board[row][col], int f, int g);//返回的字符,char类型
int isfull(char board[row][col], int z, int x);

以上便是这个与电脑对弈的三子棋程序的实现,当然如果取消电脑的行走,再创建一个玩家,那么也可以实现一个玩家与玩家间的对弈。以上便是这个程序的实现。