第五章 函数-实现三子棋游戏

头文件game.h:包含函数声明和数字定义

#define COL 3
#define ROW 3
#define _CRT_SECURE_NO_WARNINGS

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

void InitBoard(char arr[ROW][COL], int row, int col);
void DisplayBoard(char arr[ROW][COL], int row, int col);
void PlayerMove(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
//四种游戏状态
//玩家赢返回'*'
//电脑赢返回'#'
//平局返回'Q'
//继续返回'C'
char IsWin(char arr[ROW][COL], int row, int col);

源文件game.c:包含所有函数实现

#include "game.h"

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

void DisplayBoard(char arr[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			printf(" %c ",arr[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\\n");
		if (i == row - 1)
			break;
		for (int k = 0; k < col; k++) {
			printf("---");
			if (k < col - 1)
				printf("|");
		}
		printf("\\n");
	}
}

void PlayerMove(char arr[ROW][COL], int row, int col) {
	while (1) {
		int x = 0;
		int y = 0;
		printf("请输入坐标:x=    y=    \\n");
		scanf("%d %d", &x, &y);
		if ((x >= 1 && x <= ROW) && (y >= 1 && y <= ROW)) {
			if (arr[x - 1][y - 1] == ' ') {
				arr[x-1][y-1] = '*';
				break;
			}
			else {
				printf("该位置已经被占用,请重新输入\\n");
			}
		}
		else {
			printf("输入位置不在棋盘内,请重新输入\\n");
		}
	}
}

void ComputerMove(char arr[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;
	printf("电脑行动\\n");
	while(1){
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ') {
			arr[x][y] = '#';
			break;
		}
	}
}

char IsWin(char arr[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];
	}
	for (int j = 0; j < row; j++) {
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')
			return arr[0][j];
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
		return arr[0][2];
	if (isFull(arr, ROW, COL))
		return 'Q';
	return 'C';
}

int isFull(char arr[ROW][COL], int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

源文件test.c:游戏运行基本逻辑

#define _CRT_SECURE_NO_WARNINGS

#include "game.h"

void menu() {
	printf("********************\\n");
	printf("***请输入您的操作***\\n");
	printf("***0.exit 1.play****\\n");
	printf("********************\\n");
}

//游戏算法的实现
void game() {
	char ret = 0;
	srand((unsigned int)time(NULL));
	//数组存储的信息
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1) { 
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断玩家输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断电脑输赢
		ret = IsWin(board,ROW,COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家胜利\\n");
	if (ret == '#')
		printf("电脑胜利\\n");
	if (ret == 'Q')
		printf("平局\\n");
}

void test() {

	int input = 0;
	do {
		menu();
		scanf("%d", &input);
		switch (input) {
			case 0:
				printf("退出游戏\\n");
				break;
			case 1:
				printf("三子棋\\n");
				game();
				break;
			default:
				printf("输入错误,请重新输入\\n");
				break;
		}
	} while (input);
}

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