【数组和函数实战: 斗地主游戏】

目录

1. 玩法说明
2. 分析和设计
3. 代码实现
4. 游戏演示

1. 玩法说明

在这里插入图片描述
一副54张牌,3最小,两个王最大,其实是2,和上面一样从大到小排列

2. 分析和设计

2.1 分析和设计

常量和变量设计

一副牌有54张,有牌的数值和花色,可以分别用两个数组来存储,card为卡牌表示的数值,color为它的花色

在这里插入图片描述
卡牌创建好要进行游戏,需要将牌分给玩家,那么玩家也需要存储这些卡牌,玩家一般由三人,但也不确定,每个人有一副卡牌,所以适合用二维数组存储

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

PLAYER: 玩家数量,默认为3
PLAYCARDS: 底牌为3,所以每个玩家申请的数组大小是54减去三张底牌除以玩家数量,然后考虑加入底牌的情况,数字大小再加3

在这里插入图片描述
lord记录地主的下标

函数设计

菜单显示函数

void menu();

在这里插入图片描述
卡牌初始化赋值函数

void InitCard(int num[],int numcolor[],int len);

在这里插入图片描述

考虑到需要比较卡牌的大小,从1开始赋值,1为最小的牌,通过下面的转换函数,将1转换为最小牌3的ascii码输出,花色每4个一轮,红心从3开始赋值,大小王单独赋值为14和15

转换字符函数

char ChangeCard(int num);
在这里插入图片描述
将牌的大小转换为对应大小的ascii码输出

显示卡牌函数

在这里插入图片描述由于10是两个字符,一个字符放不下,所以单独判断输出,大小王没有花色,也单独输出,17个一换行

洗牌函数

void RandomCard(int num[], int numcolor[], int len);
在这里插入图片描述
传入牌的数组和花色,思路是先从1-53下标找一个和0下标交换,之后从2-53找一个和1下标交换,从3-53找一个和2下标交换。数值和花色都需要交换,这里需要随机数函数,在主程序先置一个随机数种子

发牌函数

void SendCard(int num[], int numcolor[],
int playnum[][PLAYCARDS],int playcolor[][PLAYCARDS],
int len);

在这里插入图片描述
由于玩家是二维数组,而卡牌是一维数组,所以需要一些计算。当第一个玩家,也就是i=0的时候,循环17次,一人17张手牌,所以赋值的卡牌下标就是0-16,当第二个玩家是,下标从17-33,当i=1时,卡牌数组num中括号里的值需要是17,所以用i 乘玩家卡牌常量PLAYCARDS,再减去多余的3张地主牌,就是 1*(20-3)+0,然后把底牌手牌也输出

选地主函数

void LandLord(int num[], int numcolor[],
int playnum[][PLAYCARDS], int playcolor[][PLAYCARDS],
int len,int *lord);
在这里插入图片描述
遍历玩家数组,找到红心4的拥有者,选为地主,传入地主变量的地址,接收地主编号,将地主玩家的手牌中加入底牌

开始出牌显示

void PlayShow(int playnum[][PLAYCARDS], int playcolor[][PLAYCARDS],int len,int lord);
在这里插入图片描述

这时分农民和地主的显示,大致和ShowCard函数的逻辑一致,只是加入了地主和农民的分辨

3. 代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>#define PLAYER 3   //玩家数量
#define PLAYCARDS (54-3)/PLAYER+3 //玩家申请数量void InitCard(int num[],int numcolor[],int len) {printf("初始化卡牌...\r\n");Sleep(1000);//牌的大小赋值,从1开始,依次累加int index = 0;    //牌大小int color = 3;    //牌花色for (int i = 0; i < len-2; i++) {if (i % 4 == 0) {index++;color = 3;}num[i] = index;numcolor[i] = color;color++;}num[52] = 14;num[53] = 15;	}void RandomCard(int num[], int numcolor[], int len) {int index = 0;for (int i = 1; i < len; i++) {//1 1-53   2 2-53  3 3-53//从后面随机一个,先和0下标交换,不断往后移index = rand() % (len-i) + i;int temp = num[i-1];int tempcolor = numcolor[i - 1];num[i - 1] = num[index];numcolor[i - 1] = numcolor[index];num[index] = temp;numcolor[index] = tempcolor;}
}char ChangeCard(int num) {switch (num % 16){case 1:return '3';case 2:return '4';case 3:return '5';case 4:return '6';case 5:return '7';case 6:return '8';case 7:return '9';case 8:return '0';case 9:return 'J';case 10:return 'Q';case 11:return 'K'; case 12:return 'A';case 13:return '2';case 14:return '\x1';case 15:return '\x2';default:break;}
}
void ShowCard(int num[],int numcolor[], int len) {for (int i = 0; i < len; i++) {//大小王和10单独显示if (num[i] == 14 || num[i] == 15) {printf("%c   ", ChangeCard(num[i]));}else if (num[i] == 8) {printf("%c%d ", numcolor[i],10);}else {printf("%c%c  ", numcolor[i], ChangeCard(num[i]));}if ((i+1) % 17 == 0) {printf("\r\n");}}printf("\r\n");
}//参数,卡牌数组和花色数组,玩家卡牌数组和花色数组,卡牌长度,玩家数量
void SendCard(int num[], int numcolor[],int playnum[][PLAYCARDS],int playcolor[][PLAYCARDS],int len) {system("cls");printf("发牌中...");Sleep(1000);system("cls");for (int i = 0; i < PLAYER; i++) {for (int j = 0; j < PLAYCARDS-3; j++) {playnum[i][j] = num[i * (PLAYCARDS-3) + j];playcolor[i][j] = numcolor[i * (PLAYCARDS - 3)+j];}}printf("\r\n");//显示手牌for (int i = 0; i < PLAYER; i++) {printf("play%d:\r\n", i + 1);ShowCard(playnum[i], playcolor[i], PLAYCARDS - 3);}//显示底牌printf("底牌:\r\n");for (int i = len- PLAYER; i < len; i++) {printf("%c%c ", numcolor[i], ChangeCard(num[i]));}printf("\r\n");
}void LandLord(int num[], int numcolor[], int playnum[][PLAYCARDS], int playcolor[][PLAYCARDS],int len,int *lord) {for (int i = 0; i < PLAYER; i++) {for (int j = 0; j < PLAYCARDS - 3; j++) {//红心4为地主if (playnum[i][j] == 2 && playcolor[i][j] == 3) {*lord = i;printf("地主是play%d\r\n", *lord +1);goto NEXT;}}}NEXT:Sleep(3000);//地主加入底牌playnum[*lord][17] = num[51];playcolor[*lord][17] = numcolor[51];playnum[*lord][18] = num[52];playcolor[*lord][18] = numcolor[52];playnum[*lord][19] = num[53];playcolor[*lord][19] = numcolor[53];}void PlayShow(int playnum[][PLAYCARDS], int playcolor[][PLAYCARDS],int len,int lord) {system("cls");printf("开始出牌...\r\n");Sleep(1000);//显示手牌for (int i = 0; i < PLAYER; i++) {if (i == lord) {printf("(地主)play%d:\r\n", i + 1);}else {printf("(农民)play%d:\r\n", i + 1);}for (int j = 0; j < len; j++) {//大小王和10单独显示if (playnum[i][j] == 14 || playnum[i][j] == 15) {printf("%c   ", ChangeCard(playnum[i][j]));}else if(playnum[i][j] == 8){printf("%c%d ", playcolor[i][j], 10);}else {printf("%c%c  ", playcolor[i][j], ChangeCard(playnum[i][j]));}}printf("\r\n");}printf("\r\n");
}
void menu() {system("cls");printf("********************\r\n");printf("*****1.开始游戏*****\r\n");printf("*****0.退出游戏*****\r\n");printf("********************\r\n");
}
int main()
{srand((unsigned int)time(NULL));//创建卡牌数组int card[54] = { 0 };int color[54] = { 0 };//创建玩家数组int playcard[PLAYER][PLAYCARDS] = {0};int playcolor[PLAYER][PLAYCARDS] = {0};//卡牌长度int len = sizeof(card) / sizeof(card[0]);//地主int lord = 0;int sel;   //获取用户选择menu();do{scanf("%d", &sel);switch (sel) {case 1:system("cls");//初始化卡牌InitCard(card, color, len);//洗牌RandomCard(card, color, len);//ShowCard(card, color, len);//发牌SendCard(card, color, playcard, playcolor, len);//选地主LandLord(card, color, playcard, playcolor, len,&lord);//开始出牌PlayShow(playcard, playcolor, PLAYCARDS,lord);break;case 0:printf("退出游戏\r\n");return;break;default:menu();printf("输入错误\r\n");			break;}} while (1);return 0;
}

4. 游戏演示

需要将控制台右键属性切换为点阵字体,显示ascii符号

  1. 开始游戏

在这里插入图片描述

  1. 初始化卡牌

在这里插入图片描述
3. 选完地主显示

在这里插入图片描述
4. 出牌显示

在这里插入图片描述

后续功能等待开发…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java数据结构之《希尔排序》题目

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题只要我写完…

CGAL的四叉树、八叉树、正交树

四叉树&#xff08;Quadtree&#xff09;&#xff1a;四叉树是一种用于二维空间分割的数据结构。它将一个二维区域划分为四个象限&#xff0c;每个象限进一步细分为四个小块&#xff0c;以此类推。四叉树可以用于空间索引、图形学、地理信息系统&#xff08;GIS&#xff09;等领…

前端打包添加前缀

vue2添加前缀 router的base加上前缀 export default new Router({mode: history, // 去掉url中的#base: privateDeployUrl, // 这里加上前缀scrollBehavior: () > ({y: 0}),routes: constantRoutes })vue.config.js&#xff0c;publicPath属性加上前缀 publicPath: proces…

Kali 修改IP地址和DNS 开启SSH和远程桌面

一、修和IP和DNS 1、打开配置文件 vim /etc/network/interfaces# 加入 auto eth0 iface eth0 inet static address 10.3.0.231 netmask 255.255.255.0 gateway 10.3.0.12、清空网卡配置 ip addr flush dev eth0 3、配置DNS vim /etc/resolv.confnameserver 114.114.114.11…

爬虫-xpath篇

1.xpath的基础语法 表达式描述nodename选中该元素/从根节点选取、或者是元素和元素间的过渡//从匹配选择的当前节点选择文档中的节点&#xff0c;而不考虑它们的位置.选取当前节点…选取当前节点的父节点选取属性text()选取文本 举例&#xff1a; 路径表达式结果html选择html元…

TLS协议握手流程

浅析 TLS&#xff08;ECDHE&#xff09;协议的握手流程&#xff08;图解&#xff09; - 知乎 前言 通过 wireshark 抓取 HTTPS 包&#xff0c;理解 TLS 1.2 安全通信协议的握手流程。 重点理解几个点&#xff1a; TLS 握手流程&#xff1a;通过 wireshark 抓取 HTTPS 包理解…

常用数据预处理方法 python

常用数据预处理方法 数据清洗缺失值处理示例删除缺失值插值法填充缺失值 异常值处理示例删除异常值替换异常值 数据类型转换示例数据类型转换在数据清洗过程中非常常见 重复值处理示例处理重复值是数据清洗的重要步骤 数据转换示例 数据集成示例数据集成是将多个数据源合并为一…

【网络协议】聊聊网络ReadTimeout和ConnectTimeout

在实际的开发中&#xff0c;网络超时是一个比较常见的问题&#xff0c;比如说针对支付系统&#xff0c;超时就需要进行和三方人员进行核对订单状态&#xff0c;是否人工介入处理。 但其实在设计网络框架的时候&#xff0c;一般都有两个超时参数 连接超时参数 ConnectTimeout&am…

vue项目node-sass^4.14.1 python gyp 报错解决办法

npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass/参考链接&#xff1a;链接

LabVIEW在不同操作系统上使VI、可执行文件或安装程序

LabVIEW在不同操作系统上使VI、可执行文件或安装程序 LabVIEW可以在多个操作系统上运行&#xff0c;主要支持以下几种操作系统&#xff1a; Windows&#xff1a; LabVIEW在各个版本的Windows操作系统上都能运行&#xff0c;包括Windows 7、Windows 8和Windows10。LabVIEW为Wi…

elk:filebeat也是一个日志收集工具

filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动使用的资源要小的多 filebeat可以允许在非java环境&#xff0c;他可以代替logstash在非java环境上收集日志 filebeat无法实现数据的过滤&#xff0c;一般是结合logstash的数据过滤功能一…

Safe and Practical GPU Computation in TrustZone论文阅读笔记

Safe and Practical GPU Computation in TrustZone 背景知识&#xff1a; youtube GR视频讲解链接&#xff1a;ASPLOS’22 - Session 2A - GPUReplay: A 50-KB GPU Stack for Client ML - YouTube GPU软件栈&#xff1a; 概念&#xff1a;"GPU软件栈"指的是与GPU硬件…

使用mybatis-plus框架:@Autowired报错Could not autowire. No beans of ‘XXX‘ type found

使用mybatis-plus框架,使用xxmapper报错&#xff1a; 解决办法是&#xff1a;在mapper中添加注解&#xff1a; Repository Mapper 也可以使用 AutowiredSysRoleMenuService sysRoleMenuService;替代 AutowiredSysRoleMenuMapper sysRoleMenuMapper;方法名不同&#xff0c;但…

处理和分析人类语言数据-NLTK安装和使用

简介&#xff1a;NLTK&#xff08;Natural Language Toolkit&#xff09;是一个强大的Python库&#xff0c;用于处理和分析人类语言数据&#xff0c;是一个开源的项目&#xff0c;包含&#xff1a;Python模块&#xff0c;数据集和教程&#xff0c;用于NLP的研究和开发&#xff…

Windows系统下Elasticsearch-7.15.2安装

一、环境 此次笔记使用的运行环境以及软件版本 系统:WIN10 JDK版本&#xff1a;1.8 Elasticsearch版本&#xff1a;7.15.2 elasticsearch-head版本&#xff1a;最新 IK分词器版本&#xff1a;7.15.2 Kibana版本&#xff1a;7.15.2 二、Elasticsearch基本知识 2.1 介绍…

java源码-类与对象

1、类与对象的初步认知 在了解类和对象之前我们先了解一下什么是面向过程和面向对象。 1&#xff09;面向过程编程&#xff1a; C语言就是面向过程编程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 2&#xff09;面向对…

第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码)

记第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码) RS type 1 衍射空间像计算傅里叶变换采样条件实际计算计算要求傅立叶变换法计算直接卷积方法计算代码傅立叶变换方法直接卷积https://zhuanlan.zhihu.com/p/624292239 Goodman, J. W. (2004). Intro…

蓝桥杯day04——查询后矩阵的和

1.题目 给你一个整数 n 和一个下标从 0 开始的 二维数组 queries &#xff0c;其中 queries[i] [typei, indexi, vali] 。 一开始&#xff0c;给你一个下标从 0 开始的 n x n 矩阵&#xff0c;所有元素均为 0 。每一个查询&#xff0c;你需要执行以下操作之一&#xff1a; …

C++作业2

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() 代码&#xff1a…

数字图像处理(实践篇)十七 Shi-Tomasi 角点检测

目录 一 涉及的函数 二 实践 在使用OpenCV之前&#xff0c;需要先安装相关的库和依赖项&#xff0c;命令如下所示&#xff1a; # 安装OpenCV的基础版pip install opencv-python# 安装OpenCV的扩展版pip install opencv-contrib-python 一 涉及的函数 OpenCV 提供了cv2.goo…