利用二维数组实现一个简单三子棋

案例分析

三子棋是一个常见的小游戏,在一个3*3的格子里放一些符号,连成一条线就可以赢得游戏了。

我们要借助C语言代码实现这个游戏。

准备工作

我的习惯是创建两个源文件,一个头文件。这样有利于分类和修改。

代码实现

在 .h 文件中定义需要的数据。

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>//这个头文件可要可不要,我的目的是为了看清楚电脑下棋

//宏定义二维数组的行列
#define ROW 3
#define COL 3



void InitBoard(char arr[ROW][COL], int row, int col);//初始化二维数组的函数声明
void PrintMap(char arr[ROW][COL], int row, int col);//初始化棋盘样式的函数声明


void Player(char arr[ROW][COL], int row, int col);//玩家下棋的函数声明
void Computer(char arr[ROW][COL], int row, int col);//电脑下棋的函数声明

int FuncGame(char arr[ROW][COL], int row, int col);//判断胜负的函数声明

接下来就是主函数的逻辑部分

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void game()
{
	char board[ROW][COL] = { 0 };//定义二维数组                                	            
    InitBoard(board, ROW, COL);//初始化二维数组
	PrintMap(board, ROW, COL);//打印棋盘样式

    //接收判断胜负函数的返回值
	int ret = 0;
	while (1)
	{
        //玩家下棋并打印棋盘,继而判断胜负
		Player(board, ROW, COL);
		PrintMap(board, ROW, COL);

		ret = FuncGame(board, ROW, COL);
		if (ret == 1)
		{
			printf("玩家胜利!\n");
			break;
		}


        //这里加了一个花里胡哨的东西,实际上没什么用
		printf("等待电脑\n");
		Sleep(100);


        //电脑下棋并打印棋盘,继而判断游戏胜负
		Computer(board, ROW, COL);
		PrintMap(board, ROW, COL);
		ret = FuncGame(board, ROW, COL);
		if (ret == 2)
		{
			printf("电脑胜利!\n");
			break;
		}
	}




}
void menu()
{
	printf("\n");
	printf("\n");
	printf("\n");
	printf("*****************************************\n");
	printf("******1.PLAY              0.EXIT*********\n");
	printf("*****************************************\n");
	printf("\n");
	printf("\n");
	printf("\n");

}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();//菜单函数
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//游戏主体函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);
	return 0;
}

最后就是具体函数的实现啦

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"


//初始化二维数组为空格
void InitBoard(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] = ' ';
		}
	}
}



//打印棋盘的样式
void PrintMap(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++)
		{
			printf(" %c ", arr[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 Player(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//这里需要判断坐标是否合法
		{
			if (arr[x - 1][y - 1] == ' ')//数组的下标是从0开始,所以输入的坐标要-1
			{
				arr[x - 1][y - 1] = '#';
				break;
			}
			else
			{
				printf("该坐标被占用");//只有在没有棋子的位置下棋
			}
		}
		else
		{
			printf("坐标有误\n");
		}
	}
	
}




//电脑下棋的实现
void Computer(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{


        随机在合法的坐标中产生任意坐标
		x = rand() % row;
		y = rand() % col;


		if (arr[x][y] == ' ')
		{
			arr[x][y] = '*';
			break;
		}
	}
}




//判断游戏胜负
int FuncGame(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])
		{
			if (arr[i][1] == '#')
				return 1;
			if (arr[i][1] == '*')
				return 2;
		}
	}
	int j = 0;


    //每列连成一条线
	for (j = 0; i < col; j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j])
		{
			if (arr[1][j] == '#')
				return 1;
			if (arr[1][j] == '*')
				return 2;
		}
	}


    
    //棋盘对角线连成一条线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2])
	{
		if (arr[1][1] == '#')
			return 1;
		if (arr[1][1] == '*')
			return 2;
	}
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0])
	{
		if (arr[1][1] == '#')
			return 1;
		if (arr[1][1] == '*')
			return 2;
	}
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小龙向钱进

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

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

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

打赏作者

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

抵扣说明:

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

余额充值