三子棋 —— 利用C语言数组实现的简单游戏 玩转华为云

举报
Singularity 发表于 2023/05/26 20:10:35 2023/05/26
【摘要】 作为草稿纸上常出现的小游戏,三子棋的逻辑可谓是非常简单了,只需要玩家走一步、电脑走一步,并在八种可能获胜结果中比对就行了,下面让我们一起来看看三子棋的实现。

1. 前言

进入C语言初阶的学习已经有一段时间,已经能完成简单的分支循环语句,学习了函数和数组的运用,学习了递归等函数,已经能具备了实现一款小游戏的时候,相信经过反复咀嚼,能很快理解和完成这个游戏!
作为草稿纸上常出现的小游戏,三子棋的逻辑可谓是非常简单了,只需要玩家走一步、电脑走一步,并在八种可能获胜结果中比对就行了,下面让我们一起来看看三子棋的实现。

1.1 三子棋游戏规则

是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。

image.png

2. 正文

本程序员一共==三个文件==

  • “tast.c” —— 存储文件主函数,和game游戏主要逻辑
  • “game.c” —— 存储game函数里出现函数实现方法,对game里的方法进行封装方便直接调用
  • “tast.h” —— 存放头文件及其函数声明和宏,方便前两个函数引用

2.1 主文件部分 (tast.c)

主文件的负责程序的主要逻辑,包括了,main函数,game函数,menu函数等,主要负责给整个程序一个框架,建立了整个应用最初始的逻辑体系。

2.1.1 主函数部分(main)

主函数部分的逻辑为进入循环后先打印菜单,然后选择1则是进入游戏函数,选择0则跳出循环结束程序,选其他的提示输入错误。

image.png

以下是实现的函数部分

//menu为菜单答应函数
void menu()
{
	printf("************************\n");
	printf("*******  1.play  *******\n");
	printf("*******  2.exit  *******\n");
	printf("************************\n");
}

int main()
{  
	int input = 0;
	printf("欢迎进入三子棋游戏\n");
	
	do 
	{
		menu();//打印菜单 //1.play  2.exit
		
		printf("请选择 >");
		scanf("%d", &input); //输入选项,选择是否开始游戏

		switch (input)//下面就是选择分支语句了
		{
		case 1:
			printf("进入游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误请从新选择\n");
			break;
		}
	} while (input);
	return 0;
}

2.1.2 游戏函数部分(game)

游戏函数部分里主要是写出大框架,调用相对应的函数,完成了初始化,下棋,获胜判定等一系列逻辑判断。

image.png

2.2 头文件部分 (tast.h)

这个头文件是自己建立的,目的就是在主函数源文件(test.c)和功能实现函数(game.c)中搭起一座沟通的桥梁,方便这两个文件取用

image.png

2.3 功能函数部分

功能函数由五个函数组成,每个函数都有自己对应的功能,具体实现了初始化棋盘,打印棋盘,人下棋,电脑下棋,判断输赢的功能,使得主函数调用便可使用,不用每次都用相同的功能都得重新写。

2.3.1 初始化棋盘

image.png

此处有些类容与后面雷同,就不后面就不做解释了

2.3.2 打印棋盘函数

image.png

2.3.3 玩家落子函数

image.png

2.3.3 电脑落子函数

image.png

2.3.3 检查输赢的函数

image.png

3. 效果展示

image.png

如同三种情况无一缺席,我们的代码基本可以满足需求

3.1 代码展示

3.1.1主函数代码

#define _CRT_SECURE_NO_WARNINGS 1

#include "test.h"


void menu()
{
	printf("************************\n");
	printf("*******  1.play  *******\n");
	printf("*******  2.exit  *******\n");
	printf("************************\n");
}

void game()//游戏主体 通过调用函数实现
{
	char board[HANG][LIE] = {0};
	//初始化棋盘
	InitBoard(board, HANG, LIE);
	srand((unsigned int)time(NULL));

	//打印棋盘
	//DisplayBoard(board, HANG, LIE);

	char ret = 0;
	while(1){
		//玩家下棋
		//DisplayBoard(board, HANG, LIE);
		PlayerMove(board, HANG, LIE);
		ret = IsWin(board, HANG, LIE);
		if (ret != 'C')
			break;
		//电脑下棋
		ComputerMove(board, HANG, LIE);
		//DisplayBoard(board, HANG, LIE);
		ret = IsWin(board, HANG, LIE);
		if (ret != 'C')
			break;
	} 

	if (ret == '*')
	{
		printf("玩家获胜\n");
	}
	if (ret == '#')
	{
		printf("电脑获胜\n");
	}
	if(ret == 'Q') 
	{
		printf("平局\n");
	}
}

int main()
{  
	int input = 0;
	printf("欢迎进入三子棋游戏\n");

	do 
	{
		menu();
		printf("请选择 >");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			printf("进入游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误请从新选择\n");
			break;
		}
		
	} while (input);

	return 0;
}

3.1.2头文件代码

#pragma once

#include<stdio.h>

#include<stdlib.h>
#include<time.h>

#include <windows.h>
#define HANG 3
#define LIE  3

void InitBoard(char board[HANG][LIE], int hang, int lie);
void DisplayBoard(char board[HANG][LIE], int hang, int lie);
void PlayerMove(char board[HANG][LIE], int hang, int lie);
void ComputerMove(char board[HANG][LIE], int hang, int lie);


//玩家 *
//电脑 #
//平局 Q
//继续 c
char IsWin(char board[HANG][LIE], int hang, int lie);

3.1.2功能函数代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"


//初始化棋盘
void InitBoard(char board[HANG][LIE] ,int hang ,int lie )
{
	for (int h = 0; h <= hang - 1; h++) {
		for (int l = 0; l <= lie - 1; l++) {
			board[h][l] = ' ';
		}
	}
}

//打印棋盘
void DisplayBoard(char board[HANG][LIE], int hang, int lie)
{
	for (int h = 0; h <= hang - 1; h++) 
	{
		for (int l = 0; l <= lie - 1; l++) 
		{
			printf(" %c ",board[h][l]);
			if (l < lie-1)//筛选 最后一行列不打印  |
			printf("|");
		}
		printf("\n");
		if (h < hang - 1)
		{
			for (int i = 1; i <= lie; i++)
			{
				printf("---");
				if (i <= lie - 1)
				printf("|");
			}
			printf("\n");
		}
	}
}

void PlayerMove(char board[HANG][LIE], int hang, int lie)
{
	int x = 0;
	int y = 0;
	while (1)
	{

		DisplayBoard(board, HANG, LIE);
		printf("请落子");
		scanf("%d %d", &x, &y);
		
		if (x >= 1 && x <= hang && y >= 1 && y <= lie) {
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位子以落子,请从新落子\n");
			}
		}
		else
		{
			printf("坐标不合法,重新输入\n");
		}
	}
	system("cls");//刷新
}


void ComputerMove(char board[HANG][LIE], int hang, int lie)
{

	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	
	while (1)
	{

		int x = rand() % hang;
		int y = rand() % lie;
		if (board[x][y] == ' ') 
		{
			board[x][y] = '#';
			break;
		}
	}
	system("cls");//刷新
}

char IsWin(char board[HANG][LIE], int hang, int lie)
{
	for (int h = 0; h < hang; h++) {
		if (board[h][0] == board[h][1] && board[h][1] == board[h][2] && board[h][0] != ' ')
		{
			return board[h][0];
		}
		if (board[0][h] == board[1][h] && board[1][h] == board[2][h] && board[0][h] != ' ')
		{
			return board[h][0];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	for (int h = 0; h < hang; h++) {
		for (int l = 0; l < lie; l++) {
			if (board[h][l] == ' ')
			{
				return 'C';
			}
		}
	}

	return 'Q';
}

4. 一下GPT为我代码写的总结

这段代码实现了一个简单的三子棋游戏。以下是对代码的总结:

主函数(main):程序的入口,通过调用其他函数实现游戏的开始、进行和结束。在一个循环中,根据用户的选择调用不同的函数。

菜单函数(menu):打印游戏菜单,供用户选择开始游戏或退出游戏。

游戏函数(game):游戏的主体部分,通过调用其他函数来实现游戏的进行。首先初始化棋盘,然后进入一个循环,在每轮循环中玩家和电脑交替下棋,直到有玩家获胜或平局。

功能函数头文件(test.h):声明了游戏中使用的函数和常量。

初始化棋盘函数(InitBoard):将棋盘数组中的所有元素初始化为空格。

打印棋盘函数(DisplayBoard):以可视化的形式打印当前的棋盘状态。

玩家下棋函数(PlayerMove):提示玩家输入落子位置的坐标,判断输入的合法性,然后在棋盘上相应位置落下玩家的棋子。

电脑下棋函数(ComputerMove):通过随机生成坐标的方式,选择一个合法的位置,在棋盘上落下电脑的棋子。

判断胜负函数(IsWin):根据当前棋盘状态判断游戏是否结束,返回相应的结果。检查每行、每列和对角线上是否有连续的三个相同的棋子。

代码的逻辑清晰,通过不同的函数实现了游戏的各个功能模块,使得代码结构更加清晰易读。这段代码实现了一个简单的三子棋游戏,可以通过玩家和电脑之间交替下棋,判断胜负并输出结果。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。