用我们方言说就是类似“骡子冲”的游戏,游戏双方各拿一定数目的扑克牌,每次每个人打一张牌,排成一列。如果打出的牌有一样的,那么这两张牌(包括这两张牌),全部按顺序拿到打出第二张相同牌的玩家手中,且放在手中牌底。最后,谁先把牌打完,谁输。

思路:

  • 将出牌双方看成两个队列,将桌子看成栈。
  • 队列中,一个变量依次增加表示打出第几张牌,第二个变量表示经手的牌的总数(包括打出和拿到的),使用容器保存手中的牌。
  • 栈中,一个变量表示桌子上牌的数量-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++)的更多相关文章

  1. JAVA collection集合之 扑克牌游戏

    主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...

  2. 扑克牌游戏-华为OJ-C++实现

    /*扑克牌游戏大家应该都比較熟悉了.一副牌由54张组成,含3~A.2各4张,小王1张.大王1张.牌面从小到大用例如以下字符和字符串表示(当中.小写joker表示小王,大写JOKER表示大王): 3 4 ...

  3. 【Nodejs】“快算24”扑克牌游戏算法 1.02

    快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...

  4. 【Nodejs】“快算24”扑克牌游戏算法

    算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...

  5. 测开之路四十九:用Django实现扑克牌游戏

    用Django实现和之前flask一样的扑克牌游戏 项目结构 html <!DOCTYPE html><html lang="en"><head> ...

  6. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)

    Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...

  7. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)

    Hey! Hope you had a great day so far! 今天想和大家讨论的是一道我从这学期cs的期末考试得到灵感的题:Get 24 Poker Game.说到 Get 24 Pok ...

  8. 24点扑克牌游戏——(含java源码)(GUI实现)

    给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ...

  9. 【Nodejs】“快算24”扑克牌游戏算法 1.01

    考虑到1.00版本需要改源码变更四个数字,这版修改了一下变成控制台输入了. 先把两个数四则运算得到结果想清楚就是C2代码,三个数就是C3,四个数就是C4.简单的代码简单,却是复杂的基础:复杂的脱胎于简 ...

随机推荐

  1. TestNG入门

    在Eclipse中安装TestNG 打开Eclipse   Help ->Install New Software ,   然后Add   "http://beust.com/ecli ...

  2. C#获取WINDOWS系统信息

    需引用System.Management命名空间, 具体代码如下: public class SysProp { public SysProp() { ManagementObjectSearcher ...

  3. MongoDB 分片2

    mongodb 在windows下面进行分片 mongodb 更新很快,在做分片的时候,查找了不少文章,但是很多已经过时了.现在把我搭建的过程及命令分享给大家.我用的是最新版本windows版3.4. ...

  4. 正经学C#_布尔运算[布尔值与其布尔运算符]:《c#入门经典》

    前面几个章节简述了 C#中得常用得算术运算符.这一章节说布尔值与其布尔运算符. 布尔值在c#中表示方式是 bool类型,这个类型可以储存两个值,true或者false,或者真或者假,可以说0或者1. ...

  5. MySQL的ODBC安装错误问题!

    MySQL的ODBC安装时候可能会出错,主要原因是缺少VC支持库,需要2010版本的VC支持库!!X86和X64分别对应MySQL对应的ODBC,不能安装一个两个都搞定,如果需要安装两个ODBC驱动, ...

  6. Python中的可迭代对象

      Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...

  7. select和epoll原理和区别

    对于select和poll,其主要原理跟epoll不同 poll和select的共同点就是,对全部指定设备(fd)都做一次poll,当然这往往都是还没有就绪的,那就会通过回调函数把当前进程注册到设备的 ...

  8. Spring注解实现定时功能以及Quartz定时器

    一:Spring注解实现--------->Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz 1:maven配置: <!-- quartz--> <d ...

  9. mybatis和返回

    1.查询int 数组 dao类: public List<Integer> queryRoleIdList(Integer userId); service类: List<Integ ...

  10. Visible Ops

    Link:http://www.wikisummaries.org/Visible_Ops Contents [hide]  1 What is ITIL? 2 Introduction 3 Phas ...