三子棋c语言代码实现

重拾小时候的美好回忆,用C语言代码完成简单三子棋游戏

一.游戏规则

在一个棋盘上,两方选手对弈,先将三个棋连成一条线的一方获胜(包括斜线)。

二.设计思路

1. 代码布局:分别创立两个源文件和一个头文件 text.c (用于代码测试) game.c(封装该游戏相关函数) game.h(对相关函数的申明),之所以这样是为了增加代码的可读性和逻辑性。

2.封装一个菜单menu()函数,让用户自己选择开始游戏还是退出游戏。

3.封装一个棋盘board()函数,并且能让自定义大小(可通过宏定义简易实现)。

4.封装2个函数分别能让玩家和电脑下棋。(有空位的地方才能下棋,否则出现提示)。

5.封装函数判断谁获胜

6.在text.c中循环和switch语句将game.c中的文件联系起来测试游戏

7.当玩家还想玩时,但棋盘上已经有数据啦,这时候需要一个初始化函数init

三.game.c中各功能代码实现

void player(char arr[row][col], int ROW, int COL)//玩家下棋
{
	int i, j;
	while (1)
	{
		printf("玩家下:请输入下棋指标:\n");
		scanf("%d,%d",&i,&j);
		if (0 < i && i< ROW + 1 && 0 < j && j<COL + 1)//用正常人的思维下棋,而不是用程序员的,不是从0开始
		{
			if (arr[i - 1][j - 1] == ' ') { arr[i-1][j-1] = '*'; break; }
			else printf("位置已经被占用请重新输入");

		}
		else printf("输入值不在指定范围类,请重新输入");
	}board(arr, row, col);//玩家下完棋后再次打印棋盘,能更好的看到下棋·位置
}
void  menu()//菜单
{
	printf("**********************************\n");
	printf("******1.开始游戏  0.退出游戏******\n");
	printf("**********************************\n");
	printf("请输入你的选择\n");
}
void board(char arr[row][col], int ROW, int COL)//棋盘,row,col为宏定义的值,
{
	int a = 0;
	for (a; a < ROW; a++)
	{
		int i = 0;
		for (i; i < COL;i++)//通过循环实现棋盘的打印
		{
			printf(" %c ", arr[a][i]);
			if (i < COL - 1)
				printf("|");
		}
		printf("\n");
		int b = 0;
		if (a < ROW - 1)
		{
			for (b; b < COL;b++)
			{
				printf("---");
				if(b < COL-1)
				printf("|");
			}
		}printf("\n");
	}
}
void windos(char arr[row][col], int ROW, int COL)//电脑下棋
{
	int i,j;
	srand((unsigned int)time(NULL));//运用时间戳随机下棋
	printf("电脑下\n");
	while (1)
	{
		i = rand() % 3;//限定随机数范围
		j = rand() % 3;
		if (arr[i][j] == ' ') { arr[i][j] = '#'; break; }
	}board(arr, row, col);//下完后打印棋盘

}
char judge(char arr[row][col], int ROW, int COL)//通过返回值判断游戏是否结束(三子连一线或无处可下棋)
{
	int i,j;
	for (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];
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != ' ')return arr[0][i];
		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];
	}//游戏结束
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (arr[i][j] == ' ')return 'c';//说明还没结束,还有位置

		}
	}return 'd';//平局
}
int vocity(char ret)//对判断函数的返回值判断游戏结果
{
	if (ret == '*') { printf("玩家赢\n"); return 0; }
	if (ret == '#') { printf("电脑赢\n"); return 0; }
	if (ret == 'c') { return 1; }
	if (ret == 'd') { printf("平局\n"); return 1; }
}
void init(char arr[row][col], int ROW, int COL)//初始化函数
{
	int q,b;
	for (q=0; q <ROW; q++)
	{
		for (b=0; b < COL; b++)
		{
			arr[q][b]=' ';
		}//遍历数组
	}
}

四.text.c中基本结构代码实现

#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"
int main()
{
	char arr[row][col] = {0};
	char ret;
	int a,b=1;//定义变量
	while (1)//利用循环实现重复选择菜单
	{
		mean();//调用菜单函数
		scanf("%d",&a);//输入选择
		if (a == 1)
		{
			printf("开始游戏\n");
			init(arr, row, col);//棋盘初始化
			board(arr, row, col);//打印棋盘
			while (b)
			{
				player(arr, row, col);//玩家下
				ret =judge(arr, row, col);//判断
				b=vocity(ret);//判断赢家,并通过返回值确定游戏是否结束
				windos(arr, row, col);
				ret = judge(arr, row, col);
                b=vocity(ret);
				
			}
		}
		else if (a == 0)
		{
			printf("退出游戏");
			break;
		}
		else { printf("请输入正确的选择\n"); }
	}
	return 0;
}

五.game.h中函数申明 

#pragma once
#define col 3//定义棋盘列大小
#define row 3//定义棋盘行大小
#include <stdio.h> 
#include <time.h>
#include <stdlib.h>
void mean();
void init(char arr[row][col], int ROW, int COL );
void board(char arr[row][col], int ROW, int COL);
void player(char arr[row][col], int ROW, int COL);
void windos(char arr[row][col], int ROW,int COL);
char judge(char arr[row][col], int ROW, int COL);
int vocity(char ret);

六.结果展示

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abstract man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值