C语言学习-三子棋的实现(第一次写博客)

C语言学习-三子棋的实现(第一次写博客)

##写代码的理念和分块化思路很重要##
1.在VS编译器中,可以实现头文件和源文件分开编辑(好处:防源代码泄露)如果想要在源文件中引用自己格式为:#include"源文件名.h"
2.例如三子棋,可以将要实现的每个模块写成一个函数。
3.三子棋的实现是涉及函数,数组,随机数等知识的简单应用,以下是代码供参考
头文件 代码

#pragma once//表示在编译的时候这个文件只被包含一次,减少整个编译过程中打开文件的次数
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3//这种写法的好处是后面如果有需要改大小,不需要逐个修改,只需要在此位置更改数据
void game();
void Init_coordinate(char arr[ROW][COL],int row,int col);//
void Display_coordinate(char arr[ROW][COL],int row,int col);
void change_humanbeings(char[ROW][COL], int row, int col);
void change_robot(char[ROW][COL],int row, int col);
char victory(char arr[ROW][COL], int row, int col);
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

游戏函数

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//引用我们自己写的头文件
//要实现的功能,实现电脑和人每下一次棋,打印一次棋盘
//1.游戏控制函数
void game()
{
	char coordinate[ROW][COL] = { 0 };
	Init_coordinate(coordinate,ROW,COL);
	Display_coordinate(coordinate, ROW, COL);
	char ret;
	//开始运行
	while (1)
	{
		change_humanbeings(coordinate, ROW, COL);
		Display_coordinate(coordinate, ROW, COL);
	    ret=victory(coordinate, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
		printf("机器人下棋:\n");
		change_robot(coordinate,ROW,COL);
		Display_coordinate(coordinate, ROW, COL);
		ret=victory(coordinate, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == '#')
	{
		printf("玩家赢\n");
	}
	if (ret == '*')
	{
		printf("电脑赢\n");
	}
	if (ret == 'q')
	{
		printf("平局\n");
	}
	Display_coordinate(coordinate, ROW, COL);
}
//2.棋盘坐标的初始化
void Init_coordinate(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}

}
//3.打印棋盘坐标函数
void Display_coordinate(char arr[ROW][COL],int row,int col)
{
	int i = 0;
	//打印数据
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ",arr[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//打印分割信息
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j<col-1)
					printf("|");

			}
			printf("\n");
		}
	
	}
}
//4.人工下棋写入
void change_humanbeings(char arr[ROW][COL],int row,int col)
{
	int row_1 = 0;
	int col_1 = 0;
	printf("玩家下棋:\n");
	printf("请输入对应的坐标:->");
	while (1)
	{
		scanf("%d %d", &row_1, &col_1);
		if (row_1 >= 1 && row_1 <= ROW && col_1 >= 1 && col_1 <= COL)
		{
			if (arr[row_1 - 1][col_1 - 1] == ' ')
			{
				arr[row_1 - 1][col_1 - 1] = '#';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入:->");
			}
		}
		else
		{
			printf("坐标非法,请重新输入:->");
		}
	}
}
//5.机器下棋写入
void change_robot(char arr[ROW][COL],int row, int col)
{
	printf("电脑下棋:->\n");
	while (1)
	{
		int input_1 = rand() % ROW;
		int input_2 = rand() % COL;
		if (arr[input_1][input_2]==' ')
		{
			arr[input_1][input_2] = '*';//有一个问题,随机如果一直随一个数据怎么办,效率太低
			break;
		}
	}
}
//判断是否胜利函数
//要求:判断谁赢了,如果没有赢继续
char victory(char arr[ROW][COL],int row, int col)
{
	int i = 0;//先判断行
	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][1];
			}
	}
	int m = 0;//判断列
	for (m = 0; m < col; m++)
	{
			if (arr[0][m] == arr[1][m] && arr[1][m] == arr[2][m]&&arr[0][m]!=' ')
			{
				return arr[1][m];
			}
	}
	//判断对角线
	if (arr[0][0] == arr[1][1] && arr[1][1]== arr[2][2] && arr[0][0]!=' ')
	{
		return arr[1][1];
	}
	if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != ' ')
	{
		return arr[1][1];
	}
	//判断是否平局
	int j = 0;
	int z = 0;
	for (j = 0; j < row; j++)
	{
		for (z = 0; z < col; z++)
		{
			if (arr[j][z] == ' ')
			{
				return 'c';
			}
		}
	}
	return 'q';
}

主函数

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
	printf("**********************************\n");
	printf("*************1.play***************\n");
	printf("*************0.exit***************\n");
	printf("**********************************\n");
	printf("请输入:->");
}
int main()
{

	
	//while+if的写法
	/*while (1)
	{
		int input;
	scanf("%d",&input);
		if (input == 0)
		{
			printf("选择错误");
			game();
		}
		else if (input == 1)
		{
			printf("三子棋\n");
			break;
		}
		else
		{
			printf("选择错误,请重新输入");
			continue;
		}
	}*/
	//do_while + switch的写法
	int input=0;
	srand((unsigned int)time(NULL));//设置随机数
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋\n");
			game();
			break;
		case 0:
			printf("已退出\n");
			break;
		default:
			printf("选择错误");
			break;
		}
		

	} while (input);//while语句,条件判断:非0为真

	return 0;
}

涉及随机数知识:
关于c语言设置随机数
1使用函数rand()—头文件为<stdlib.h>—伪随机数意味着生成的数字是随机数,但是是固定的数字,不会发生变化
1.

2.还需要使用srand()函数设置随机数的起点----但是使用这两个函数会导致只有一个随机数产生如下图所示,srand()函数,返回值为unsigned int

3.如果想要让srand()函数产生改变的量,需要用到时间戳函数time()函数—这个函数的返回值是一个time_t类型的指针,所以需要强制转换类型为(unsigned int)time_t(NULL)4.想要输出结果为0-100之间的随机数,我们可以让rand()%100达到这个效果
没有描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值