数组游戏——三子棋

Posted 张同学吧

tags:

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

·功能介绍

三子棋的基本功能有,电脑下棋,玩家落点是否合法,以及判赢机制。

·代码实现及注释

1、主函数的实现以及三子棋的构思框架(test.c)

简单的一个选择菜单,玩家选完选项后,用switch语句分支。

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main() {
	srand((unsigned)time(NULL));
	int a;
	do
	{
		menu();
		printf("请选择选项\\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			game();
			break;
		case 2:
			printf("游戏结束\\n");
			break;
		default:
			break;
		} 
	} while (a != 2);

	return 0;
}

其次在main函数中,有menu()函数,和game()函数。其中menu函数就是菜单的输出界面,比较简单,如下:
在这里插入图片描述

void menu() {
	printf("---------------------------------\\n");
	printf("*********************************\\n");
	printf("**********1、开始游戏************\\n");
	printf("**********2、退出游戏************\\n");
	printf("*********************************\\n");
	printf("---------------------------------\\n");
}

2、三子棋功能的实现(game.c)

而game()函数则是游戏的主体,各个功能的实现都是在这个函数中实现。
注意:我们用二维数组来实现棋盘,row和rol分别表示行和列。玩家棋子:‘X’, 电脑棋子:‘O’。
首先,第一个功能是重置棋盘initBoard();因为每一轮新的游戏都得是一个清空的棋盘。这个函数的主要功能就是在游戏开始前将我们的棋盘进行初始化。初始化的结果就是,每一个数组都被重置为" "(空格),

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

Showboard();重置完棋盘之后,就需要把棋盘打印出来了。因为玩家需要看到棋盘的样子再决定下一步该怎么走。

void ShowBoard(char board[ROW][COL], int row, int col)
{
	printf("=====================\\n");
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//三个空格
			printf(" %c ", board[i][j]);
			//两列竖线
			if (j < col - 1)
			{
				printf("|");
			}
		}
		//换行
		printf("\\n");
		//横线只有2行
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				//
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\\n");
		}

	}
	printf("=====================\\n");
}

在这里插入图片描述
Playertime();玩家回合,玩家通过输入坐标落子,但是需要判断落子的位置是否合法、是否已经被其他棋子占用。

void ShowBoard(char board[ROW][COL], int row, int col)
{
	printf("=====================\\n");
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//三个空格
			printf(" %c ", board[i][j]);
			//两列竖线
			if (j < col - 1)
			{
				printf("|");
			}
		}
		//换行
		printf("\\n");
		//横线只有2行
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				//
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\\n");
		}

	}
	printf("=====================\\n");
}

Computertime();
在玩家下完棋后,电脑随机选定一个坐标落子,坐标在[row] [col]范围内通过rand()函数随机选定。

void Computertime(char board[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}

在这里插入图片描述

IsWin/isFull();判断结果函数。每一次玩家或电脑落子之后,都需要判断是否满足获胜条件或者平局条件。
获胜的条件就是有任意一种棋子满足了某一行或这某一列,以及正副对角线全部占满。在判定某一行时,行数是不变的,所以我们只需要一个for循环,遍历所有的行数就可以判定。判定某一列同理。判断正副对角线也不难,只需要指定坐标下的棋子一样就满足条件。满足了条件之后,通过返回’X’和’O‘来区分玩家获胜还是电脑获胜。
然后就是判断棋盘是否还有空间下,那么只要有“ ”(空格)的数组,就有空间可以下,如果没有空间,返回一个特定值,在main的game()函数中,依据不同的返回值,来确定游戏结果。

static int isFull(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 -1;
			}
		}
	}
	return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
	//行
	for (int i = 0; i < row; i++) {
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ') {
			return board[i][0];
		}
	}
	//列
	for (int j = 0; j < col; j++) {
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ') {
			return board[0][j];
		}
	}
	//正对角线、副对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ') {
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ') {
		return board[1][1];
	}
	//是否是平局
	if (isFull(board, row, col) == 1)
	{
		return 'Q';
	}
	return ' ';
}

在这里插入图片描述
在这里插入图片描述

3、头文件的引用(game.h)

·头文件中,我们需要定义所有的头文件以及引用的各种函数,这边添加了相关的注释方便大家观看。
·其中的define定义了行和列的大小

#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void initBoard(char board[ROW][COL], int row, int col);
void ShowBoard(char board[ROW][COL], int row, int col);
void Playertime(char board[ROW][COL], int row, int col);
void Computertime(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);

·代码展示

game.h

#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void initBoard(char board[ROW][COL], int row, int col);
void ShowBoard(char board[ROW][COL], int row, int col);
void Playertime(char board[ROW][COL], int row, int col);
void Computertime(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void ShowBoard(char board[ROW][COL], int row, int col)
{
	printf("=====================\\n");
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//三个空格
			printf(" %c ", board[i][j]);
			//两列竖线
			if (j < col - 1)
			{
				printf("|");
			}
		}
		//换行
		printf("\\n");
		//横线只有2行
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				//
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\\n");
		}

	}
	printf("=====================\\n");
}
void Playertime(char board[ROW][COL], int row, int col)
{
	while (1)
	{
		printf("请输入坐标");
		int x = 0, y = 0;
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] = 'X';
				break;
			}
			else
			{
				printf("坐标已经有棋子,请重新输入。");
			}
		}
		else
		{
			printf("坐标不合法");
		}
	}
}
void Computertime(char board[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}
static int isFull(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 -1;
			}
		}
	}
	return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
	//行
	for (int i = 0; i < row; i++) {
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ') {
			return board[i][0];
		}
	}
	//列
	for (int j = 0; j < col; j++) {
		if以上是关于数组游戏——三子棋的主要内容,如果未能解决你的问题,请参考以下文章

三子棋游戏设计及代码实现

三子棋(会堵棋)

一个超好玩的三子棋小游戏

还有这事?——一小时学会三子棋(优化版)

用C语言编写三子棋小游戏

关于三子棋游戏的简易实现与N子棋胜利判断方法