童年回忆《三子棋》

Posted 神爱世人.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了童年回忆《三子棋》相关的知识,希望对你有一定的参考价值。

目录

三子棋的定义与玩法

游戏框架思路

开始界面 

 游戏主体

初始化棋盘

打印棋盘

画出棋盘的大概思路

下棋

玩家下棋

电脑下棋

判断输赢

 判断平局

完整代码

test.c

game.c

game.h


三子棋的定义与玩法

定义:三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。

                                                    

玩法:将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

游戏框架思路

开始界面 

开始的时候打印菜单,提醒玩家选择游戏(选1或者0),选1开始游戏,选择0退出程序,选择的不是1也不是0,会出现选择错误,请重新选择。

int main()
{
	int input = 0;
	do
	{
		menu();//菜单函数
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋\\n");
			break;
		case 0:
			printf("退出游戏\\n");
			break;
		default:
			printf("选择错误,请重新选择\\n");
			break;
		}
	} while (input);
	return 0;
}

menu 菜单函数

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

打印结果

 游戏主体

真正实现三子棋是在case1中实现,不是一两句话能够实现的,要封装一个game函数,用于替换case1中的 printf("三子棋\\n");

void game()

初始化棋盘

三子棋顾名思义3*3的空间来存放,那我们就需要一个二维数组来存放棋子

char board[ROW][COL];//棋盘数组(ROW COL在头文件中define中定义为3 代表行和列)

然后在头文件中声明,在源文件中实现

void InitBoard(char board[ROW][COL], int row, int col);
void InitBoard(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] = ' ';//将数组中所有元素初始化为空格
		}
	}
}

打印棋盘

画出棋盘的大概思路

0 代表空格

 代表数组中存放的元素

 将两行当成一组来打印,一共有三组

 

void DisplayBoard(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)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");//同样的道理
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\\n");
	}
}

下棋

三子棋是回合制,玩家和电脑每人一次,要利用到循环

while (1)
	{
		player_move(board, ROW, COL);//每次下完棋都要打印棋盘
		display_board(board, ROW, COL);
        computer_move(board, ROW, COL);
		display_board(board, ROW, COL);
    }

玩家下棋

void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("<玩家下棋>\\n");

	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		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("坐标被占用,请重新输入\\n");
			}
		}
		else
		{
			printf("坐标错误,请重新输入\\n");
		}
	}
}

电脑下棋

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;
		}
	}
}

注意:电脑下棋具有随机性,要利用主函数中使用srand函数(想加入人工智能的同学,可以自行尝试)

srand((unsigned int)time(NULL));

判断输赢

有四种不同的情况
1.玩家胜利-'*'
2.电脑胜利-'#'
3.平局-'Q'
4.继续-'C'

char Inwin(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[1][1];
	}

	//对角线
	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 (IsFull(board, row, col))
	{
		return 'Q';
	}
	//游戏继续
	return 'C';
}

 判断平局

IsFull(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;//真
}

完整代码

test.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];//棋盘数组
	//初始化棋盘-board的元素都给成空格
	InitBoard(board, ROW, COL);

	//打印棋盘
	DisplayBoard(board, ROW, COL);

	//下棋
	char ret = 0;
	while (1)
	{
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret=Inwin(board,ROW,COL);
		if (ret != 'C')
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Inwin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家胜利\\n");
	}
	else if (ret == '#')
	{
		printf("电脑胜利\\n");
	}
	else
	{
		printf("平局\\n");
	}
}


int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//菜单函数
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\\n");
			break;
		default:
			printf("选择错误,请重新选择\\n");
			break;
		}
	} while (input);
	return 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;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';//将数组中所有元素初始化为空格
		}
	}
}

void DisplayBoard(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)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");//同样的道理
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\\n");
	}
}

void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("<玩家下棋>\\n");

	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		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("坐标被占用,请重新输入\\n");
			}
		}
		else
		{
			printf("坐标错误,请重新输入\\n");
		}
	}
}


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;
		}
	}
}

IsFull(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 Inwin(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[1][1];
	}

	//对角线
	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 (IsFull(board, row, col))
	{
		return 'Q';
	}
	//游戏继续
	return 'C';
}

game.h

#pragma once

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#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 PlayerMove(char board[ROW][COL], int row, int col);

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

//判断游戏输赢
//有四种不同的情况
//玩家胜利-'*'
//电脑胜利-'#'
//平局-'Q'
//继续-'C'
char Inwin(char board[ROW][COL], int row, int col);

如有漏洞不足还希望给位大佬在评论区提出宝贵的意见,在此希望各位与时俱进,共同进步

以上是关于童年回忆《三子棋》的主要内容,如果未能解决你的问题,请参考以下文章

三子棋游戏

数组游戏——三子棋

三子棋代码教学

三子棋代码教学

三子棋代码教学

三子棋代码教学