C语言实现21点游戏【单人模式,双人模式,单-多电脑模式】,21点又名黑杰克(英文:Blackjack)

项目背景:

21点又名黑杰克(英文:Blackjack) ,起源于法国,已流传到世界各地。21点,是一种使用扑克牌玩的赌博游戏。亦是唯一一种在赌场中可以在概率中战胜庄家的一种赌博游戏。

现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代。该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。有着悠久的历史。

项目功能:

简易21点游戏:
21点又名黑杰克( Blackjack )起源于法国,已流传到世界各地,有着悠久的历史。该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。21点一般用到1 -8副牌。大家手中扑克点数的计算是: 2至9牌,按其原点数计算; K、Q、J和
10牌都算作10点(一般记作T,即ten之意) ; A牌(ace)既可算作1点也可算作11点,由玩家自己
决定( 当玩家停牌时,点数-律视为最大而尽量不爆,如A+9为20,A+4+8为13, A+3+A视为15)。
简易规则:玩家电脑各发2张牌,玩家两张牌均为明牌,电脑一明一暗;玩家电脑轮流要牌(都为明牌),也可以选择停牌,当某一方点数为21点时则直接获胜,超过21点则直接淘汰;当各方都选择停牌时,则计算各方点数,点数大者获胜。

我这里实现的有:

1.单人模式

2.单人-电脑模式

3.单人-多电脑模式

项目部分代码展示【完整源码在最后】:

结构体及一些数据:

typedef struct
{
	char name[4];  // 牌的名称
	int point;     // 牌的点值
	int take;      // 初始为0,拿过这张牌了,就设置成1 
} Card;

typedef struct
{
	char name[4];//牌的名称
	int point;//牌的点值
} Hand;//手牌
Card deck[NUM_DECKS][52];//总共不同花色,A-K 52张牌,最多8副牌
int n;//多少副牌 
int m;//电脑玩家有多少个 

随机生成牌:

void randPutCard(int nums[]) //随机生成2个数,第一个代表是哪副牌,第二个代表那副牌里的哪张牌 
{
	int i;
	// 生成2个随机数字
	nums[0] = rand() % n;//n副牌 
	nums[1] = rand() % 52;//一副里有52张牌 
	if (deck[nums[0]][nums[1]].take == 1) {//这张牌已经拿过了,重新生成随机数 
		randPutCard(nums);
	}
	else {
		deck[nums[0]][nums[1]].take == 1;//没拿过,拿这张牌,现在设为1代表现在拿了 
		return;
	}
}

点数计算:

int CalcPoints(Hand hand[], int handNum) //点数计算
{
	int i;
	int points = 0;//记录计算的点数 
	int num_aces = 0;//记录A的数量 
	for (i = 0; i < handNum; i++) {
		if (hand[i].point >= 2 && hand[i].point <= 10) {//2-k加对应点数 
			points += hand[i].point;
		}
		else if (hand[i].point == 1) {//如果是1的话,也就是A 
			num_aces++;//A的数量+1 
			points += 1;//点数先+1 
		}
	}
	for (i = 0; i < num_aces; i++) {//循环A的数量 
		if (points + 10 <= 21) {//如果让当前的A等于11,还没爆,就让这个A等于11 
			points += 10;//因为前面A已经让点数先+1了,所以这里只需要再+10 
		}
	}
	return points;//返回点数 
}

发牌函数:

int takeCard(Hand hand[], int handNum, int flag) {//发牌函数,暂时这里只用在了玩家多电脑模式,函数返回的是手牌数量 
	int nums[2];
	int iRand, jRand;
	if (flag == 0) {
		printf("正在为玩家发牌...\n");
		randPutCard(nums);//生成2个随机数
		iRand = nums[0], jRand = nums[1];//iRand决定是哪副牌,jRand决定拿哪张牌
		strcpy(hand[handNum].name, deck[nums[0]][nums[1]].name);//名称 
		hand[handNum].point = deck[nums[0]][nums[1]].point;//点数 
		handNum++;//玩家手牌数量+1 
		printf("发牌完毕!新的纸牌为【%s】\n\n", hand[handNum - 1].name);
	}
	else {
		printf("正在为【电脑%d】发牌...\n", flag);
		randPutCard(nums);//生成2个随机数
		iRand = nums[0], jRand = nums[1];//iRand决定是哪副牌,jRand决定拿哪张牌
		//因为电脑有一张暗牌,我这里把暗牌一直放在最后
		//先把暗牌放最后 
		strcpy(hand[handNum].name, hand[handNum - 1].name);
		hand[handNum].point = hand[handNum - 1].point;
		//再把刚要的牌放在暗牌前面 
		strcpy(hand[handNum - 1].name, deck[nums[0]][nums[1]].name);//名称 
		hand[handNum - 1].point = deck[nums[0]][nums[1]].point;//点数 
		handNum++;//手牌的数量+1 
		printf("发牌完毕!新的纸牌为【%s】\n\n", hand[handNum - 2].name);//handNum-1的索引是暗牌,所以打印handNum-2索引下的纸牌,为新发的牌 
	}
	return handNum;//将手牌数量返回 
}

项目运行:

菜单:

玩家电脑模式【其他就不展示了】:

项目地址:

code: 平时写的一些c/c++项目【开源】 - Gitee.comicon-default.png?t=N7T8https://gitee.com/yq-leisure/code/blob/master/Joker.cpp

  • 45
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来为您设计一个关于21游戏的课程设计,包括简介、教学目标、教学内容和教学过程,并附上Java代码。 ### 一、简介 21游戏,又称黑杰克,是一种非常经典的纸牌游戏。玩家需要通过抽牌的方式,让自己的牌数尽量接近21,但不能超过21。其中,A牌可以看成1或11,J、Q、K牌都算10,其他牌按照牌面数算。 本课程设计将通过Java语言,让学生掌握基本的编程思想和语法,并实现一个简21游戏。 ### 二、教学目标 1.掌握Java语言的基本语法和编程思想。 2.理解21游戏的规则和流程。 3.能够使用Java实现一个简21游戏。 ### 三、教学内容 1.Java语言基础知识:变量、数据类型、运算符、流程控制等。 2.21游戏的规则和流程。 3.Java编程实践:如何使用Java实现一个简21游戏。 ### 四、教学过程 #### 第一步:介绍21游戏 1.简要介绍21游戏的规则和流程。 2.让学生理解21游戏的玩法和胜负条件。 #### 第二步:讲解Java语言基础知识 1.变量和数据类型:让学生了解变量的定义和使用方法,以及Java语言中的数据类型。 2.运算符:讲解Java语言中的算术运算符、关系运算符、逻辑运算符等。 3.流程控制:讲解Java语言中的if语句、while循环等流程控制语句。 #### 第三步:实现21游戏 1.让学生了解21游戏的流程和规则,包括发牌、抽牌、计分等。 2.让学生设计21游戏的程序逻辑,包括生成牌、计算得分、判断胜负等。 3.让学生使用Java语言实现21游戏的程序代码。 下面是一个简21游戏的Java代码,仅供参考: ```java import java.util.Scanner; public class BlackJack { public static void main(String[] args) { Scanner input = new Scanner(System.in); int playerScore = 0; // 玩家得分 int dealerScore = 0; // 庄家得分 // 初始状态,玩家和庄家各发两张牌 for (int i = 0; i < 2; i++) { playerScore += drawCard(); dealerScore += drawCard(); } // 玩家开始抽牌 while (true) { System.out.println("你的得分是:" + playerScore); // 判断是否爆掉 if (playerScore > 21) { System.out.println("你爆了,游戏结束!"); break; } // 询问玩家是否继续抽牌 System.out.print("是否抽牌?(Y/N) "); String choice = input.nextLine(); if (choice.equalsIgnoreCase("Y")) { playerScore += drawCard(); } else if (choice.equalsIgnoreCase("N")) { break; } } // 庄家开始抽牌 while (dealerScore < 17) { System.out.println("庄家得分是:" + dealerScore); dealerScore += drawCard(); } // 判断输赢 if (dealerScore > 21) { System.out.println("庄家爆了,你赢了!"); } else if (playerScore > dealerScore) { System.out.println("你的得分是:" + playerScore); System.out.println("庄家的得分是:" + dealerScore); System.out.println("你赢了!"); } else if (playerScore == dealerScore) { System.out.println("你的得分是:" + playerScore); System.out.println("庄家的得分是:" + dealerScore); System.out.println("平局!"); } else { System.out.println("你的得分是:" + playerScore); System.out.println("庄家的得分是:" + dealerScore); System.out.println("你输了!"); } } // 抽一张牌,返回牌的数 public static int drawCard() { int[] cards = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10}; int index = (int) (Math.random() * cards.length); return cards[index]; } } ``` #### 第四步:练习和作业 1.让学生自己修改21游戏的规则,如改变牌的数、增加玩家和庄家的牌数等。 2.让学生实现其他纸牌游戏的程序代码,如斗地主、扑克牌等。 ### 五、总结 通过本课程设计,学生能够掌握Java语言的基本语法和编程思想,并实现一个简21游戏。同时,学生还能够了解纸牌游戏的规则和流程,提高编程能力和逻辑思维能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值