数组游戏——三子棋

·功能介绍

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

·代码实现及注释

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 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("坐标不合法");
		}
	}
}

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

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu() {
	printf("---------------------------------\n");
	printf("*********************************\n");
	printf("**********1、开始游戏************\n");
	printf("**********2、退出游戏************\n");
	printf("*********************************\n");
	printf("---------------------------------\n");
}
void game() {
	printf("开始玩游戏\n");
	char board[ROW][COL] = { 0 };
	initBoard(board, ROW, COL);
	ShowBoard(board, ROW, COL);
	char ret;
	while (1)
	{
		Playertime(board, ROW, COL);
		//每走完一步都要判断一次结果
		ret = IsWin(board, ROW, COL);
		if (ret != ' ')
		{
			break;
		}
		ShowBoard(board, ROW, COL);
		Computertime(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		if (ret != ' ')
		{
			break;
		}
		ShowBoard(board, ROW, COL);
	}
	if (ret == 'X')
	{
		printf("玩家获胜\n");
	}
	else if (ret == 'O')
	{
		printf("电脑获胜\n");
	}
	else if (ret == 'Q') 
	{
		printf("平局\n");
	}
}
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;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值