三子棋小游戏

一.大体思路

先设置棋盘,玩家选择要走的坐标,电脑随机选择棋盘上空着的坐标,接着进行判断即可
1.首先我们需要一个棋盘,我们可以用一个二维字符数组来表示

char board[3][3] = { 0 };//定义一个字符数组作为棋盘

2.通过 InitBoard函数将其初始化

void InitBoard(char board[][ROW], int row, int col)
{
	memset(board,' ',row*col*sizeof(char));//将数组初始化为空格
}

3.再通过ShowBoard将其打印出来

void ShowBoard(char board[][ROW], int row, int col)
{
	printf("\n");
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("___");
				printf("|");
			}
		}
		else
		{
			for (j = 0; j < col; j++)
			{
				printf("   |");
			}
		}
		printf("\n");	
	}
	printf("\n");
}

在这里插入图片描述
4.如何下棋

(1)玩家下棋:玩家输入要走的坐标

void PlayerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋!\n");
		printf("请输入您下的位置(1-3):\n");
		scanf("%d%d", &x, &y);
		if (x > 0 && x < 4 && y>0 && y < 4)//判断输入的位置是否合法
		{
			if (board[x - 1][y - 1] ==' ')//判断该位置是否有棋子
			{
				board[x - 1][y - 1] = 'X';
				break;
			}
			else
			{
				printf("该位置已有棋子!\n");
			}
		}
		else
		{
			printf("输入不合法!");
		}
	}
}

在这里插入图片描述
(2)电脑下棋:调用库函数,产生随机坐标实现电脑玩

void ComputerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋!\n");
	while (1)
	{
		x = rand() % row;//产生随机坐标
		y = rand() % col;
		if (board[x ][y ] == ' ')//判断该位置是否有棋子
		{
			board[x ][y ] = 'Y';
			break;
		}	
	}
}

在这里插入图片描述
4.判断规则

     1 如果棋盘没满,则一直继续下;                                           
     2 如果玩家下完之后,棋盘上横着、竖着、斜着有三个棋子连在一起,则玩家赢;
     3 如果电脑下完之后,棋盘上横着、竖着、斜着有三个棋子连在一起,则电脑赢;                                                               
     4 棋盘满了,但是还没有胜负,则平局。                         

二.源程序

1.game.h头文件

//game.h

#pragma once
#define    GAME_H 	
#include<stdlib.h>
#include<time.h>
#include<String.h>
#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[][ROW], int row, int col);

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

//玩家移动
void PlayerMove(char board[][ROW], int row, int col);

//是否赢得了胜利
int IsWin(char board[][ROW], int row, int col);

//电脑移动
void ComputerMove(char board[][ROW], int row, int col);

//判断输赢
int IsWin(char board[][ROW], int row, int col);

//判断棋盘是否放满
int IsFull(char board[][ROW], int row, int col);

2.game.c文件

//game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//初始化棋盘
void InitBoard(char board[][ROW], int row, int col)
{
	//int i = 0;
	//int j = 0;
	//for (i = 0; i < row; i++)
	//{
	//	for (j = 0; j < col; j++)
	//	{
	//		board[i][j] = ' ';
	//	}
	//}
	memset(board, ' ', row*col * sizeof(char));//将数组初始化为0

}

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

//玩家移动
void PlayerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("玩家下棋!\n");
		printf("请输入您下的位置(1-3):\n");
		scanf("%d%d", &x, &y);
		if (x > 0 && x < 4 && y>0 && y < 4)//判断输入的位置是否合法
		{
			if (board[x - 1][y - 1] == ' ')//判断该位置是否有棋子
			{
				board[x - 1][y - 1] = 'X';
				break;
			}
			else
			{
				printf("该位置已有棋子!\n");
			}
		}
		else
		{
			printf("输入不合法!");
		}
	}
}

//电脑移动
void ComputerMove(char board[][ROW], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋!\n");
	while (1)
	{
		x = rand() % row;//产生随机坐标
		y = rand() % col;
		if (board[x][y] == ' ')//判断该位置是否有棋子
		{
			board[x][y] = 'Y';
			break;
		}
	}
}

//判断输赢
int IsWin(char board[][ROW], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//横向判断
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}

		//纵向判断
		else if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}

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

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

		//判断棋盘是否放满
		else if (IsFull(board, row, col == 1))
		{
			return 0;
		}
	}
	return 1;

}

//判断棋盘是否放满
int IsFull(char board[][ROW], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			//遇到空格即表示棋盘没满,返回0
			if (board[i][j == ' '])
			{
				return 1;
			}
		}
	}
	return 0;//表示棋盘已放满棋子
}

3.test.c文件

//test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h" 

//打印菜单
void menu()
{
	printf("**********************\n");
	printf("********0.exit********\n");
	printf("********1.play********\n");
	printf("**********************\n");
}

//游戏
void game()
{
	int ret = 0;
	char board[3][3] = { 0 };//定义数组作为棋盘
	InitBoard(board, ROW, COL);//初始化棋盘 
	ShowBoard(board, ROW, COL);//打印棋盘 
	while (1)
	{
		PlayerMove(board, ROW, COL);//玩家下棋
		ShowBoard(board, ROW, COL);//打印棋盘
		ret = IsWin(board, ROW, COL);//每次都要判断是否赢了比赛 
		if (ret !=1)//结束游戏
		{
			break;
		}
		ComputerMove(board, ROW, COL);//电脑下棋
		ShowBoard(board, ROW, COL); //打印棋盘
		ret = IsWin(board, ROW, COL);//每次都要判断是否赢了比赛
		if (ret != 1)//结束游戏
		{
			break;
		}
	}
	if (ret == 'X')//玩家获胜,游戏结束
	{
		printf("玩家获胜\n");
	}
	if (ret == 'Y')//电脑获胜,游戏结束
	{
		printf("电脑获胜\n");
	}
	if (ret == 0)//平局,游戏结束
	{
		printf("平局\n");
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//产生随机种子
	do
	{
		menu();//打印菜单
		printf("\n请选择你的操作:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("\n游戏开始!\n");
			game();
			break;
		case 0:
			printf("游戏退出!\n\n");
			break;
		default:
			printf("请输入正确的数字:\n");
			break;
		}
	} while (input);
	return 0;
}

三.演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值