21点双人对战和人机对战C++

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

课题背景概述

21 点扑克是牌类游戏中的比较基础游戏,其基本打法为双人共玩一副洗好的 52 张牌(大小王拿走),采用回合制比每回合输赢,直至打完一副牌算总积分决出胜负。
每回合双方轮流拿牌,每人牌数 2-5 张,每回合拿牌结束时统计两人手上牌的总点数,并裁决本回合输赢。如果轮到一方拿牌而放弃,则本回合此人不能再拿牌;如果手上牌的点数超过 21 点,则算爆。如果双方都没爆,则点数较高者获胜;如果一方爆另一方没爆,则没爆者获胜;如果双方都爆,则爆的少的人(点数超过 21 点较少者)获胜。
牌点计算方式:牌面 10、J、Q、K 均算 10 点;牌面 2-9 的点数同数字;花牌 A 既可以当 1 点用,也可以当 11 点用,具体当什么用,由持有花牌者按有利于自己的策略决定,但是计算机裁决程序总是会按最有利于持花牌者的算法自动进行点数计算。
本课题是课内上机综合实验的延续,由于课题需要基于类框架建立双人对战和人机对战的整体游戏功能,因此会对前期建立的 CBlackJack 类(实现双人对战)进行进一步规划类成员变量和成员函数,从而实现整个双人对战游戏功能;在双人对战基础上,延伸出人机对战类 CAI21,实现单人和计算机智能的博弈,显然,人机对战是人的智慧和计算机智能算法之间的比拼,良好的设计应该使得计算机的赢率至少不低于人的赢率,因此,算法设计上只有更好,没有最好,颇具挑战性。然而不用急,21 点双人对战做好,人机对战就差不多了,人机对战所需的知识其实很少,主要是一个概率算法。

数据结构

typedef enum
{
	//牌面A,J=10,Q=10,K=10
	A = 1, two, three, four, five, six, seven, eight, nine, ten, J, Q, K
}numtype;

typedef enum
{
	//扑克牌的花色:clubs(梅花),diamonds(方块),hearts(红桃)和spades(黑桃)
	clubs, diamonds, hearts, spades
}shapetype;

struct Card
{
	numtype num;//面值数字
	shapetype shape;//花色形状
};
//定义一副牌的结构体

项目结构

//声明21点的游戏类
class cblcakjack :public cporkgame
{
	//公共变量 
public:
	//函数声明
	cblcakjack();	//无参构造函数
	virtual ~cblcakjack() {};//析构函数 
	int Game();
	void Save();
	//私有变量		
private:
	int startPosition;//发牌初始位
	Card gamers[3][21];
	//gamers[0]存放庄家的牌,gamers[1]到[2]存放玩家的牌 
	//庄家即是电脑

	int numcards[8];	//庄家(numcards[0])及玩家的牌数
	char name[3][max_length];	//庄家及玩家姓名
	int numgamer;//玩家数
	int gameround; //局数
	int gamesave[20]; //保存每次结果 0 前面的玩家负 1 平局 2 胜利
	int ifTakeCard(); // 电脑是否拿牌
	int GetTotalScore(Card gamer[21], int n);	//返回目前手牌的总分值

	void ShowStatus(int num, bool hideFirstCard = false);
	//显示庄家(对应num=0)或玩家(对应num>0)的当前状态,要隐藏庄家机器人的第一次发的牌和分数 

	Card FirstCard()
	{
		return PK[startPosition++];
	}//发一张扑克牌

};

// 声明洗牌的类
class cporkgame {

public:
	Card PK[52];//54张牌减去大小王
	cporkgame();
	void Shuffle();	//洗牌函数 
};

主函数

#include"game.h"
#include"card.h"
#include"shuff.h"

//重载运算符<<
//运用了const
ostream& operator<<(ostream& output, const Card& card)
{
	//输出花色
	if (card.shape == clubs)  output << "梅花";
	if (card.shape == diamonds) output << "方块";
	if (card.shape == hearts) output << "红桃";
	if (card.shape == spades) output << "黑桃";

	//输出面值
	if (card.num == A)
	{
		output << "A";
	}
	else if (card.num == J)
	{
		output << "J";
	}
	else if (card.num == Q)
	{
		output << "Q";
	}
	else if (card.num == K)
	{
		output << "K";
	}
	else cout << (int)card.num;//强制转化面值为int型

	return output;

}

int main()
{
	char AgainGame;

	do
	{
		cblcakjack newGame;
		int gamecontinue = 1;
		while (gamecontinue <= 45)
		{
			gamecontinue = newGame.Game();
		}
		
		cout << endl << endl << "*********************游戏结束******************************";
		cout << endl << "你想再玩一次请输入1, 复盘请输入2, 输入其他内容将直接退出:";

		cin >> AgainGame;
		if (AgainGame == '2') {
			newGame.Save();
		}
		cout << endl << "***************************************************";
	} while (AgainGame == '1');
	return 0;
}

效果截图

每局游戏会将全部牌发完才结束
在这里插入图片描述
结束后可以查看复盘
在这里插入图片描述
数据同时会保存在文件里
在这里插入图片描述

c语言关于21游戏人机人人对设计及源代码 用c语言设计21游戏人人对战和人机编程以及讲解 阅读详情

相关推荐

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

/ 牌的名称int point;// 牌的值int take;// 初始为0,拿过这张牌了,就设置成1} Card;//牌的名称int point;//牌的值} Hand;//手牌//总共不同花色,A-K 52张牌,最多8副牌int n;//多少副牌int m;//电脑玩家有多少个void randPutCard(int nums[]) //随机生成2个数,第一个代表是哪副牌,第二个代表那副牌里的哪张牌int i;// 生成2个随机数字//n副牌//一副里有52张牌。

qq_63462564的博客 3573

21_21人机_electric83k_

实现人机21纸牌游戏,1v1对

c++人机

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<windows.h> #include<conio.h> #include<time.h> #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 using namespace std; st.

qi_programmer的博客 3556

C++课设】21游戏C++

二、实验内容 (1)问题描述: 21游戏,顾名思义,玩家需要通过纸牌上的数,通过继续拿牌和不要牌,来增长自己的数,当最接近21,或者等于21时,胜利;但当玩家的数超过21时,即游戏失败。利用面向对象程序设计方法以及C++的编程思想来完成设计; (2)功能要求 为了一个人也能玩游戏,需要设置一个机器人(庄家)在游戏里陪玩。 规定:J,K,Q取10,A的初始值为11(当加A超过21,则...

OrangeChenZ的博客 1万+

21游戏双人(javaweb形式)

本项目实现了一个双人在线对的web21游戏,进入页面后需要创建房间或者加入房间,等待房间存在两个人准备即可,等待双方准备完毕即可开始游戏游戏采用轮庄模式,并实时显示服务器在线人数。 本项目基于springwebsocket,首先要让所以玩家建立一个链接,即对平台,建立链接与聊天室的方式一样,才能实时信息交互!只有建立的动态链接才能进行下一步! 接下来就是房间系统!!! 先定义通过se

演绎哥的人生的博客 7170

c语言21游戏程序,C语言程序设计-21扑克牌游戏.doc

#includevoid Wait_f(int);void Pause_f();/*暂停,按任意键继续*/int Random_f(long ,long );/*返回两个参数之间的随机数*/void Replay_f(char *);/*询问是否重开一局*/void Hit_f(int *);/*发一张牌*/void Deal_f(int *,int *,int *,int *);/*双方各发两张...

weixin_32367041的博客 1550

【C#】21双人人机

实现两个人可以一起玩21游戏整体以main函数为主体,然后在黑杰克cpp文件里进行函数具体代码来被调用;在基础框架之上,后续通过各种测试,调试进行了补充。

weixin_68160004的博客 1191

21游戏

// 21游戏 分为人机战和人人对 // 玩家每次抽一张牌 牌的数为1-10随机数 谁更接近21谁就获胜 let readline = require("readline-sync"); // 清屏函数 let clear = () => process.stdout.write(process.platform === 'win32' ? '\x1Bc' ...

diaodaya5842的博客 363

C语言作业代码-21游戏黑杰克BlackJack:实C语言编程,体验经典游戏乐趣

C语言作业代码-21游戏黑杰克BlackJack:实C语言编程,体验经典游戏乐趣 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在编程学习的过程中,实践是检验真理的唯一标准。C语言作为一门基础编程语言,其逻辑性和效率性是许多高级语言的基础。今天,我们要推荐的这个项目——C语言作业代码-21游戏黑杰克(Black Jack),不仅能够帮助学习者加深对C语言的理解,...

gitblog_06726的博客 811

C语言作业代码-21游戏(黑杰克/Black Jack)

C语言作业代码-21游戏(黑杰克/Black Jack) 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了一份C语言课程作业的参考代码,主题是21游戏(也称为黑杰克/Black Jack)。该程序实现了人机对局和双人对局两种模式,适合作为C语言或C++语言学习的练习项目。 功能特色 洗牌算法:使用随机数生成牌面值,并以时间作为随机数种子,确保每次游戏牌序不...

gitblog_06760的博客 562

21联机网络游戏

熟悉socket编程。C/S模式,图形用户界面。

21游戏(黑杰克) java实现

完成一个变形版的纸牌21游戏。该游戏来源于21游戏,实现人机游戏说明如下: (1)该游戏需要两副牌,没有Joker,共104张。每张“纸牌”应具有花色与数字两个属性。 (2)游戏在机器与人类玩家之间进行。游戏一开始应先洗牌(将104张牌打乱)。 (3)机器永远是庄家,所以永远先给机器发牌,机器的牌不可见,只能看到机器要了几张牌。机器停止要牌后,再给人类玩家发牌。 (4)游戏胜利与失败的条件与普通21相同;除此以外,一方在当前牌没有爆掉的前提下,如果下一张牌使得手中有两张完全一样的牌(同数字、同花色)则立刻胜利。 (5)游戏结束时机器的牌要全部显示,并提示谁胜利了。 程序设计要求如下: (1)程序中应至少有Card类和CardGame类。 (2)Card类需要重写Object类的equals(Object o) 函数,用于比较两张牌是否完全一样;重写toString函数,用于输出牌时直接显示牌的花色与数字。 (3)CardGame类应具有shuffle(洗牌)、deal(发牌)、win(胜利判别)等函数。 (4)选择适当的java集合类来实现“发牌牌堆”和“手牌”(不允许都使用数组)。。

扑克牌21游戏C++程序

C++实现的简单21扑克游戏,可以执行。实现人机

C# 21游戏 (人机)

应付上课的一次作业,用C#简单实现了 21纸牌游戏。源码开源出来,一起共享。

双人五子棋对(需要EasyX图像库)

实训要做项目呐。天天坐在电脑面前累死了。最近题刷的少。大多数都挺水。就不挨个编辑发上来了。发发白天写的项目吧。可能好几天更一下。实训结束恢复正常。 这个游戏需要EasyX的图像库。有兴趣的可以下一个图像库运行一下玩玩~(虽然= =没LOL好玩2333333) 设计题目:双人五子棋对单机游戏 使用C语言及VC绘图库,在VC环境下,设计一个双人五子棋对单机游戏,双方各执黑白一子,黑白双方轮流...

weixin_30919919的博客 428

[游戏学习22] MFC 井字棋 双人

  &gt;_&lt;:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! &gt;_&lt;:注意这里必须用MFC和前面的Win32不一样啦! &gt;_&lt;:这也是第一次出现MFC游戏,其框架和逻辑的写法和Win32有很大的区别,建议先看一下MFC的基础再理解代码: &gt;_&lt;:TicTac.h 1 #define EX 1 ...

weixin_33860147的博客 221

java四连环游戏编程_如何用C语言实现四连环游戏(重力四子棋)?

正好我们老师也要做了这个作业!就来蹭个热闹~大概就是实现了要求的功能,然后能够自定义棋盘大小(目前是6行7列,通过修改Connect4::play()里面的对于rowNum和colNum的赋值来实现自定义棋盘大小),能够选择先手后手,能够选择人机、人人模式;可能还有没有测试出来的的bug;可能代码不是很规范;采用模式匹配的方式,给程序下棋提供一参考(其实也就是预先设计了几种优先考虑的情况)补上控...

weixin_39616416的博客 185

“深入浅出”系列之C++:100个C++开源项目

SQLiteCpp是一个对Sqlite数据库进行C++封装的开源库,代码行数约2,500行。它提供了简洁易用的接口,使得在C++项目中操作Sqlite数据库变得轻松自如。

weixin_65589140的博客 3574
上一篇: xml和xsl demo
下一篇: python对对联
todcode
博客等级 码龄7年 359粉丝 108原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值