C基础三子棋

1.为实现三子棋功能,首先我们要理清需要分几步

简单的游戏界面实现;棋盘的打印;玩家下棋;电脑下棋;判断输赢;可重复游戏;

需要创建这五个函数,最后来组合实现三子棋功能;

2.关于不愿暴露自己编写代码的具体内容

如果你不想实现这五个函数的具体过程被别人看到,可以单独放在一个源文件中,并创建一个头文件,右击项目名称,属性,常规,配置类型,改为静态库形式,然后生成即可,把头文件和静态文件给别人使用。

第一步整体框架构造

void test()
{
	srand((unsigned int)time(NULL));//执行一次就够了,下面会介绍用处
	int input = 0;
	do
	{
		screen();//游戏界面函数
		scanf("%d", &input);//选择是否开始或结束游戏
		switch (input)
		{
		case 1:game(); break;
		case 0:printf("退出游戏\n"); break;//输入0才可以使while条件为假不执行终止
		default:printf("请重新输入\n"); break;
		}

	} while (input);
}

 游戏界面显示实现

void screen()
{
	printf("........................\n");
	printf("...... 1.  Play   ......\n");
	printf("...... 0.退出游戏 ......\n");
	printf("........................\n");

}

time时间戳函数,time(NULL)用来获取系统现在时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数(使用需引用头文件time.h),srand实现随机数需要先给他一个随机值,此处srand函数(需要引用头文件stdlib.h),(unsigned int)是将time转换为无符号整形。

真正产生随机数是不可能的,只能产生伪随机数。

srand函数的使用是为了rand()使用做准备。rand()用来实现电脑下棋。

 

 

二 .game过程分步实现

void game()
{

	//初始化棋盘为全空格' ',才可以看不见
	char ches[row][rank] = { 0 };//放# *来下棋
	empt(ches, row, rank);//初始化棋盘
	int m;
	chessboard(ches, row, rank);
	while (1)
	{
		replay(ches, row, rank);
		chessboard(ches, row, rank);
		m = win(ches, row, rank);
		if (m != 'n')//谁都没赢,也没下满返回n
		{
			break;
		}
		cumpter(ches, row, rank);
		chessboard(ches, row, rank);
		m = win(ches, row, rank);
		if (m != 'n')
		{
			break;
		}
	}
	if (m == '*')
	{
		printf("电脑获胜\n");
	}
	else if (m == '#')
	{
		printf("你赢了\n");
	}
	else
	{
		printf("平局\n");
	}
	//chessboard(chess, row, rank);
}

第er部:棋盘的打印

首先我们要想需要什么样子的棋盘,最先能想到的应该是这种

 棋盘内容初始化

void empt(char chesn[row][rank],int ROW,int RANK)//把二维数组传过来,定义两个整形接收row,rank
{
	int i;
	int j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j <RANK; j++)
		{
			chesn[i][j] = ' ';//kong
		}
	}
}

 那么我们可以用|和---来实现棋盘打印

void chessboard(char chess[row][rank], int ROW, int RANK)//不直接用roe,rank为了以后方便改动,不用每次变动需要全局变量
{
	//棋盘,我们需要行列变量来控制打印,因此创建两个变量
	int i;
	int j;
    //按照行列打印
	for (i = 0; i<ROW; i++)//控制行打印
	{
		for (j = 0; j <RANK; j++)//控制列打印
		{
            printf(" %c ", chess[i][j]);//参数输入
			if (j <RANK - 1)//最后一列不需要|
			{
				printf("|");
			}
		}
			printf("\n");//注意,先把第一行打印结束才换行
			if (i <ROW - 1)//最后一行不需打印---
			{
				for (j = 0; j <RANK; j++)
				{
					printf("---");
					if (j <RANK - 1)//让棋盘好看一点
					{
						printf("|");
					}
				}
				printf("\n");
			}
			
		
	}
}

人下棋

void replay(char chess[row][rank], int ROW, int RANK)
{
	printf("请输入行列进行下棋:");
	int i=1;
	int j=1;
		scanf("%d %d", &i, &j);
		
		if (i>0&&i <= ROW&&j>0 && j <= RANK)
		{
			if (chess[i - 1][j - 1] == ' ')//用户输入没有从0下标开始的概念
			{
				chess[i - 1][j - 1] = '#';//之后没进行初始化直接打印出来
			}
			else 
            { 
                printf("该位置已被占用!\n"); 
            }
		}
		else
		{
			printf("超出棋盘范围请重新输入\n");
		}
}

电脑下棋

rand产生一个0-0x7fff的随机数,最大为32767。

void cumpter(char chess[row][rank], int ROW, int RANK)
{
	printf("电脑下棋\n");
	int i;
	int j;
	while (1)
	{
		i = rand() % ROW;//0~2
		j = rand() % RANK;
		if (chess[i][j] == ' ')
		{
			chess[i][j] = '*';
			break;
		}
	}

}

判断输赢

int win(char chess[row][rank], int ROW, int RANK)
{
	int i;
	int j;
	//行
	for (i = 0; i < ROW; i++)
	{
		if (chess[i][0]==chess[i][1]&& chess[i][1]==chess[i][2] && chess[i][1] != ' ')
		{
			return chess[i][0];
		}
	}
	//列
	for (j = 0; j < RANK; j++)
	{
		if (chess[0][j]==chess[1][j] && chess[1][j]==chess[2][j] && chess[1][j] != ' ')
		{
			return chess[0][j];
		}
	}
	//对角线
		if (chess[0][0] ==chess[1][1]&& chess[1][1]==chess[2][2]&& chess[2][2] != ' ')
		{
			return chess[1][1];
		}
		if (chess[0][2] == chess[1][1] && chess[1][1] == chess[2][0] && chess[1][1] != ' ')
		{
			return chess[1][1];
		}
		//平局
		if (full(chess, row, rank) == 1)
		{
			return 'c';
		}
		return 'n';

}

平局判断

只用于本文件的函数可用static关键字,这种代码习惯比较好。

static int full(char chess[row][rank], int ROW, int RANK)//判断满不满
{
	int i;
	int j;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < RANK; j++)
		{
			if (chess[i][j] == ' ')
				return 0;
		}
	}
	return 1;//manle
}

头文件

#include<stdio.h>
#define row 3//3行
#define rank 3//3列
#include<time.h>
#include<stdlib.h>

//初始化函数
void empt(char chesn[row][rank], int ROW, int RANK);

//如果不单独定义,别人想单独用这个功能会实现不了,因为没有char chess
//打出棋盘
void chessboard(char chess[row][rank], int ROW, int RANK);

//操作棋盘人下
void replay(char chess[row][rank], int ROW, int RANK);

//电脑下随机下
void cumpter(char chess[row][rank], int ROW, int RANK);

//判断输赢
int win(char chess[row][rank], int ROW, int RANK);

引用创建的头文件#include "自己的头文件名字.h"。

运行文件three.c

#include "therr.h"
int main()

{
	test();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值