解析三子棋

目录

1.初始化棋盘

2.打印棋盘

 3.玩家落子

4.电脑落子 

5.判断输赢

6.判断棋盘是否满了 

目录以及开始游戏


三棋我分成了三个文件分别为

头文件game.h 

调用文件test.c

放置文件的具体函数实现的文件game.c

#define _CRT_SECURE_NO_WARNINGS这个是为了引用scanf不报错调用

#define _CRT_SECURE_NO_WARNINGS
#pragma once
//行数和列数
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include <Windows.h>
#define ROW 3
#define COL 3
//初始化棋盘
void display_board(char board[ROW][COL], int row, int col);
//打印棋盘
void init_board(char board[ROW][COL],int row, int col);
//玩家落子
void player_board(char board[ROW][COL], int row, int col);
//电脑落子
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char judge_board(char board[ROW][COL], int row, int col);

初始化棋盘,打印棋盘,玩家落子,电脑落子返回类型都是void的原因是传的参数是二维数组数组传参传的就是首元素的地址所以不需要返回

#define ROW 3   #define COL 3是方便以后打印棋盘的大小

1.初始化棋盘

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

因为不需要返回所以用void作为返回类型上传的参数分别为二位数组行和列其中行可以省略列不能省略 row 和 col 分别为行和列的参数。

具体实现为

void display_board(char board[ROW][COL], int row, int col)
{
	int i = 0;//创建行
	int j = 0;//创建列
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] =' ';//为了使棋盘看着没有东西把棋盘元素全部替换成空格
		}
	}
}

这样就可以把row 行和col列全部初始化成空格 

2.打印棋盘

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

void传二维数组是为了在打印表格的时候把空格放到棋盘中央以便于替换其中的‘ ’。

具体实现为

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

不是传统打印死是为了棋盘能够根据row 和 col 的变化而变化例如

row = 3

col = 3

row = 5 

col = 5

可以根据不同的需求打印不同的大小

 3.玩家落子

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

函数声明

void player_board(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	int x = 0;
	int y = 0;
	//输入坐标
	//判断是否可以下棋
	while (1)
	{
		printf("请输入\n");
		scanf("%d %d", &x, &y);//输入想要填入的左边1
//判断玩家输入的坐标是否在范围之内如果在范围之内则进入语句进行下一步判断
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
//因为数组下标是从零开始的所以x-1,y-1是为了跟二维数组保持一致
//首先判断玩家输入的坐标是否为有之前已经输入过的坐标
			{
				board[x - 1][y - 1] = '*';
//如果没有就把空格替换为*
				return;
			}
			else
			{
//有其他符号就提醒玩家这个位置已经被占用
				printf("此位置已经被占用\n");
			}
		}

		else
//如果不在则返回并提醒坐标输入错误
		{
			printf("坐标输入错误\n");
		}
	}
}

4.电脑落子 

void computer_board(char board[ROW][COL], int row, int col);
函数声明

void computer_board(char board[ROW][COL], int row, int col)
{
	printf("电脑落子\n");
	while (1)
	{
//在这里采用rand函数来产生随机数并%上行和列来限制范围
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
//如果产生的坐标的位置等于空格则替换#
//否则将重新生成坐标直到坐标替换成功
			board[x][y] = '#';
			return 0;
		}
	}
}

5.判断输赢

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

函数声明 

char judge_board(char board[ROW][COL], int row, int col)
{
	
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
//判断每一行是否相等
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
//相等则返回这一行的符号
			return board[i][0];
	for (j = 0; j < col; j++)
//判断每一列是否相等
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
			return board[0][j];
//判断两个对角线是否相等
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2]&&board[0][0]!=' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && board[0][2] == board[1][1] && board[1][1] != ' ')
		return board[0][2];
//如果都没有通过的话判断棋盘是否是满的来决定游戏是否继续
//这里我直接在前面写的is_full函数来判断
	int c=is_full(board, row, col);
	if (c == 0)
	{
//如果没满则返回C继续
		return 'C';
	}
	if (c == 1)
	{
//满了则返回Q
		return 'Q';
	}
}

6.判断棋盘是否满了 

int is_full(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for ( j = 0; j < col; j++)
        {
            if (' '==board[i][j])
//二维数组的每一个元素分别对应观察是否为' '如果为空格则还有位置返回0;
                return 0;
        }
    }
//没有位置则返回1
    return 1;
}

目录以及开始游戏

#include "game.h"
void menu ()
{
//打印菜单
	printf("■■■■■■■■■■■■■\n");
	printf("■■■■■1.game■■■■■\n");
	printf("■■■■■0.exit■■■■■\n");
	printf("■■■■■■■■■■■■■\n");
}
game()
{
	char judge = 0;
	char board[ROW][COL];
	//初始化棋盘
	display_board(board, ROW, COL);
	//打印棋盘
	init_board(board, ROW, COL);
	while (1)
	{
//为了娱乐感让电脑暂停1秒
		Sleep(1000);
		//玩家下棋
//清空面板
		system("cls");
//打印面板让玩家可以看的落子状态
		init_board(board, ROW, COL);
//玩家落子
		player_board(board, ROW, COL);
//判断玩家是否赢了
		judge = judge_board(board, ROW, COL);
//赢了就break跳出
		if (judge != 'C')
			break;
		init_board(board, ROW, COL);
		printf("电脑正在思考\n");
		Sleep(1000);
//电脑落子
		computer_board(board, ROW, COL);
//判断电脑是否胜利
		judge = judge_board(board, ROW, COL);
//电脑胜利则跳出
		if (judge != 'C')
			break;
		init_board(board, ROW, COL);
	}
//玩家胜利打印
	if (judge == '*')
	{
		printf("你真聪明awa\n");
	}
//电脑胜利打印
	if (judge == '#')
	{
		printf("电脑都赢不了唉\n哎呀无情嘲笑\n");
	}
//平局打印
	if (judge == 'Q')
	{
		printf("跟电脑才打个平局哎呀\n");
	}
	init_board(board, ROW, COL);
}
//主函数
int main()
{
	srand((unsigned int)time(NULL));
	int n = 0;
	do
	{
		menu();
		scanf("%d", &n);
//选择
		switch (1)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("请输入1或者0\n");
			break;
		}
	} while (n);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值