首页 > 其他分享 >21点游戏(简易版)的C语言实现

21点游戏(简易版)的C语言实现

时间:2024-11-01 19:51:10浏览次数:3  
标签:case poker 21 C语言 简易版 value2 printf 点数

新人做的第一个小游戏,以后可能会改为更为严谨的规则,以及加入筹码。

代码如下:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
static int yes1 = 1, yes2 = 1;/*非0代表能继续摸牌 */

void introduction()/*介绍游戏规则 */
{
	printf("BlackJack(21点)游戏规则:\n2至10点数不变,JQK点数为10,A点数可为11或1\n总点数越接近21点的为胜者,总点数超过21点清零\n--------------------\n");
}

int getsum(char poker[21])/*输入牌组,输出当前牌组的点数 */
{
	int numA = 0, sum = 0, x = 0;
	for (int i = 0; poker[i]; i++) {
		if (poker[i] == 'A') numA++;
		switch (poker[i]) {
		case 'A': sum += 11; break; /*牌为A加11点 */
		case '1':case '2':case '3':case '4':case '5':
		case '6':case '7':case '8':case '9': sum += poker[i] - '0'; break;/*牌为1~9加对应点数 */
		case '0':case 'J':case 'Q':case 'K': sum += 10; break;/*牌为10、J、Q、K加10点 */
		}
	}
	if (numA == 0) return sum;
	else {
		while (numA && sum > 21) {/*若总点数大于21且有A,则依次减去10直至点数小于21 */
			sum -= 10;
			numA--;
		}
		return sum;
	}
}

void situation(char player1_poker[21], char player2_poker[21], char* now1, char* now2,int round) /*分析并显示当前局势 */
{
	int value1 = getsum(player1_poker), value2 = getsum(player2_poker);/*得到总点数 */
	printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");/*清屏 */
	if (yes1 && round != 1) {/*显示此轮摸到的牌,第一轮固定摸的两张牌不显示 */
		if (*(now1 - 1) == '0') printf("\n你摸到了10!");
		else printf("\n你摸到了%c!", *(now1 - 1));
	}
	printf("\n你的牌的点数为%d", value1);/*显示总点数 */
	if (value1 == 21) {/*若总点数为21点,则不再摸牌 */
		printf(",21点!\n");
		yes1 = 0;
	}
	else if (value1 > 21) {/*若总点数大于21点,则爆牌,不再摸牌 */
		printf(",爆牌!\n");
		yes1 = 0;
	}
	printf ("\n你的当前牌组为:");
	for (int i = 0; player1_poker[i]; i++){/*显示当前牌组 */
		if (player1_poker[i] == '0') printf("10 ");
		else printf("%c ",player1_poker[i]);
	}
	putchar('\n');
	if (yes2 && round != 1) {/*同上*/ 
		if (*(now2 - 1) == '0') printf("\n对手摸到了10!");
		else printf("\n对手摸到了%c!", *(now2 - 1));
	}
	printf("\n对手的牌的点数为%d", value2);
	if (value2 == 21) {
		printf(",21点!\n");
		yes2 = 0;
	}
	else if (value2 > 21) {
		printf(",爆牌!\n");
		yes2 = 0;
	}
	printf ("\n对手当前牌组为:");
	for (int i = 0; player2_poker[i]; i++){
		if (player2_poker[i] == '0') printf("10 ");
		else printf("%c ",player2_poker[i]);
	}
	printf("\n--------------------");/*分割线 */
	if (yes2 && !yes1) {/*若对手可连续摸牌而自己已停牌,输入数字继续以便于观察局势 */
		printf("\n输入任意数字继续\n");
		int c;
		scanf("%d",&c);
	}
}

char getpoker() /*随机得到一张A~K的牌 */
{
	int n = (rand()) % 13;
	if (n == 0) return '0';/*0表示10 */
	else if (n == 1) return 'A';
	else if (n > 1 && n <= 9)  return n + '0';
	else if (n == 10) return 'J';
	else if (n == 11) return 'Q';
	else if (n == 12) return 'K';
}

int main() {
	introduction();
	int play = 0;
	printf("输入1开始\n");
	scanf("%d",&play);
	while (play == 1)/*当play变量为1时开始/重开一局 */
	{
		printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");/*清屏 */
		yes1 = 1; yes2 = 1;
		srand(time(0));
		char player1_poker[21] = { 0 }, player2_poker[21] = { 0 };
		player1_poker[0] = getpoker();
		player1_poker[1] = getpoker();
		player2_poker[0] = getpoker();
		player2_poker[1] = getpoker();
		char* now1 = &player1_poker[2], * now2 = &player2_poker[2];
		int round;
		for (round = 1; yes1 || yes2; round++)/*当玩家或对手有至少一人可摸牌时继续 */
		{
			situation(player1_poker, player2_poker, now1, now2,round);/*显示当前局势 */
			int value1 = getsum(player1_poker), value2 = getsum(player2_poker);
			if (yes1) {/*若玩家能摸牌,则玩家决定是否继续摸牌 */
				printf("\n输入0停牌,输入其它数字摸牌\n");
				scanf("%d", &yes1);
			}
			if (yes1) *(now1++) = getpoker();
			value1 = getsum(player1_poker), value2 = getsum(player2_poker);
			if (value1 > 21) value1 = 0;
			if (value2 > 21) value2 = 0;/*将大于21点的点数设置为0,供机器判断 */
			if (yes2) {/*若机器能摸牌,则机器决定是否继续摸牌 */
				if (value2 < value1) yes2 = 1;/*若玩家总点数大于机器,则摸牌 */
				else if (yes1 == 0) yes2 = 0;/*若玩家总点数小于机器,且玩家已停牌,则停牌 */
				else if (value2 <= 14) yes2 = 1;/*若玩家总点数小于机器,且玩家未停牌,且机器总点数过小,摸牌 */
				else yes2 = 0; /*否则停牌 */
				}
			if (yes2) *(now2++) = getpoker();
		}
		situation(player1_poker, player2_poker, now1, now2,round);/*结束,显示最终局势 */
		int value1 = getsum(player1_poker), value2 = getsum(player2_poker);
		if (value1 > 21) value1 = 0;
		if (value2 > 21) value2 = 0;
		if (value1 == value2) printf("\n平局!\n");/*判断输赢 */
		else if (value1 > value2) printf("\n你赢了!\n");
		else if (value1 < value2) printf("\n你输了!\n");
		printf("输入1重新开始\n");
		scanf("%d", &play);/*玩家决定是否重新开始 */
	}
	return 0;
}

试玩一局:

标签:case,poker,21,C语言,简易版,value2,printf,点数
From: https://blog.csdn.net/2404_88304514/article/details/143438654

相关文章

  • c语言的一些排序算法
    文章目录前言一、......
  • 重温c语言之,7天开整,就是随便的写写,第二天
    一:操作符除法:如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3;如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础数据类型包含下的)完整的商(包含小数部分的):例如:7/2.0=3.500000;如果想要在pr......
  • (C语言)两个字符串的第一个字母合并
    #include<stdio.h>#include<string.h>voidNONO();voidfun(char*a,char*b){ char*p=a; //将字符串a的地址赋值给指针p方便访问 inti,k=1; //k=1使从第二个空间输入 while(*p=='') //将字符串前面的空格跳过 { p++; } *b=*p; //输入第一个字母......
  • 【正点原子K210连载】第四十九章 综合例程摘自【正点原子】DNK210使用指南-CanMV版指
    第四十九章综合例程本章,简单介绍一下DNK210开发板的CanMV综合例程。本章分为如下几个小节:49.1综合例程运行说明49.2综合例程展示49.1综合例程运行说明本综合例程旨在演示利用CanMV在DNK210开发板上实现的各种功能,包括板载LED控制、板载蜂鸣器控制、相机、相册、音乐播放器、......
  • 51c~C语言~合集1
    一、C语言和C++的区别 C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一个东西。现在我们常用的C语言是C89标准,C++是C++99标准的。C89就是在1989年制定的标准,如今最新的是C11和C++11标准。根据不同的标准,它们的功能也会有所不同,但是越新的版本支持的编译器越少,所以本......
  • Adobe Photoshop 2021下载与安装
    1、安装包  2021Photoshop2021cc免安装绿色中文版:链接:https://pan.quark.cn/s/d32465740151提取码:Ln9j Photoshop2021cc中文完整版:链接:https://pan.quark.cn/s/daf54ca61e53提取码:MF6U Adobephotoshopcc2019中文完整版免激活:链接:https://pan.quark.cn/s......
  • (C语言)动态内存管理,柔性数组
    1.为什么存在动态内存分配动态内存管理是C语言提供给我们自主维护空间大小的能力C语言提供了一个动态内存开辟的函数:void*malloc(size_tsize);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。·如果开辟成功,则返回一个指向开辟好空间的指针。·......
  • C语言的一些Hacking写法
    很显然,这些写法大多并不规范,也不被提倡。很显然,咱并没有在windows下试过这些代码,而且实测大部分在线编程网站用的是Linux,可以接受GNUC扩展支持。如果有人问我为什么折腾,为什么以折腾这些无聊的东西作为目标,那他们完全可以问,为什么要登上最高峰?为什么人类要登月?………我选择去折......
  • C语言中指针和数组的相互关系
    在C语言中,指针和数组有着紧密的相互关系。数组是数据的集合,而指针则是一个包含内存地址的变量。指针可以用来访问数组的元素,便于高效的内存访问和操作。更具体来说,数组名本身就是一个指向首元素的指针、通过指针运算,我们可以遍历数组的每个元素、数组和指针的索引操作是等价的、......
  • 感人电影-521我爱你 PSVita+Switch+Windows+Mac移植版
    游戏名称:感人电影-521我爱你游戏类型:文字冒险游戏原发售平台:J2ME开发商:F23发布日期:2010/01/03原游戏简介:感人电影-521我爱你最新感动人的科技!是人看了都要哭!超越生死的爱情,用电话联系起来的男女主角命运,让你有意想不到的结局。让你看后更珍惜所爱的人!Renpy技术支持:你们亲......