c语言实现简易三(n)子棋(二维数组的应用)

一、思路总概

  1. 创建一个二维数组作为棋盘,用来表示棋局状态。可以使用 char 类型的二维数组,其中每个元素表示棋盘对应位置的状态,例如 '*' 表示玩家的棋子,'#' 表示电脑的棋子,' ' 表示空位置。

  2. 编写一个函数来初始化棋盘,将所有位置都设置为空。

  3. 编写一个函数来打印当前的棋盘状态,以可视化形式展示给玩家。

  4. 编写一个函数来判断是否达到游戏结束的条件。游戏继续,平局,获胜。

  5. 编写一个函数来处理玩家的落子操作。根据玩家输入的坐标,判断该位置是否合法(即是否为空),如果合法则将对应位置设置为玩家的棋子,并更新棋盘状态,再次打印棋盘。

  6. 编写一个函数来模拟电脑的落子操作。可以采用简单的随机策略,在空位置中随机选择一个落子点,并将该位置设置为电脑的棋子。

  7. 编写一个主循环,不断交替执行以下操作:打印当前棋盘状态、让玩家落子、判断游戏是否结束。如果游戏结束,则输出胜利者或平局,并结束游戏。

二、代码实现

1、头文件(这里命名为game.h)

#pragma once
#define ROW 3
#define COL 3
#define WIN_COUNT 3
#include <stdio.h>
#include <stdbool.h>

void Initboard(char board[ROW][COL], int row, int col);

void Printboard(char board[ROW][COL], int row, int col);

void Playermove(char board[ROW][COL], int row, int col);

void Computermove(char board[ROW][COL], int row, int col);

bool isGameOver(char board[ROW][COL], int row, int col);

2、游戏所用到的函数

#define  _CRT_SECURE_NO_WARNINGS
#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 Printboard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{		
			if (j < col - 1)
			    printf(" %c |",board[i][j]);
		    else
			    printf(" %c ",board[i][j]);
		}
		printf("\n");
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				if (j < col - 1)
					printf("---|");
				else
					printf("---");
			}
			printf("\n");
		}
	}
}

void Playermove(char board[ROW][COL], int row, int col)
{
	printf("请输入棋子坐标(行 列):");
    input:
	scanf("%d %d", &row, &col);
	if (board[row - 1][col - 1] == ' ')
		board[row - 1][col - 1] = '*';
    else
    {
        printf("请输入有效的棋子坐标\n");
        Printboard(board, ROW, COL);
        goto input;
    }
}

void Computermove(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] = '#';
			break;
		}
	}
}

bool isGameOver(char board[ROW][COL],int row,int col) {
    // 检查行、列和对角线
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j <= ROW - WIN_COUNT; j++) {
            bool win = true;
            for (int k = 0; k < WIN_COUNT - 1; k++) {
                if (board[i][j + k] == ' ' || board[i][j + k] != board[i][j + k + 1]) {
                    win = false;
                    break;
                }
            }
            if (win)
                return true;
        }
        for (int j = 0; j <= ROW - WIN_COUNT; j++) {
            bool win = true;
            for (int k = 0; k < WIN_COUNT - 1; k++) {
                if (board[j + k][i] == ' ' || board[j + k][i] != board[j + k + 1][i]) {
                    win = false;
                    break;
                }
            }
            if (win)
                return true;
        }
    }
    for (int i = 0; i <= ROW - WIN_COUNT; i++) {
        for (int j = 0; j <= ROW - WIN_COUNT; j++) {
            bool win = true;
            for (int k = 0; k < WIN_COUNT - 1; k++) {
                if (board[i + k][j + k] == ' ' || board[i + k][j + k] != board[i + k + 1][j + k + 1]) {
                    win = false;
                    break;
                }
            }
            if (win)
                return true;
        }
    }
    for (int i = 0; i <= ROW - WIN_COUNT; i++) {
        for (int j = ROW - 1; j >= WIN_COUNT - 1; j--) {
            bool win = true;
            for (int k = 0; k < WIN_COUNT - 1; k++) {
                if (board[i + k][j - k] == ' ' || board[i + k][j - k] != board[i + k + 1][j - k - 1]) {
                    win = false;
                    break;
                }
            }
            if (win)
                return true;
        }
    }

    // 检查是否平局
    bool full = true;
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < ROW; j++) {
            if (board[i][j] == ' ') {
                full = false;
                break;
            }
        }
    }
    if (full)
        return true;

    return false;
}

3、主函数

#define  _CRT_SECURE_NO_WARNINGS
#include "game.h"

int main()
{
	char board[ROW][COL];
	Initboard(board, ROW, COL);
    while (!isGameOver(board,ROW,COL)) {
        Printboard(board, ROW, COL);
        Playermove(board, ROW, COL);

        if (isGameOver(board, ROW, COL)) {
            printf("游戏结束,你获胜了!\n");
            break;
        }

        Computermove(board, ROW, COL);

        if (isGameOver(board, ROW, COL)) {
            printf("游戏结束,电脑获胜!\n");
            break;
        }
    }

    Printboard(board, ROW, COL);
    return 0;
}

如果需要将该游戏扩展为n字棋,仅需要将头文件中对ROL、COL、WIN_OOUNT的值进行修改。

另:本次只针对游戏主体进行了设计,如需菜单,游戏进入,游戏退出等请自行进行设计。

以上---------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值