三子棋的设计与实现

三子棋的设计与实现(可升级难度)

  • 一,游戏介绍与规则
  • 二,游戏的设计思路与代码
    • 主函数
    • .h文件
      • 1.打印游戏菜单界面
      • 2.游戏大致逻辑
      • 3.定义一个二维数组
      • 4.初始化二维数组
      • 5.打印棋盘(二维数组)
      • 6.玩家下棋
      • 7.判断输赢
      • 8.电脑下棋

一,游戏介绍与规则

《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。

二,游戏的设计思路与代码

主函数

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

从主函数中的test();进入游戏内部

.h文件

#pragma once
#define ROW 3
#define COL 3
#include
#include
#include
#include
void menu();
void print_diff();
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 Is_win(char Board[ROW][COL], int row, int col);

1.打印游戏菜单界面

进入游戏内部后打印出菜单,需要给玩家提供两种选择 play和exit
并为了保证玩家在输入错误后,可以重新选择,以及游戏结束后,可以选择再来一局,因此,我们这里应该把整个test函数设计成一个循环。

void menu()
{
	printf("*****************\n");
	printf("*****1.play******\n");
	printf("*****0.exit******\n");
	printf("*****************\n");
}
void test()
{
	srand(time(NULL));
	int input;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			play();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
}

2.游戏大致逻辑

void play()
{
	char ret, Board[ROW][COL];//创建棋盘
	init_Board(Board, ROW, COL);//初始化棋盘
	Print_Board(Board, ROW, COL);//打印棋盘
	while (1)
	{
		player_move(Board, ROW, COL);//玩家落子
		system("cls");
		Print_Board(Board, ROW, COL);//打印棋盘
		ret = Is_win(Board, ROW, COL);//判断输赢
		if (ret != 'C')
			break;
		computer_move(Board, ROW, COL);//电脑落子
		system("cls");
		Print_Board(Board, ROW, COL);//打印棋盘
		ret = Is_win(Board, ROW, COL);//判断输赢
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家胜利\n");
	else if (ret == '$')
		printf("电脑胜利\n");
	else
		printf("平局\n");
}

3.定义一个二维数组

三子棋的棋盘本质上可以看作一个多行多列的二维数组

4.初始化二维数组

将二维数组全部初始化为空格‘ ’

void init_Board(char Board[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		int j;
		for (j = 0; j < col; j++)
			Board[i][j] = ' ';
	}
}

5.打印棋盘(二维数组)

预期结果:
在这里插入图片描述

void Print_Board(char Board[ROW][COL], int row, int col)
{
	int i;
	for (i = 0; i < row; i++)
	{
		int j;
		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");
		}
	}
}

6.玩家下棋

棋盘设置完成后,就该正式进入游戏了,玩三子棋最重要的就是下棋了。
想要实现下棋,需要先找到相应的坐标,找到坐标后,将其所在位置的元素改为‘*’,表示玩家落子,其中我们需要做到以下几点

(1)判断坐标的合法性
(2)判断目标元素是否被占用

void player_move(char Board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	printf("请输入合法坐标\n");
	int x, y;
	while (1)
	{
		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");
	}
}

7.判断输赢

符号 result
* 玩家胜利
# 电脑胜利
Q 平局
C 游戏继续
int Is_full(char Board[ROW][COL], int row, int col)//判断棋盘是否被占满
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (Board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char Is_win(char Board[ROW][COL], int row, int col)//判断游戏进度
{
	for (int i = 1; i < row; i++)
	{
		for (int j = 1; j < col; j++)
		{
			if (j < col - 1)
			{
				if (Board[i][j - 1] == Board[i][j] && Board[i][j] == Board[i][j + 1] && Board[i][j] != ' ')
					return Board[i][j];
			}
			if (i < row - 1)
			{
				if (Board[i - 1][j] == Board[i][j] && Board[i][j] == Board[i + 1][j] && Board[i][j] != ' ')
					return Board[i][j];
			}
			if (i < row - 1 && j < col - 1)
			{
				if (Board[i - 1][j - 1] == Board[i][j] && Board[i][j] == Board[i + 1][j + 1] && Board[i][j] != ' ')
					return Board[i][j];
			}
			if (i < row - 1 && j < col - 1)
			{
				if (Board[i - 1][j + 1] == Board[i][j] && Board[i][j] == Board[i + 1][j - 1] && Board[i][j] != ' ')
					return Board[i][j];
			}
		}
	}
	if (Is_full(Board, row, col) == 1)
		return 'Q';
	else
		return 'C';
}

8.电脑下棋

电脑下棋的时候,坐标是通过生成随机值产生的,将生成的随机值转化为合法的坐标,因此,我们只判断目标元素是否被占用即可

void computer_move(char Board[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	Sleep(2000);
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (Board[x][y] == ' ')
		{
			Board[x][y] = '$';
			break;
		}
	}
}

以上就是三子棋游戏的具体实现,还有许多地方可以进行优化,甚至可以将三子棋改为五子棋,将棋盘改成十行十列等等,如果大家对游戏的优化有更多有趣的想法,欢迎来找我交流,大家一起进步呀

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