One By One扑克牌游戏(C++)
用我们方言说就是类似“骡子冲”的游戏,游戏双方各拿一定数目的扑克牌,每次每个人打一张牌,排成一列。如果打出的牌有一样的,那么这两张牌(包括这两张牌),全部按顺序拿到打出第二张相同牌的玩家手中,且放在手中牌底。最后,谁先把牌打完,谁输。
思路:
- 将出牌双方看成两个队列,将桌子看成栈。
- 队列中,一个变量依次增加表示打出第几张牌,第二个变量表示经手的牌的总数(包括打出和拿到的),使用容器保存手中的牌。
- 栈中,一个变量表示桌子上牌的数量-1(top),使用容器储存牌,top访问。
- 在主函数中,创建一个容器用于标记全部牌的数量,传入到游戏进行函数中。
注意C++版本的栈(桌子)因为牌数量的变化,添加打出的牌的方式也会不同,下标添加或者push_back()。
#include <iostream>
#include <vector>
#include <ctime> using namespace std; struct poker {
vector<int> data;//储存手中的牌
int ShCard;//表示打出的第几张牌
int ReCard;//表示经手的牌的总数
}; struct tack {
vector<int> data;//储存桌面上的牌
int pop;//表示栈顶
}; void Game(poker *val, tack *sal, vector<int> &vec) {
int temp = val->data[val->ShCard];
if (vec[temp] == ) {//当打出的牌在桌面上不存在
++(val->ShCard);//下次出牌序列加一
++(sal->pop);//桌面上的牌加一,对尾向后移动
if (sal->pop >= static_cast<int>(sal->data.size()))//因为桌面上的牌,存在被收走或是增加,所以需要判断
sal->data.push_back(temp);
else
sal->data[sal->pop] = temp;
vec[temp] = ;//标记牌面
}
else {//当打出的牌在桌面上存在
++(val->ShCard);
val->data.push_back(temp);//将牌收回到手牌尾部
++(val->ReCard);//经手手牌总数加一
while (sal->data[sal->pop] != temp) {//循环拿取桌面上的牌,直到再次遇到和打出牌,牌面相同的牌
vec[sal->data[sal->pop]] = ;//标记清零
val->data.push_back(sal->data[sal->pop]);//桌面拿牌
--(sal->pop);//桌面队尾前移
++(val->ReCard);//经手手牌总数加一
}
//最后一张需要拿的牌,和打出牌牌面相同的牌
vec[sal->data[sal->pop]] = ;
val->data.push_back(sal->data[sal->pop]);
--(sal->pop);
++(val->ReCard);
}
}
//输出牌面信息函数
void Display(poker *Value) {
for (int i = Value->ShCard; i < Value->ReCard; ++i) {
cout << Value->data[i] << " ";
}
cout << endl;
} int main()
{
int n = ;
vector<int> arr(, );
poker p1, p2;
tack t;
t.pop = -;
p1.ReCard = ; p1.ShCard = ;
p2.ReCard = ; p2.ShCard = ; srand((unsigned)time(NULL)); for (int i = ; i < ; ++i) {//初始化,随机拿牌8张
int temp = rand() % + ;
p1.data.push_back(temp);
++(p1.ReCard);
}
for (int i = ; i < ; ++i) {
int temp = rand() % + ;
p2.data.push_back(temp);
++(p2.ReCard);
} cout << "刚开始时,David和Jack的牌:" << endl;
Display(&p1);
Display(&p2); while (p1.ReCard > p1.ShCard && p2.ReCard > p2.ShCard) {
/*循环判断的条件是,一个可以想象队头和队尾,ShCard队头,ReCard队尾,打出一张牌
队头加一,表示下次打出下一张牌,获得一张牌,队尾后移加一,表示经手牌总数加一,
当两者相同,表示将手中的牌打完。
*/
Game(&p1, &t, arr);
Game(&p2, &t, arr);
//输出牌面信息
cout << "第" << n << "轮" << endl;
cout << "David手中的牌:";
Display(&p1);
cout << "Jack手中的牌:";
Display(&p2);
++n;
cout << "桌上的牌:";
for (int i = ; i <= t.pop; ++i) {
cout << t.data[i] << " ";
}
cout << endl; cout << endl;
}
if (p2.ShCard == p2.ReCard) {
cout << "David赢!" << endl;
cout << "手中还有" << p1.ReCard - p1.ShCard << "张牌" << endl;
}
else {
cout << "Jack赢!" << endl;
cout << "手中还有" << p2.ReCard - p2.ShCard << "张牌" << endl;
}
system("PAUSE");
return ;
}
One By One扑克牌游戏(C++)的更多相关文章
- JAVA collection集合之 扑克牌游戏
主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...
- 扑克牌游戏-华为OJ-C++实现
/*扑克牌游戏大家应该都比較熟悉了.一副牌由54张组成,含3~A.2各4张,小王1张.大王1张.牌面从小到大用例如以下字符和字符串表示(当中.小写joker表示小王,大写JOKER表示大王): 3 4 ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.02
快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...
- 【Nodejs】“快算24”扑克牌游戏算法
算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...
- 测开之路四十九:用Django实现扑克牌游戏
用Django实现和之前flask一样的扑克牌游戏 项目结构 html <!DOCTYPE html><html lang="en"><head> ...
- python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)
Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...
- python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)
Hey! Hope you had a great day so far! 今天想和大家讨论的是一道我从这学期cs的期末考试得到灵感的题:Get 24 Poker Game.说到 Get 24 Pok ...
- 24点扑克牌游戏——(含java源码)(GUI实现)
给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.01
考虑到1.00版本需要改源码变更四个数字,这版修改了一下变成控制台输入了. 先把两个数四则运算得到结果想清楚就是C2代码,三个数就是C3,四个数就是C4.简单的代码简单,却是复杂的基础:复杂的脱胎于简 ...
随机推荐
- iTween插件使用
itween插件 itween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.用它可以轻松实现各种动画,晃动,旋转,移动.褪色.上色.控制音频等. iTween原理: itween的核心是 ...
- Java实现终止线程池中正在运行的定时任务
源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...
- oracle sql 字段行转列
数据库中原先如图: 现在要吧WHMM行转列: conncect by用于确定列的个数
- 如何在页面中使用svg图标
1.svg图标长啥样 注意:图标的宽高无所谓,使用时可以根据需求修改,fill后面是颜色的填充,可修改图标颜色. <svg viewBox="0 0 1024 1024" v ...
- oracle 多表连接查询 join(一)
一.简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...
- xshell学习笔记
$0:当前Shell程序的文件名dirname $0,获取当前Shell程序的路径cd `dirname $0`,进入当前Shell程序的目录 echo "hvkjvk" > ...
- poj2406 Power Strings(kmp)
poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...
- vue脚手架的搭建
另一博客地址:https://segmentfault.com/a/1190000016451376 一.基础的知识 1.html 2.js 3.css二.搭建项目过程--windows系统1.nod ...
- python学习过程(四)
上节我们说了怎么从一个网页中获取所有的a标签,包括a标签的文本和a标签的url,以及最后经过整理,直接从网页中获取key-value键值对,也就是标签:url这种形式. 例如 : 百度: http:/ ...
- windows mysql导入sql文件
当需要的sql文件很大时(>200M)怎么办?答:修改my.ini文件,max_allowed_packet的值可以设置为1024M 进入mysql.exe目录下,执行如下命令: mysql - ...