来把三子棋吗?创建属于你的三子棋。

三子棋

    • 三子棋
    • 整体代码
    • 模板
    • 思路:
    • 实现
      • 1.创建游戏菜单,让玩家可以多次玩游戏
      • 2.menu函数打印菜单
      • 3.game()函数里用来实现棋盘初始化,打印边界线,电脑下棋,玩家下棋,和判断的整体逻辑
  • 总结:

三子棋

目的:对前面知识的灵活运用

整体代码

这里的整体代码分为三块:

  • 首先是有主函数区的文件game_3ziqi.c
  • 其次是game.h用来进行函数声明的
  • 最后是game.c用来进行代码的实现

1.game_3ziqi.c

#include"game.h"
void game()
{
	char board[ROW][COL];
	char ret = 0;
	//初始化棋盘
	init_board(board,ROW,COL);
	//打印数组
	print_board(board,ROW, COL);
	//玩家下棋,再打印出来
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret=judge(board,ROW,COL);
		if (ret != 'C')
		{
			Sleep(1500);
			system("cls");
			print_board(board, ROW, COL);
			break;
		}
		//电脑下棋,再打印出来
		computer_move(board, ROW, COL);
		Sleep(1500);
		system("cls");
		print_board(board, ROW, COL);	
		//判断输赢
		ret = judge(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		
	}
	if (ret == 'O')
		printf("you win !!!\n");
	else if (ret == 'X')
		printf("computer win !\ncomputer:you should work harder!\n");
	else if (ret == 'Q')
		printf("no winer!!!");
}//判断输赢的结果有:玩家赢了返回O,电脑赢了返回X,平局返回Q,游戏继续返回C
void menu(void)
{
	printf("************************\n");
	printf("******  1.play  ********\n");
	printf("******  0.exit  ********\n");
	printf("************************\n");
}
void test(void)
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择数字:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("玩游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新选择哦!\n");
			Sleep(1500);
			system("cls");
		}

	} while (input);
}
int main()
{
	test();
	return 0;
}

2.game.h

#define ROW 3
#define COL 3
#include
#include
#include 
#include
//头文件中,声明函数
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_move(char board[ROW][COL], int row, int col);
char judge(char board[ROW][COL], int row, int col);

3.game.c

#include"game.h"
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}//完成初始化棋盘



void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		system("color 73");
		/*printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);*/
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			printf("|");
		}
		printf("\n");
		if(i<row-1)
		{ 
			/*printf("---|---|---\n");*/
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j<col-1)
				printf("|");
			}
			printf("\n");
		}
		
	}
}


void player_move(char board[ROW][COL], int row, int col)
{
	printf("*玩家请下棋*\n");
	while (1)
	{
		printf("请输入你要下棋的坐标:>");
		int x = 0;
		int y = 0;
		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] = 'O';
				break;
			}
			else
				printf("这个位置已有棋子了哦!!!\n请重新输入。\n");
		}
		else
			printf("输入错误,请重新输入(>-<)!\n");
	}
}


void computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋(0V0) \nLoading.....\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'X';
			break;
		}
	}
}

static int is_full(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++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

char judge(char board[ROW][COL], 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][0] != ' ')
			return board[i][0];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][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 (is_full(board, ROW, COL) == 1)
	{
		return 'Q';
	}
	return 'C';

}

注意:
代码有点多,你可以先把代码拷贝一份,放在你的编译器上运行一下试试,看看效果,如果觉得还行,那就继续往下看,如果觉得不太行,那欢迎来评论区探讨,总之,本篇主要为你提供思路,看完本篇可以试试写一份属于自己的三子棋。

模板

来把三子棋吗?创建属于你的三子棋。_第1张图片

思路:

来把三子棋吗?创建属于你的三子棋。_第2张图片

实现

1.创建游戏菜单,让玩家可以多次玩游戏

#include
void test()
{
	int input=0;
	do
	{
		menu();//用来打印游戏菜单
		printf("请选择数字:>");
		scanf("%d",&input);//玩家选择开始和结束
		switch (input)
		{
		case 1:
			printf("玩游戏\n");
			game();//用来玩游戏的
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新选择哦!\n");
		}
	}while(input);//循环:可以让玩家多次玩

}
int main()
{
	test();//用来创建循环,让玩家可以多次玩
	return 0;
}

2.menu函数打印菜单

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

3.game()函数里用来实现棋盘初始化,打印边界线,电脑下棋,玩家下棋,和判断的整体逻辑

1.首先,先在game.h中声明棋盘初始化函数,打印边界线函数,电脑下棋函数,玩家下棋函数,和判断的函数。

#define ROW 3//字符数组的行
#define COL 3//字符数组的列
#include//printf函数与scanf函数
#include//系统调用函数,system(),rand函数
#include//Sleep函数 
#include//时间戳函数
//头文件中,声明函数
void init_board(char board[ROW][COL], int row, int col);
//棋盘初始化函数的声明
void print_board(char board[ROW][COL], int row, int col);
//打印棋盘边界的函数声明
void player_move(char board[ROW][COL], int row, int col);
//玩家下棋函数的声明
void computer_move(char board[ROW][COL], int row, int col);
//电脑下棋的声明
char judge(char board[ROW][COL], int row, int col);
//判断谁赢的函数声明

2.在game()函数里调用棋盘初始化函数,在game.c中实现棋盘初始化函数

  • game()函数中调用调用棋盘初始化函数
#include"game.h"//用来函数的声明
void game()
{
	char board[ROW][COL];
	//初始化棋盘
	init_board(board,ROW,COL);//棋盘初始化函数的调用
}
  • game.c中实现棋盘初始化函数
#include"game.h"
void init_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//将字符数组元素都赋值为空格
		}
	}
}//完成初始化棋盘

完成后你是看不到的,所以才要打印棋盘边界线

3.在game()函数里调用打印边界线函数,在game.c中实现打印棋盘边界线函数

  • 在game()函数里调用打印边界线函数
#include"game.h"
void game()
{
	char board[ROW][COL];
	//打印棋盘边界线
	print_board(board,ROW, COL);//调用打印棋盘边界线函数
}
  • 在game.c中实现打印棋盘边界线函数
//第一种方法:直接格式化打印
void print_board(char board[ROW][COL], 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<row-1)
		printf("---|---|---\n");	
	}
}


//第二种方法:在方法一的基础上拆分成循环,更加灵活
void print_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			printf("|");
		}
		printf("\n");
		if(i<row-1)
		{ 
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j<col-1)
				printf("|");
			}
			printf("\n");
		}
		
	}
}

4.在game()函数里调用玩家下棋的函数,在game.c中实现玩家下棋的函数

  • 在game()函数里调用玩家下棋的函数
#include"game.h"
void game()
{
	char board[ROW][COL];
	player_move(board, ROW, COL);//调用玩家下棋的函数
	print_board(board,ROW, COL);//打印出来让玩家看到
}

  • game.c中实现玩家下棋的函数
    首先看看玩家下棋的逻辑:
    来把三子棋吗?创建属于你的三子棋。_第3张图片
void player_move(char board[ROW][COL], int row, int col)
{
	printf("*玩家请下棋*\n");
	while (1)
	{
		printf("请输入你要下棋的坐标:>");
		int x = 0;
		int y = 0;
		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] = 'O';
				break;
			}
			else
				printf("这个位置已有棋子了哦!!!\n请重新输入。\n");
		}
		else
			printf("输入错误,请重新输入(>-<)!\n");//不合法
	}
}

5.在game()函数里调用电脑下棋的函数,在game.c中实现电脑下棋的函数

  • game()函数里调用电脑下棋的函数
#include"game.h"
void game()
{
	char board[ROW][COL];
	computer_move(board, ROW, COL);//调用电脑下棋的函数
	print_board(board,ROW, COL);//打印出来让玩家看到
}
  • 在game.c中实现电脑下棋的函数,让电脑随机下棋,棋子为X,哪里有空格下哪里,需要调用rand()函数
void computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋(0V0) \nLoading.....\n");
	while (1)
	{
		int x = rand() % row;//让行坐标范围是0~ 3
		int y = rand() % col;//让列坐标范围是0~ 3
		if (board[x][y] == ' ')//判断是否是空格
		{
			board[x][y] = 'X';
			break;
		}
	}
}

注意:
使用rand()函数要有随机值,就要调用srand((unsigned int)time(NULL));
但只能调用一次,不能多次调用,因此把srand函数放在test()函数中。

6.实现电脑和玩家能多次下棋,而不止步于只能下一次

  • game()函数中创建一个循环
while (1)
	{
		//玩家下棋,打印出来
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//电脑下棋,再打印出来
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);		
	}

7.最后,就是判断部分

  • 在game()函数中调用判断函数
#include"game.h"
void game()
{
	char board[ROW][COL];
	ret=judge(board,ROW,COL);
}

首先创建有返回值的判断函数,然后我们理清有多少种情况:
来把三子棋吗?创建属于你的三子棋。_第4张图片

1.我们把玩家赢和电脑赢看作一类

要么三个一样的连成一行或一列,要么连成对角线
代码实现:

char judge(char board[ROW][COL], 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][0] != ' ')
			return board[i][0];
	}
	//判断三个一样的连成一列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][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];

2.当棋盘满的时候,就意味着平局

代码实现:

int is_full(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++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

char judge(char board[ROW][COL], int row, int col)
{
	if (is_full(board, ROW, COL) == 1)
	{
		return 'Q';//另起炉灶,在一个函数里写的太麻烦
	}
}

3.游戏继续

当前面的情况判断完后,就只剩下最后一种了,那么就直接return ‘C’;

4.判断函数在game()函数中的使用

void game()
{
	char board[ROW][COL];
	char ret = 0;
	//初始化棋盘
	init_board(board,ROW,COL);
	//打印数组
	print_board(board,ROW, COL);
	//玩家下棋,再打印出来
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret=judge(board,ROW,COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑下棋,再打印出来
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);	
		//判断输赢
		ret = judge(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		
	}
	if (ret == 'O')
		printf("you win !!!\n");
	else if (ret == 'X')
		printf("computer win !\ncomputer:you should work harder!\n");
	else if (ret == 'Q')
		printf("no winer!!!");
}//判断输赢的结果有:玩家赢了返回O,电脑赢了返回X,平局返回Q,游戏继续返回C

总结:

以上就是三子棋的整体逻辑和代码实现,如果喜欢本篇内容,不妨赞一赞,有什么疑问,咱们可以评论区一起聊,如果想要后期一起学习,不妨点个关注,我每周都会更新博客,(baibai) !!!

你可能感兴趣的:(c语言)