C语言----三子棋小游戏

C语言----三子棋小游戏,第1张

文章目录
  • 前言
  • 一、分文件编写
  • 二、菜单和游戏开始与结束
  • 三、game()函数
  • 四、完整代码

前言

三子棋相信大家都玩过,九宫格,三个子连起来就算赢。
用C语言写小游戏其实不难,我们要注重思想及清晰的流程。
完整代码在最后!

一、分文件编写

分文件编写的含义是将一个程序的代码分多个文件存储,一般分为三个,就C来说,.h的头文件(函数声明),.c的源文件(函数实现),.c的主函数文件(程序运行的入口,需要包含头文件#include " ****.h ")。
就现阶段而言能使我们的思绪更清晰,更好的按照逻辑去写代码。

二、菜单和游戏开始与结束

1、我们知道进入游戏后会有一个菜单让你选择开始游戏和结束游戏,并且菜单至少会出现一次,那么就可以在主程序文件main函数中用一个do…while循环,因为它一定会执行一次。
2、在Realize.c中写一个打印菜单的函数。
3、为了让玩家选择开始或退出,创建一个变量input,存储玩家的选择,通过switch语句对玩家的选择进行分支执行,把input作为switch的表达式值,若是 1 ,玩家就开始游戏(调用game()函数);若是 0 ,玩家退出游戏;当玩家输错数字,会执行default后的语句提示‘’输入有误,重新选择‘’,并且用input作为while的判断语句,当为 除 0 的其他数字时会继续循环。
(每个case和default语句后都要break退出)

void menu()
{
	printf("**********************************\n");
	printf("********  1、开始游戏   **********\n");
	printf("********  0、退出游戏   **********\n");
	printf("**********************************\n");
}

int main()
{
	//创建一个变量,存储玩家的选择
	int input = 0;
	do
	{
		menu();//菜单打印
		printf("请选择: > ");
		scanf("%d", &input);//玩家选择
		switch (input)
		{
		//分支选择
		case 1:
			game();//开始游戏
			break;
		case 0://退出游戏
			break;
		default:
			printf("输入有误,重新选择\n");//错误提示

		}

	} while (input);//判断是否继续循环
	return 0;
}
三、game()函数

游戏过程在game函数中实现。

1、首先创建一个三乘三的数组用来存放符号

char arr[3][3] = { 0 };

2、对数组进行初始化

因为创建数组后给数组中的值放的是零,但我们要的是数组是空的,因此我们要对数组初始化,将它的每个值赋为空格。利用两个for循环遍历数组即可。

3、for嵌套将数组初始化后打印棋盘

4、下棋

下棋分为玩家下棋和电脑下棋

a、玩家下棋:
用一个while死循环来让玩家下棋,用从玩家输入的坐标来给数组所对应的位置赋值,用if语句判断玩家是否格式正确,是否输入正确的坐标,如果没符合要求,while循环会继续让玩家输入,直到正确后就break退出循环,从而达到玩家下棋的效果。

b、电脑下棋:
想要电脑随机下棋,我们需要rand函数,它能产生随机值,但是我们只需要0~2的值,那么只要把它对 3 取余即可,rand函数产生的数字是根据某个公式推出的伪随机数,每次进入游戏都是一样的,如果想要每次产生的不一样,那么在使用rand函数前,就需用到srand函数给定一个时间种子,时间每时每刻在变化,这个种子也随着变化,这样就能获得随机数。并且要使用这个函数要包含头文件#include 和#include


#include 
#include 

srand((unsigned int)time(NULL));

x = rand() % 3;
y = rand() % 3;

5、判断输赢,平局,或继续

在game函数while循环中,当玩家(电脑)下完棋,就调用函数 IsWin,若函数返回‘ c ’则继续游戏,返回 ‘ * ’就输出玩家赢并回到菜单**,返回 ‘ # ’就输出电脑赢**并回菜单,否则就输出平局,回到菜单。

a、判断输赢:
横排三个相等,并且不为空,那么就直接输出那一横排的随便一个;
纵列三个相等,并且不为空,那么就直接输出那一横排的随便一个;
正对角线上的三个相等,并且不为空,那么就直接输出那之中的随便一个;
反对角线上的三个相等,并且不为空,那么就直接输出那之中的随便一个;

b、判断平局

利用两个for循环遍历数组 找是否还有空格,没有则返回‘ q ‘。

c、若前者都没返回那么返回’ c ‘,为平局

四、完整代码

1、 头文件

#define _CRT_SECURE_NO_WARNINGS

#include 
#include 
#include 

void menu();

void init(char arr[3][3], int high, int wide);

void print(char arr[3][3], int high, int wide);

void PlayerMove(char arr[3][3], int high, int wide);

void ComputerMove(char arr[3][3], int high, int wide);

char IsWin(char arr[3][3], int high, int wide);

2、源文件(函数实现)

#define _CRT_SECURE_NO_WARNINGS

#include "t.h"



void menu()
{
	printf("**********************************\n");
	printf("********  1、开始游戏   **********\n");
	printf("********  0、退出游戏   **********\n");
	printf("**********************************\n");
}

void init(char arr[3][3], int high, int wide)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < high; i++)
	{
		for (j = 0; j < wide; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void print(char arr[3][3], int high, int wide)
{
	int i = 0;
	int j = 0;
	printf(" %c | %c | %c \n", arr[0][0], arr[0][1], arr[0][2]);
	printf("---|---|---\n");
	printf(" %c | %c | %c \n", arr[1][0], arr[1][1], arr[1][2]);
	printf("---|---|---\n");
	printf(" %c | %c | %c \n", arr[2][0], arr[2][1], arr[2][2]);

}


void PlayerMove(char arr[3][3], int high, int wide)
{
	printf("玩家下棋! \n");
	int x = 0;
	int y = 0;

	while (1)
	{

		printf("输入坐标:> ");

		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= high && y >= 1 && y <= wide)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入!\n");
			}

		}
		else
		{
			printf("输入格式错误,请重新输入!\n");
		}
	}

}

void ComputerMove(char arr[3][3], int high, int wide)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋! \n");
	while (1)
	{
		x = rand() % 3;
		y = rand() % 3;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}


int IsFull(char arr[3][3], int high, int wide)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < high; i++)
	{
		for (j = 0; j < wide; j++)
		{
			if (arr[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}


char IsWin(char arr[3][3], int high, int wide)
{

	int i = 0;
	for (i = 0; i < 3; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != ' ')
		{
			return arr[i][1];
		}
	}


	int j = 0;
	for (j = 0; j < 3; j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
		{
			return arr[1][j];
		}
	}

	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}

	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}

	if (IsFull(arr, high, wide))
	{
		return 'q';
	}

	return 'c';
}

3、主源文件(main)

#define _CRT_SECURE_NO_WARNINGS

#include "t.h"

void game()
{

	char arr[3][3] = { 0 };
	//初始化棋盘
	init(arr, 3, 3);
	//打印棋盘
	print(arr, 3, 3);
	char ret = 0;
	while (1)
	{
		//玩家下棋
		PlayerMove(arr, 3, 3);
		//打印棋盘
		print(arr, 3, 3);
		//判断输赢
		ret = IsWin(arr, 3, 3);
		if (ret != 'c')
		{
			break;
		}


		//电脑下棋
		ComputerMove(arr, 3, 3);

		//打印棋盘
		print(arr, 3, 3);

		//判断输赢
		ret = IsWin(arr, 3, 3);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢!\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢!\n");
	}
	else printf("平局\n");

}


int main()
{
	int input = 0;
	do
	{
		srand((unsigned int)time(NULL));
		menu();
		printf("请选择: > ");

		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("输入有误,重新选择\n");

		}

	} while (input);
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/867049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-12
下一篇 2022-05-12

发表评论

登录后才能评论

评论列表(0条)

保存