【项目实战1】五子棋游戏

目录

C语言编程实现五子棋::

game.h

game.c

                        1.打印菜单

                        2.打印棋盘

                        3.玩家下棋

                        4.判断五子连珠

                        5.判断输赢

                        6.游戏运行

game.c完整源代码展示

test.c


C语言编程实现五子棋::

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define ROW 20
#define COL 20
#define PLAYER1 1
#define PLAYER2 2
#define NEXT 0
#define PLAYER1_WIN 1
#define PLAYER2_WIN 2
#define DRAW 3 
enum Dir
{
	LEFT,
	RIGHT,
	UP,
	DOWN,
	LEFT_UP,
	LEFT_DOWN,
	RIGHT_UP,
	RIGHT_DOWN
};
void Menu();
void Game();

game.c

1.打印菜单

void Menu()
{
	printf("#############################\n");
	printf("#######   五子棋游戏   ######\n");
	printf("#######1.Play    0.Exit######\n");
	printf("#############################\n");
	printf("#############################\n");
	printf("Please Select:");
}

2.打印棋盘

void ShowBoard(int board[ROW][COL], int row, int col)
{
	//清屏
	system("cls");
	printf("  ");
	int i = 1;
	for (i = 1;i <= col;i++)
	{
		printf("%3d", i);
	}
	printf("\n");
	for (i = 0;i < row;i++)
	{
		int j = 0;
		printf("%2d ", i + 1);
		for (j = 0;j < col;j++)
		{
			if (board[i][j] == 0)
			{
				printf(" . ");
			}
			else if (board[i][j] == PLAYER1)
			{
				printf(" # ");
			}
			else
			{
				printf(" o ");

			}
		}
		printf("\n");
	}
}

3.玩家下棋

void PlayerMove(int board[ROW][COL], int row, int col, int who)
{
	
	while (1)
	{
		printf("Player[%d] Please Enter your Pos:", who);
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("输入坐标不合法!\n");
			continue;
		}
		else if (board[x - 1][y - 1] != 0)
		{
			printf("Pos Is Occupied!\n");
			continue;
		}
		else
		{
			board[x - 1][y - 1] = who;
			break;
		}
	}
}

4.判断五子连珠

int ChessCount(int board[ROW][COL], int row, int col,enum Dir d)
{
	int _x = x - 1;
	int _y = y - 1;
	int count = 0;
	while (1)
	{
		switch (d)
		{
		case LEFT:
			_y--;
			break;
		case RIGHT:
			_y++;
			break;
		case UP:
			_x--;
			break;
		case DOWN:
			_x++;
			break;
		case LEFT_UP:
			_x--;
			_y--;
			break;
		case LEFT_DOWN:
			_x++;
			_y--;
			break;
		case RIGHT_UP:
			_x--;
			_y++;
			break;
		case RIGHT_DOWN:
			_x++;
			_y++;
			break;
		default:
			//Do Nothing
			break;
		}
		//不合法
		if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1)
		{
			break;
		}
		//合法
		if (board[x - 1][y - 1] == board[_x][_y])
		{
			count++;
		}
		else
		{
			break;
		}
	}
	return count;
}

5.判断输赢

int IsWin(int board[ROW][COL], int row, int col)
{
	//在当前位置(x,y)处
	int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1;
	int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1;
	int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1;
	int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP)+ 1;
	if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)
	{
		if (board[x - 1][y - 1] == PLAYER1)
		{
			return PLAYER1_WIN;
		}
		else
		{
			return PLAYER2_WIN;
		}
	}
	int i = 0;
	for (i = 0;i < row;i++)
	{
		int j = 0;
		for (j = 0;i < col;j++)
		{
			if (board[i][j] == 0)
			{
				return NEXT;
			}
		}
	}
	return DRAW;
}

6.游戏运行

void Game()
{
	int board[ROW][COL];
	memset(board, 0, sizeof(board));
	int result = NEXT;
	do
	{
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER1);
		result = IsWin(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER2);
		result = IsWin(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
	} while (1);
	//用户1赢 用户2赢 平局
	switch (result)
	{
	case PLAYER1_WIN:
		printf("恭喜用户1,你已经赢了!\n");
		break;
	case PLAYER2_WIN:
		printf("恭喜用户2,你已经赢了!\n");
		break;
	case DRAW:
		printf("平局,和气生财!\n");
		break;
	default:
		break;
	}
	system("pause");
	ShowBoard(board, ROW, COL);
}

game.c完整源代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int x = 0;
int y = 0;
void Menu()
{
	printf("#############################\n");
	printf("#######   五子棋游戏   ######\n");
	printf("#######1.Play    0.Exit######\n");
	printf("#############################\n");
	printf("#############################\n");
	printf("Please Select:");
}
//按照(x,y)作为起点,按照特定的方向,求连续相对的最大个数
int ChessCount(int board[ROW][COL], int row, int col,enum Dir d)
{
	int _x = x - 1;
	int _y = y - 1;
	int count = 0;
	while (1)
	{
		switch (d)
		{
		case LEFT:
			_y--;
			break;
		case RIGHT:
			_y++;
			break;
		case UP:
			_x--;
			break;
		case DOWN:
			_x++;
			break;
		case LEFT_UP:
			_x--;
			_y--;
			break;
		case LEFT_DOWN:
			_x++;
			_y--;
			break;
		case RIGHT_UP:
			_x--;
			_y++;
			break;
		case RIGHT_DOWN:
			_x++;
			_y++;
			break;
		default:
			//Do Nothing
			break;
		}
		//不合法
		if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1)
		{
			break;
		}
		//合法
		if (board[x - 1][y - 1] == board[_x][_y])
		{
			count++;
		}
		else
		{
			break;
		}
	}
	return count;
}
//4种返回值 NEXT:继续 PLAYER1_WIN:用户1赢 PLAYER2_WIN:用户2赢 DRAW:平局
int IsWin(int board[ROW][COL], int row, int col)
{
	//在当前位置(x,y)处
	int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1;
	int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1;
	int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1;
	int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP)+ 1;
	if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)
	{
		if (board[x - 1][y - 1] == PLAYER1)
		{
			return PLAYER1_WIN;
		}
		else
		{
			return PLAYER2_WIN;
		}
	}
	int i = 0;
	for (i = 0;i < row;i++)
	{
		int j = 0;
		for (j = 0;i < col;j++)
		{
			if (board[i][j] == 0)
			{
				return NEXT;
			}
		}
	}
	return DRAW;
}
void ShowBoard(int board[ROW][COL], int row, int col)
{
	//清屏
	system("cls");
	printf("  ");
	int i = 1;
	for (i = 1;i <= col;i++)
	{
		printf("%3d", i);
	}
	printf("\n");
	for (i = 0;i < row;i++)
	{
		int j = 0;
		printf("%2d ", i + 1);
		for (j = 0;j < col;j++)
		{
			if (board[i][j] == 0)
			{
				printf(" . ");
			}
			else if (board[i][j] == PLAYER1)
			{
				printf(" # ");
			}
			else
			{
				printf(" o ");

			}
		}
		printf("\n");
	}
}
void PlayerMove(int board[ROW][COL], int row, int col, int who)
{
	
	while (1)
	{
		printf("Player[%d] Please Enter your Pos:", who);
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("输入坐标不合法!\n");
			continue;
		}
		else if (board[x - 1][y - 1] != 0)
		{
			printf("Pos Is Occupied!\n");
			continue;
		}
		else
		{
			board[x - 1][y - 1] = who;
			break;
		}
	}
}
void Game()
{
	int board[ROW][COL];
	memset(board, 0, sizeof(board));
	int result = NEXT;
	do
	{
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER1);
		result = IsWin(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER2);
		result = IsWin(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
	} while (1);
	//用户1赢 用户2赢 平局
	switch (result)
	{
	case PLAYER1_WIN:
		printf("恭喜用户1,你已经赢了!\n");
		break;
	case PLAYER2_WIN:
		printf("恭喜用户2,你已经赢了!\n");
		break;
	case DRAW:
		printf("平局,和气生财!\n");
		break;
	default:
		break;
	}
	system("pause");
	ShowBoard(board, ROW, COL);
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
	int select = 0;
	int quit = 0;
	while (quit == 0)
	{
		Menu();
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Game();
			break;
		case 0:
			quit = 1;
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949881.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用ResNet50+Qwen2-VL-2B-Instruct+LoRA模仿Diffusion-VLA的论文思路,在3090显卡上训练和测试成功

想一步步的实现Diffusion VLA论文的思路&#xff0c;不过论文的图像的输入用DINOv2进行特征提取的&#xff0c;我先把这个部分换成ResNet50。 老铁们&#xff0c;直接上代码&#xff1a; from PIL import Image import torch import torchvision.models as models from torch…

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中&#xff0c; 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照&#xff1a; Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症&#xff0c;总是想着从底层开始实现属性的加解密&#xff0c;…

A/B实验之置信检验(一):如何避免误判 (I类) 和漏报 (II类)

假设检验的依据&#xff1a;如何避免误判和漏报 A/B实验系列相关文章&#xff08;置顶&#xff09; 1.A/B实验之置信检验&#xff08;一&#xff09;&#xff1a;如何避免误判和漏报 2.A/B实验之置信检验&#xff08;二&#xff09;&#xff1a;置信检验精要 引言 在数据驱动…

每日一题:链表中环的入口结点

文章目录 判断链表环的入口节点描述数据范围&#xff1a;复杂度要求&#xff1a;输入输出 示例代码实现思路解析注意事项&#xff1a; 判断链表环的入口节点 描述 给定一个链表&#xff0c;判断该链表是否存在环。如果存在环&#xff0c;返回环的入口节点&#xff1b;如果不存…

深度学习blog-Meanshift均值漂移算法-最大熵模型

均值漂移&#xff08;Mean Shift&#xff09;是一种无监督的聚类算法&#xff0c;广泛应用于数据挖掘和计算机视觉任务。它通过移动样本点到其近邻的均值位置来寻找数据的高密度区域&#xff0c;最终形成聚类。 均值漂移算法原理 均值漂移算法的核心思想是通过滑动窗口&#…

51c自动驾驶~合集45

我自己的原文哦~ https://blog.51cto.com/whaosoft/13020031 #运动控制和规划控制需要掌握的技术栈~ 各大垃圾家电造车厂又要开始了~~~​ 1、ROS的通信方式 李是Lyapunov的李&#xff1a;谈谈ROS的通信机制 话题通信和服务通信&#xff0c;其中话题通信是通过发布和订阅…

Python基于jieba和wordcloud绘制词云图

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 Python基于jieba和wordcloud绘制词云图 &#x1f3b6;一、实现过程 读取文本…

计算机网络与服务器

目录 架构体系及相关知识 三层架构&#xff1a; 四层架构&#xff1a; 常见的应用的模式&#xff1a; OSI模型 分层 数据链路层 TCP/IP模型 TCP和UDP都是传输层的协议 TCP三次握手、四次次分手 URL&HTTP协议详解 网址URL 结构化 报文行 报文头 空行 报文体…

Cursor实现go项目配置并实现仓库Gin项目运行

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;知识备份 ✨特色专栏&#xff1a;知识分享 &#x…

141.环形链表 142.环形链表II

141.环形链表 & 142.环形链表II 141.环形链表 思路&#xff1a;快慢指针 or 哈希表 快慢指针代码&#xff1a; class Solution { public:bool hasCycle(ListNode *head) {if(headnullptr||head->nextnullptr)return false;ListNode *fasthead->next; //不能设置成…

信用租赁系统助力企业实现免押金租赁新模式

内容概要 在现代商业环境中&#xff0c;信用租赁正在迅速崛起。通过结合大数据与区块链技术&#xff0c;信用租赁系统彻底改变了传统的租赁流程。什么是信用租赁呢&#xff1f;简单说&#xff0c;就是不需要押金&#xff0c;你也能够租到你想要的物品&#xff0c;这对企业和消…

el-select下拉框在弹框里面错位

问题出现 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;el-select 是其中一个用于选择器的组件。在 el-select 组件中&#xff0c;teleported 属性用于控制下拉菜单的渲染位置。 解决方法 teleported 属性「element-plus」 popper-append-to-body属性「element」 ‌…

IO进程day1

一、思维导图

力扣-21-合并两个有序链表

思路&#xff1a; 因为是升序的两个链表&#xff0c;我们可以进行数据域比大小&#xff0c;然后把p3(自己创建的)的指针域指向小的那个 注&#xff1a;一定要先判断两个指针为0的情况

人工智能的发展领域之GPU加速计算的应用概述、架构介绍与教学过程

文章目录 一、架构介绍GPU算力平台概述优势与特点 二、注册与登录账号注册流程GPU服务器类型配置选择指南内存和存储容量网络带宽CPU配置 三、创建实例实例创建步骤镜像选择与设置 四、连接实例SSH连接方法远程桌面配置 一、架构介绍 GPU算力平台概述 一个专注于GPU加速计算的…

QT实现 端口扫描暂停和继续功能 3

上篇QT给端口扫描工程增加线程2-CSDN博客 为按钮pushButton_Stop添加clicked事件&#xff0c;功能为暂停扫描&#xff0c;并在暂停后显示继续按钮&#xff0c;点击继续按钮之后继续扫描 1.更新UI 添加继续按钮 点击转到槽则会自动声明 2. 更新 MainWindow.h 需要新增的部分…

汽车微处理器安全机制以及测试介绍

本文介绍了三类汽车微处理器安全机制&#xff1a;硬件类、软件类和混合类&#xff0c;旨在提高系统的可靠性和安全性。硬件类安全机制包括逻辑内建自测试&#xff08;Logic-BIST&#xff09;、三重模块冗余&#xff08;TMR&#xff09;、内存内建自测试&#xff08;Memory-BIST…

【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答

问题描述 PHP应用再连接Azure Redis服务时&#xff0c;出现Connection Timed out。当通过升级提高Azure Redis的性能时候&#xff0c;发现之前的数据丢失了。 image.png 问题解答 当Redis服务出现Timeout的情况时&#xff0c;可以从Redis服务的指标(Metrics)开始查看&#xff0…

python学习笔记—15—数据容器之列表

1. 数据容器 列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict) 2. 列表 (1) 定义 tmp_list ["super", "carry", "doinb"] print(f"tmp_list {tmp_list}, tmp_list type is {type(tmp_list)}") tmp_list1 ["doi…

记录一次面试中被问到的问题 (HR面)

文章目录 一、你对公司的了解多少二、为什么对这个岗位感兴趣三、不能说的离职原因四、离职原因高情商回复五、你的核心优势是什么六、你认为你比其他面试候选人的优势是什么七、不要提及情感 一、你对公司的了解多少 准备要点&#xff1a; 在面试前&#xff0c;对公司进行充分…