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.简单的代码简单,却是复杂的基础:复杂的脱胎于简 ...
随机推荐
- WebGoat系列实验Injection Flaws
WebGoat系列实验Injection Flaws Numeric SQL Injection 下列表单允许用户查看天气信息,尝试注入SQL语句显示所有天气信息. 选择一个位置的天气,如Columb ...
- 友盟让用户数据动起来——给app增加运营
让用户数据动起来——给app增加运营 一.初识友盟 友盟大家都听说过,在给app集成友盟之前对友盟的认识没有那么深刻.用了友盟之后,才发现友盟很强大. 集成友盟能够获取那些数据呢? 用户的基本信息:比 ...
- CentOS下安装配置SVN服务器并自动同步到web目录
一.安装 yum install subversion测试是否安装成功 /usr/bin/svnserve --version如提示以下内容,说明已安装成功 svnserve,版本 1.6.11 (r ...
- 用ES6的class模仿Vue写一个双向绑定
原文地址:用ES6的class模仿Vue写一个双向绑定 点击在线尝试一下 最终效果如下: 构造器(constructor) 构造一个TinyVue对象,包含基本的el,data,methods cla ...
- Python循环加强版——列表生成式
记得我们在其他语言中都学到过循环,尤其是对for循环是再熟悉不过了 比如我有一个数组 a[10]={1,2,3,4,5,6,7,8,9,10} 下面需要依次循环打印出来,C语言首先想到的是 for( ...
- iOS 11导航栏设置BarButtonItem变形问题和错位问题
升级到 iOS 11,你可能会发现你的 App 的工具栏的行为出了点异常.比如奇点,我在使用过程中,发现工具栏时灵时不灵,感觉很难点到.这是怎么回事?通过 Xcode 的 Debug View Hie ...
- CF1076C Meme Problem 数学
Try guessing the statement from this picture: You are given a non-negative integer d . You have to f ...
- [转]cron语法
最近在搞whenever时看到可以用cron语法设置定时任务.所以研究了下cron 语法. every '0 0 27-31 * *'do command "echo 'you can us ...
- 【SSO】单点登录系统
一.单点登录系统介绍 对于一个开发项目来说,每个项目都必不可少要有登录的这个功能.但是随着项目的变大,变大,再变大.系统可能会被拆分成多个小系统,咱们就拿支付宝和淘宝来说,咱们在淘宝上购物,然后就可以 ...
- MySQL安全优化
一.数据库相关 1. MySQL版本的选择 在正式生产环境中,建议使用5.6或以上系列的版本(5.7不建议,曾经用过这个版本,问题有点多). 2. 运行用户与端口的配置 2.1.确保MySQL运行用户 ...