C语言·棋盘程序二维3行3列(具体步骤和代码)

目录

前言

一、文件分配

二、菜单界面

三、棋盘初始化

四、打印棋盘

样子

五、玩家落子

下棋

六、电脑下棋

七、判断胜负

八、核心代码

总代码

game.h

game.c

text.c

游戏的结果

玩家赢​

 电脑赢

 平局


前言

       利用函数,分支和循环语句,数组,多文件实现。

       棋盘:使用3行3列的二维数组以("   ")来表示;
       玩家:利用填写行列实现以(" * ")下棋;
       电脑:利用时间挫产生随机值实现以(" # ")下棋;


一、文件分配

       game.c   用于游戏的实现

       text.c   用于游戏的检测

       game.h   用于游戏的函数引用,库函数的引用(将库函数的引用都放于头文件之中,这样可以使得代码不至于过于臃肿)

(介于game.h是作为引用,主要实现游戏以及检测游戏。text.c是用于游戏的检测;所以,必要时才展示)

二、菜单界面

使用do while循环的原因:

  •     提高简洁性,我们所需要的,只是当不玩时即退出,输入错误即重新输入,而利用非0即对,0即错的性质,可简洁实现。
//游戏目录
void text()
{
	int input = 0;
	do
	{
		mune();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}

//执行入口
int main()
{
	text();
	return 0;
}
//游戏首页
void mune()
{
	printf("************************************\n");
	printf("**********     1 play     **********\n");
	printf("************************************\n");
	printf("**********     0 exit     **********\n");
	printf("************************************\n");
}

三、棋盘初始化

//初始化棋盘
char board[ROW][COL] = { 0 };
int i = 0, j = 0;
for (i = 0; i < ROW; i++)
{
	for (j = 0; j < COL; j++)
	{
		board[i][j] = ' ';
	}
}

四、打印棋盘

使用define定义常量的原因:

  •     提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便,只需修改此一处。
#define ROW 3 //行
#define COL 3 //列

最直接的方法,可以实现,但是不够好。

//打印棋盘
void dis_printf(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印数据
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		//打印分割的行
		if(i<row-1)
			printf("---|---|---\n");
	}
}

使用逐一打印的原因:

  •     提高扩展性,当更改define定义常量后,正确的打印出棋盘。
  •     提高实用性,使其不仅仅只能适用于三子棋,代码就要越完美越好,可实现多条件下的执行,不是仅仅满足当前。
//打印棋盘
void dis_printf(char board[ROW][COL],int row,int col)
{
	int j = 0;
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

样子

五、玩家落子

注意:玩家不是程序员,我们不能要求别人会C语言的数组,玩家只会以1起数而不是0,所以我们需要对,行列皆减1。

//玩家下棋(*)
void play_game(char board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请下棋->");
		scanf("%d %d", &x, &y);
		x--;
		y--;
		if (x >= 0 && x <= row && y >= 0 && y <= col)
		{
			if (board[x][y] == ' ')
			{
				board[x][y] = '*';
				break;
			}
			else
			{
				printf("已经有棋,请重新下载\n");
			}
		}
		else
		{
			printf("输入错误请重新输入\n");
		}
	}
}

下棋

六、电脑下棋

需注意:我们的棋盘是由限制的,所以随机生成的数值需要利用 " %行列 "以规定范围。 

//电脑下棋(#)
void computer_printf(char board[ROW][COL],int row, int col)
{
	int x = 0;
	int y = 0;

	srand((unsigned int)time(NULL));
	while(1)
	{
		x = rand() % row;//0~2
		y = rand() % col;//0~2
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

七、判断胜负

此处约定返回结果的含义:
(1)‘*’ 表示玩家获胜
(2)‘#’ 表示电脑获胜
(3)0表示胜负未分
(4)  1 表示和棋

  此处的小聪明:我们让玩家赢与电脑赢都是返回其棋子的样子,这是便于返回,可以显得代码不会过于臃肿。

//判断结果
//如果,继续就返回0,平局就返回1,如果电脑赢就返回#,如果玩家赢就返回*.
int end_game(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;

	//判断行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}

	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}

	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	//判断是否继续或平局
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')//判断是否棋局是否还有空格
				return 0;
		}
	}
	return 1;
}

核心代码

       我们知道,下棋是玩家与电脑回合制,不达到一家赢或平局,是不会停止的,所以我们需要创建几个一直正确的循环,然后,利用break语句跳出循环!

       所以就有了以下的代码组合。

void game()
{
	//初始化棋盘
	char board[ROW][COL] = { 0 };
	int i = 0, j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			board[i][j] = ' ';
		}
	}

	//打印棋盘	
	dis_printf(board, ROW, COL);
	int ret = 0;
	while (1)
	{
		//玩家下棋
		printf("玩家下棋\n");
		play_game(board, ROW, COL);

		//判断结果
		ret = end_game(board, ROW, COL);
		if (ret != 0)
		{
			break;
		}

		//打印棋盘
		dis_printf(board, ROW, COL);

		//电脑下棋
		printf("电脑下棋\n");
		computer_printf(board, ROW, COL);

		//判断结果
		ret = end_game(board, ROW, COL);
		if (ret != 0)
		{
			break;
		}

		//打印棋盘
		dis_printf(board, ROW, COL);
	}
	
	ret = end_game(board, ROW, COL);
	if (ret == '*')
	{
		printf("玩家赢\n");
	}		
	if (ret == '#')
	{
		printf("电脑赢\n");
	}
	if (ret == 1)
	{
		printf("平局\n");
	}
}

       只需要在玩家与电脑后放上一个if语句,判断只要不是继续游戏,就跳出循环,然后,在循环外判断谁赢,是否平局,这样只需要写这一次判断的代码,这样可以避免代码的臃肿。

总代码

game.h

#pragma once
//用于游戏的函数引用,头文件的说明

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

#define ROW 3 //行
#define COL 3 //列

//首页
void mune();

//游戏
void game();

//打印棋盘
void dis_printf(char board[ROW][COL],int row,int col);

//玩家下棋
void play_game(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_printf(char board[ROW][COL], int row, int col);

//判断结果
int end_game(char board[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//用于游戏的实现

//游戏首页
void mune()
{
	printf("************************************\n");
	printf("**********     1 play     **********\n");
	printf("************************************\n");
	printf("**********     0 exit     **********\n");
	printf("************************************\n");
}

//打印棋盘
void dis_printf(char board[ROW][COL],int row,int col)
{
	int j = 0;
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}


//玩家下棋(*)
void play_game(char board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请下棋->");
		scanf("%d %d", &x, &y);
		x--;
		y--;
		if (x >= 0 && x <= row && y >= 0 && y <= col)
		{
			if (board[x][y] == ' ')
			{
				board[x][y] = '*';
				break;
			}
			else
			{
				printf("已经有棋,请重新下载\n");
			}
		}
		else
		{
			printf("输入错误请重新输入\n");
		}
	}
}

//电脑下棋(#)
void computer_printf(char board[ROW][COL],int row, int col)
{
	int x = 0;
	int y = 0;

	srand((unsigned int)time(NULL));
	while(1)
	{
		x = rand() % row;//0~2
		y = rand() % col;//0~2
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}


//判断结果
//如果,继续就返回0,平局就返回1,如果电脑赢就返回#,如果玩家赢就返回*.
int end_game(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;

	//判断行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}

	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}

	//判断对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	//判断是否继续或平局
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')//判断是否棋局是否还有空格
				return 0;
		}
	}
	return 1;
}

text.c

#define _CRT_SECURE_NO_WARNINGS 1
//用于游戏的检测
#include "game.h"

void game()
{
	//初始化棋盘
	char board[ROW][COL] = { 0 };
	int i = 0, j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			board[i][j] = ' ';
		}
	}

	//打印棋盘	
	dis_printf(board, ROW, COL);
	int ret = 0;
	while (1)
	{
		//玩家下棋
		printf("玩家下棋\n");
		play_game(board, ROW, COL);

		//判断结果
		ret = end_game(board, ROW, COL);
		if (ret != 0)
		{
			break;
		}

		//打印棋盘
		dis_printf(board, ROW, COL);

		//电脑下棋
		printf("电脑下棋\n");
		computer_printf(board, ROW, COL);

		//判断结果
		ret = end_game(board, ROW, COL);
		if (ret != 0)
		{
			break;
		}

		//打印棋盘
		dis_printf(board, ROW, COL);
	}
	
	ret = end_game(board, ROW, COL);
	if (ret == '*')
	{
		printf("玩家赢\n");
	}		
	if (ret == '#')
	{
		printf("电脑赢\n");
	}
	if (ret == 1)
	{
		printf("平局\n");
	}
}

void text()
{
	int input = 0;
	do
	{
		mune();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
}

int main()
{
	text();
	return 0;
}

游戏的结果

(可惜就是因为电脑随机下,就显得电脑特别特别笨……,所以电脑赢难,平局更难……)

玩家赢

 电脑赢

 平局

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
很抱歉,我不能提供完整的代码文件,因为我无法提供文件上传功能。但是,你可以根据引用和引用中提供的代码片段来编写三子棋的C语言代码。引用中提供了一个包含源代码的zip文件,你可以下载并查看其中的代码。而引用则提供了一个关于三子棋的完整代码示例,你可以参考其中的实现思路和函数声明来编写你自己的代码。 在编写代码之前,你需要先了解三子棋的规则和逻辑。一般来说,三子棋是在一个3x3的棋盘上进,玩家和电脑轮流下棋,目标是先将自己的棋子连成一、一或一条对角线获胜。你需要定义一个棋盘的数据结构,用来表示棋盘的状态,然后实现玩家和电脑的落子函数以及判断胜负的函数。 参考引用中提供的函数声明,你可以按照以下步骤来编写三子棋的C语言代码: 1. 定义一个3x3的二维数组来表示棋盘,可以命名为board。 2. 实现InitBoard函数,用于初始化棋盘,将所有格子都设置为空。 3. 实现DisplayBoard函数,用于打印当前棋盘的状态,可以将空格用空白字符表示,玩家的棋子用X表示,电脑的棋子用O表示。 4. 实现PlayerMove函数,用于获取玩家的输入,并在棋盘上落子。 5. 实现ComputerMove函数,用于生成电脑的落子策略,并在棋盘上落子。 6. 实现IsWin函数,用于判断当前的棋局是否已经分出胜负,如果玩家获胜,则返回*;如果电脑获胜,则返回#;如果平局,则返回Q;如果游戏尚未结束,则返回C。 通过以上步骤,你可以完成一个简单的三子棋游戏的C语言代码。请根据实际需要进调整和完善。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c语言三子棋的项目源代码.zip](https://download.csdn.net/download/chengxuyuanlaow/86775916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C语言零基础手把手三子棋代码完整版](https://download.csdn.net/download/qq_58242352/88244594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [笔记13-1(C语言 三子棋)](https://blog.csdn.net/w_pab/article/details/123497533)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

川入

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

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

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

打赏作者

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

抵扣说明:

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

余额充值