三子棋大致构建思路

设计思路:

1*  菜单——输入选择:1.PLAY(开始游戏

                                   0.EXIT(退出游戏

                                    其他,重新进入菜单选择

2* PLAY(开始游戏)(大致结构):

       1.创建并打印棋盘-2.玩家下棋-3.电脑下棋-4.判断局势-5.得出结果-6.返回1*菜单

3*创建并打印棋盘:

       棋盘为3*3结构,创建一个二维数组存放棋子即可

       1.创建二位数组char ch[3][3]

       2.数组ch初始化为空格

void init(char ch[R][C], int r, int c)
{
	//数组初始化,赋予空格
	int i = 0; int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			ch[i][j] = ' ';
		}
	}
}

       3.棋盘框架的构建

void Printf(char ch[R][C],int r, int c)//r和c分别是棋盘的行和列数
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)//打印表格以“空格字符空格竖杠”为一组( %c |)
		{                      //在打印最后一组的时候不用输出竖杠   
			printf(" %c ", ch[i][j]);
			if (j < r - 1)//竖杠的打印,只输出两组
			{
				printf("|");
			}
		}
		printf("\n");在第一行打印完后记得换行
		if (i < r-1)//以三个短横杠和一个竖杠为一组,组成划分横行的界线(三子棋只需要两组划分
		{
			for (j = 0; j < c; j++)
			{
				printf("---");
				if (j < c - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//棋盘效果图,上部分为菜单//

                                三子棋大致构建思路_第1张图片

 4*玩家下棋

void human(char ch[R][C], int r, int c)
{
	printf("玩家回合\n");
	while (1)//因为有输入错误超出棋盘范围及输出到有棋子的格子的情况
	{        //所以选择循环结果,当成功数组成功被赋值(即下棋到一个空位的情况
		int a = 0;//可以直接选择break跳出循环就可以了
		int b = 0;
		printf("请输入要填放的坐标\n");
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= r && b >= 1 && b <= c)//判断坐标是否在棋盘内                                                                 
                                                 //注意数组的下标从0开始
		{                                        //对应的存放的数组坐标为棋盘的行列坐标-1
			if (ch[a - 1][b - 1] == ' ')//判断是否有空位
			{
				ch[a - 1][b - 1] = '*';//没有则赋值*
				break;//赋值成功跳出循环
			}
			else
			{
				printf("已有棋子,请重新输入\n");
			}
		}
		else
		{
			printf("超出范围,请重新输入\n");
		}
	}
}

5*电脑下棋

void pc(char ch[R][C], int r, int c)
{
	printf("电脑回合\n");
	while (1)
	{                    //rand取余多少就是在取余数的范围内随机输出 例如%3,随机值就在3内
		int x = rand() % r;
		int y = rand() % c;
		if (ch[x][y] == ' ')
		{
			ch[x][y] = '#';
			break;
		}
	}
}

6*判断局势

char win(char ch[R][C], int r, int c)
{
	int i = 0;
	for (i = 0; i < R; i++)//判断行
	{
		if (ch[i][0] == ch[i][1] && ch[i][0] == ch[i][2] && ch[i][0] != ' ')
		{
			return ch[i][0];
		}
	}

	for (i = 0; i < R; i++)//判断列
	{
		if (ch[0][i] == ch[1][i] && ch[0][i] == ch[2][i] && ch[0][i] != ' ')
		{
			return ch[0][i];
		}
	}
	//判断对角线
	if (ch[0][0] == ch[1][1]&& ch[0][0] == ch[2][2] && ch[0][0] != ' ')
	{
		return ch[1][1];
	}
	if (ch[0][2] == ch[1][1]&&ch[0][2] == ch[2][0] && ch[0][2] != ' ')
	{
		return ch[1][1];
	}
	//判断是否满棋盘
	if (full(ch, r, c) == 1)//判断是否棋盘满的函数在下列
	{
		return 'q';//q返回代表满棋盘,平局
	}

	return 'c';//均不符合以上条件,没人胜利,棋盘没满继续游戏
}

判断棋盘是否满的函数

static int full(char ch[R][C], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < R; i++)
	{
		for (j = 0; j < C; j++)
		{
			if (ch[i][j] == ' ')
			{
				return 0;//任意一个坐标有空位则继续游戏
			}
		}
	}
	return 1;//返回1代表棋盘满了
}

7*得出结果

void game()
{
	char ch[R][C];
	char ret;

	init(ch, R, C);//数组初始化

	Printf(ch, R, C);//打印棋盘

	while (1)
	{
		human(ch, R, C);//玩家回合
		Printf(ch, R, C);//打印玩家下棋后的棋盘
		ret = win(ch, R, C);//判断是否获胜
		if (ret != 'c')
		{
			break;//如果在win函数中返回值不为c(c的含义是没人胜利,棋盘没满
		}         //则跳出循环,经行下方的结果判断
		pc(ch, R, C);//电脑回合
		Printf(ch, R, C);//打印电脑下棋后的棋盘
		ret = win(ch, R, C);//判断是否获胜
		if (ret != 'c')
		{
			break;
		}
	}
    //结果判断
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	else if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'q')
	{
		printf("平局\n");
	}
}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include 
#include 
#include 

#define R 3
#define C 3

void init(char ch[R][C], int r, int c);

void Printf(char ch[R][C], int r, int c);

void human(char ch[R][C], int r, int c);

void pc(char ch[R][C], int r, int c);

char win(char ch[R][C], int r, int c);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"


void game()
{
	char ch[R][C];
	char ret;

	init(ch, R, C);//数组初始化

	Printf(ch, R, C);//打印棋盘

	while (1)
	{
		human(ch, R, C);
		Printf(ch, R, C);
		ret = win(ch, R, C);
		if (ret != 'c')
		{
			break;
		}
		pc(ch, R, C);
		Printf(ch, R, C);
		ret = win(ch, R, C);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	else if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'q')
	{
		printf("平局\n");
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	int a = 0;
	do
	{
		menu();

		printf("请选择项\n");
		scanf("%d", &a);

		switch (a)
		{
		case 1: printf("开始游戏\n"); game(); break;
		case 0: printf("退出游戏\n"); break;
		default: printf("选择无效,请重新选择\n"); break;
		}
	} while (a);
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void menu()
{
	printf("***************************\n");
	printf("*******   1.PLAY  *********\n");
	printf("*******   0.EXIT  *********\n");
	printf("***************************\n");
}

void init(char ch[R][C], int r, int c)
{
	//数组初始化,赋予空格
	int i = 0; int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			ch[i][j] = ' ';
		}
	}
}

void Printf(char ch[R][C],int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			printf(" %c ", ch[i][j]);
			if (j < r - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < r-1)
		{
			for (j = 0; j < c; j++)
			{
				printf("---");
				if (j < c - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void human(char ch[R][C], int r, int c)
{
	printf("玩家回合\n");
	while (1)
	{
		int a = 0;
		int b = 0;
		printf("请输入要填放的坐标\n");
		scanf("%d %d", &a, &b);
		if (a >= 1 && a <= r && b >= 1 && b <= c)
		{
			if (ch[a - 1][b - 1] == ' ')
			{
				ch[a - 1][b - 1] = '*';
				break;
			}
			else
			{
				printf("请勿重新输入,请重新输入\n");
			}
		}
		else
		{
			printf("超出范围,请重新输入\n");
		}
	}
}

void pc(char ch[R][C], int r, int c)
{
	printf("电脑回合\n");
	while (1)
	{
		int x = rand() % r;//rand取余多少就是在取余数的范围内随机输出例如%3,随机值就不超过3
		int y = rand() % c;
		if (ch[x][y] == ' ')
		{
			ch[x][y] = '#';
			break;
		}
	}
}

static int full(char ch[R][C], int r, int c)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < R; i++)
	{
		for (j = 0; j < C; j++)
		{
			if (ch[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

char win(char ch[R][C], int r, int c)
{
	int i = 0;
	for (i = 0; i < R; i++)//判断行
	{
		if (ch[i][0] == ch[i][1] && ch[i][0] == ch[i][2] && ch[i][0] != ' ')
		{
			return ch[i][0];
		}
	}

	for (i = 0; i < R; i++)//判断列
	{
		if (ch[0][i] == ch[1][i] && ch[0][i] == ch[2][i] && ch[0][i] != ' ')
		{
			return ch[0][i];
		}
	}
	//判断对角线
	if (ch[0][0] == ch[1][1]&& ch[0][0] == ch[2][2] && ch[0][0] != ' ')
	{
		return ch[1][1];
	}
	if (ch[0][2] == ch[1][1]&&ch[0][2] == ch[2][0] && ch[0][2] != ' ')
	{
		return ch[1][1];
	}
	//判断是否满棋盘
	if (full(ch, r, c) == 1)
	{
		return 'q';//q返回代表满棋盘,平局
	}

	return 'c';//均不符合以上条件,没人胜利,棋盘没满继续游戏
}

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