三子棋(井字棋)

一、前言

三子棋大家应该都玩过,三个棋子连在一起就获胜。规则这里就不多介绍,下文就是用c语言来实现三子棋

二、思路分析

利用一个头文件包含所有库函数所要包含的文件和对函数的声明。在main函数里来操控游戏的进程,包含所有的自定义函数。由于棋盘是二维的,所以要创建一个二维数组“Chequer[ROW][COL]”来存储棋子;ROW是棋盘的行数,COL是棋盘的列数。Is_Win来判断输赢。

三、代码实现

1、main主函数

首先打印游戏界面

        printf("*******************************\n");
        printf("******    1、开始游戏   *******\n");
        printf("******    2、退出       *******\n");
        printf("*******************************\n");

如果选择1,则开始游戏循环。在游戏循环前初始化棋盘,然后打印棋盘。在循环体内用player函数代表玩家下棋,computer函数代表电脑下棋,在每次下棋后判断输赢

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
	srand(time(NULL));
	char Win='P';
	int re = 0;
	char Chequer[ROW][COL];
	while (1)
	{
		int a = 0;
		printf("*******************************\n");
		printf("******    1、开始游戏   *******\n");
		printf("******    2、退出       *******\n");
		printf("*******************************\n");
		scanf("%d", &a);
		if (a == 2)
			break;
		Init(Chequer, ROW, COL);//初始化棋盘
		print_board(Chequer, ROW, COL);
		while (1)
		{
			player(Chequer, ROW, COL);
			print_board(Chequer, ROW, COL);
			Win = Is_Win(Chequer, ROW, COL);
			re = Print_Win(Win);
			if (re == 1)
				break;
			computer(Chequer, ROW, COL);
			print_board(Chequer, ROW, COL);
			Win = Is_Win(Chequer, ROW, COL);
			re = Print_Win(Win);
			if (re == 1)
				break;
		}
	}
	return 0;
}
2、初始化棋盘

在函数体内用循环赋值,把每个数组初始化为空格

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init(char Chequer[ROW][COL], int row, int col)
{
	for (int n = 0; n < row; n++)
	{
		for(int m=0; m < col; m++)
		{
			Chequer[n][m] = ' ';
		}
	}
}
3、打印棋盘

横着打印,每一个位置循环打印

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void print_board(char Chequer[ROW][COL], int row, int col)
{
	for (int n = 0; n < row; n++)//打印列,控制行
	{
		for (int m = 0; m < col; m++)//打印行,控制列
		{
			printf(" %c ", Chequer[n][m]);
			if (m < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (n < row - 1)
			printf("---|---|---\n");
	}
}

打印效果是这样的:

4、玩家下棋

用r来代表行,c来代表列

    int r = 0;//行
    int c = 0;//列

输入一个行列代表下棋的位置,并判断下棋的位置是否合法

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void player(char Chequer[ROW][COL], int row, int col)
{
	int r = 0;//行
	int c = 0;//列
	printf("玩家下棋:>\n");
	while (1)
	{
		scanf("%d %d", &r, &c);
		if (Chequer[r-1][c-1] == ' ' && r-1<row && c-1<col)
		{
			Chequer[r-1][c-1] = '*';
			break;
		}
		else
			printf("请重新下棋\n");
	}
}
5、电脑下棋

用rand生成随机的位置,如果位置非法则重新生成

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void computer(char Chequer[ROW][COL], int row, int col)
{
	int r = 0;//行
	int c = 0;//列
	printf("电脑下棋:>\n");
	Sleep(3000);
	while (1)
	{
		r = rand() % row;
		c = rand() % col;
		if (Chequer[r][c] == ' ' && r < row && c < col)
		{
			Chequer[r][c] = '#';
			break;
		}
	}
}
6、判断输赢

连续三个同样的棋就算赢

横三和竖三:

    for (int n=0; n < row; n++)//某一放赢
    {
        if (Chequer[n][0] == Chequer[n][1] && Chequer[n][1] == Chequer[n][2] && Chequer[n][0] == Chequer[n][2] && Chequer[n][2]!=' ')
            return Chequer[n][0];
    }
    for (int m = 0; m < col; m++)//某一放赢
    {
        if (Chequer[0][m] == Chequer[1][m] && Chequer[1][m] == Chequer[2][m] && Chequer[0][m]== Chequer[2][m] && Chequer[2][m] != ' ')
            return Chequer[0][m];
    }

斜着三个:

    if (Chequer[0][0] == Chequer[1][1] && Chequer[1][1] == Chequer[2][2] && Chequer[0][0] == Chequer[2][2] && Chequer[2][2] != ' ')//某一放赢
        return Chequer[1][1];
    if (Chequer[0][2] == Chequer[1][1] && Chequer[1][1] == Chequer[2][0] && Chequer[0][2] == Chequer[2][0] && Chequer[2][0] != ' ')//某一放赢
        return Chequer[1][1];
 

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
char Is_Win(char Chequer[ROW][COL], int row, int col)
{
	for (int n=0; n < row; n++)//某一放赢
	{
		if (Chequer[n][0] == Chequer[n][1] && Chequer[n][1] == Chequer[n][2] && Chequer[n][0] == Chequer[n][2] && Chequer[n][2]!=' ')
			return Chequer[n][0];
	}
	for (int m = 0; m < col; m++)//某一放赢
	{
		if (Chequer[0][m] == Chequer[1][m] && Chequer[1][m] == Chequer[2][m] && Chequer[0][m]== Chequer[2][m] && Chequer[2][m] != ' ')
			return Chequer[0][m];
	}
	if (Chequer[0][0] == Chequer[1][1] && Chequer[1][1] == Chequer[2][2] && Chequer[0][0] == Chequer[2][2] && Chequer[2][2] != ' ')//某一放赢
		return Chequer[1][1];
	if (Chequer[0][2] == Chequer[1][1] && Chequer[1][1] == Chequer[2][0] && Chequer[0][2] == Chequer[2][0] && Chequer[2][0] != ' ')//某一放赢
		return Chequer[1][1];
	for (int n = 0; n < row; n++)
	{
		for (int m = 0; m < col; m++)
		{
			if (Chequer[n][m] == ' ')
				return 'Q';//还未分出胜负
		}
	}
	return 'W';//平局
}
7、打印输赢
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int Print_Win(char Win)
{
	switch (Win)
	{
	case '*':
		printf("你赢了\n");
		return 1;
		break;
	case '#':
		printf("你输了\n");
		return 1;
		break;
	case 'W':
		printf("平局\n");
		return 1;
		break;
	case 'Q':
		return 0;
		break;
	default:
		printf("错误");
	}
}

四、全部代码

1、game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
	srand(time(NULL));
	char Win='P';
	int re = 0;
	char Chequer[ROW][COL];
	while (1)
	{
		int a = 0;
		printf("*******************************\n");
		printf("******    1、开始游戏   *******\n");
		printf("******    2、退出       *******\n");
		printf("*******************************\n");
		scanf("%d", &a);
		if (a == 2)
			break;
		Init(Chequer, ROW, COL);//初始化棋盘
		print_board(Chequer, ROW, COL);
		while (1)
		{
			player(Chequer, ROW, COL);
			print_board(Chequer, ROW, COL);
			Win = Is_Win(Chequer, ROW, COL);
			re = Print_Win(Win);
			if (re == 1)
				break;
			computer(Chequer, ROW, COL);
			print_board(Chequer, ROW, COL);
			Win = Is_Win(Chequer, ROW, COL);
			re = Print_Win(Win);
			if (re == 1)
				break;
		}
	}
	return 0;
}
2、game.h
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<windows.h>
void Init(char Chequer[ROW][COL], int row, int col);
void print_board(char Chequer[ROW][COL], int row, int col);
void player(char Chequer[ROW][COL], int row, int col);
void computer(char Chequer[ROW][COL], int row, int col);
char Is_Win(char Chequer[ROW][COL], int row, int col);
int Print_Win(char Win);

3、Init.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Init(char Chequer[ROW][COL], int row, int col)
{
	for (int n = 0; n < row; n++)
	{
		for(int m=0; m < col; m++)
		{
			Chequer[n][m] = ' ';
		}
	}
}

4、print_board.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void print_board(char Chequer[ROW][COL], int row, int col)
{
	for (int n = 0; n < row; n++)//打印列,控制行
	{
		for (int m = 0; m < col; m++)//打印行,控制列
		{
			printf(" %c ", Chequer[n][m]);
			if (m < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (n < row - 1)
			printf("---|---|---\n");
	}
}

5、player.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void player(char Chequer[ROW][COL], int row, int col)
{
	int r = 0;//行
	int c = 0;//列
	printf("玩家下棋:>\n");
	while (1)
	{
		scanf("%d %d", &r, &c);
		if (Chequer[r-1][c-1] == ' ' && r-1<row && c-1<col)
		{
			Chequer[r-1][c-1] = '*';
			break;
		}
		else
			printf("请重新下棋\n");
	}
}

6、computer.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void computer(char Chequer[ROW][COL], int row, int col)
{
	int r = 0;//行
	int c = 0;//列
	printf("电脑下棋:>\n");
	Sleep(3000);
	while (1)
	{
		r = rand() % row;
		c = rand() % col;
		if (Chequer[r][c] == ' ' && r < row && c < col)
		{
			Chequer[r][c] = '#';
			break;
		}
	}
}

7、Is_Win.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
char Is_Win(char Chequer[ROW][COL], int row, int col)
{
	for (int n=0; n < row; n++)//某一放赢
	{
		if (Chequer[n][0] == Chequer[n][1] && Chequer[n][1] == Chequer[n][2] && Chequer[n][0] == Chequer[n][2] && Chequer[n][2]!=' ')
			return Chequer[n][0];
	}
	for (int m = 0; m < col; m++)//某一放赢
	{
		if (Chequer[0][m] == Chequer[1][m] && Chequer[1][m] == Chequer[2][m] && Chequer[0][m]== Chequer[2][m] && Chequer[2][m] != ' ')
			return Chequer[0][m];
	}
	if (Chequer[0][0] == Chequer[1][1] && Chequer[1][1] == Chequer[2][2] && Chequer[0][0] == Chequer[2][2] && Chequer[2][2] != ' ')//某一放赢
		return Chequer[1][1];
	if (Chequer[0][2] == Chequer[1][1] && Chequer[1][1] == Chequer[2][0] && Chequer[0][2] == Chequer[2][0] && Chequer[2][0] != ' ')//某一放赢
		return Chequer[1][1];
	for (int n = 0; n < row; n++)
	{
		for (int m = 0; m < col; m++)
		{
			if (Chequer[n][m] == ' ')
				return 'Q';//还未分出胜负
		}
	}
	return 'W';//平局
}

8、Print_Win.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int Print_Win(char Win)
{
	switch (Win)
	{
	case '*':
		printf("你赢了\n");
		return 1;
		break;
	case '#':
		printf("你输了\n");
		return 1;
		break;
	case 'W':
		printf("平局\n");
		return 1;
		break;
	case 'Q':
		return 0;
		break;
	default:
		printf("错误");
	}
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值