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

思路:

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

    一.配置JDBC环境:先下载驱动jar包 1.配置classpath环境变量  如(E:\jdbc\mysql-connector-java-5.1.7-bin.jar) 2.数据库URL: 2.1 ...

  2. dojo1.7 加载器

    原文地址:http://dojotoolkit.org/documentation/tutorials/1.7/modules/ dojo现在支持在异步模块异步(AMD)定义中加入模块写入功能了,这使 ...

  3. android报错:org.ksoap2.SoapFault cannot be cast to org.ksoap2.serialization.SoapObject

    今天在写一个webservice时一直报错,报Caused by: java.lang.ClassCastException: org.ksoap2.SoapFault cannot be cast ...

  4. oracle 逻辑体系结构详解

    以前对数据库的了解大多数是集中在mysql,最近工作里面一直使用的是oracle,虽然说在互联网行业mysql大行其道,但是一些传统行业或者是金融领域还是更加倾向于使用oracle,sqlserver ...

  5. java24种设计模式

    一.设计模式定义 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. ...

  6. SingleClass单例类

    前言 对于一个单例类,无论初始化单例对象多少次,在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放,并且该对象是全局的,能够被整个系统访问到. 在应用这个模 ...

  7. poj1222(枚举or高斯消元解mod2方程组)

    题目链接: http://poj.org/problem?id=1222 题意: 有一个 5 * 6 的初始矩阵, 1 表示一个亮灯泡, 0 表示一个不亮的灯泡. 对 (i, j) 位置进行一次操作则 ...

  8. 13、OpenCV Python canny边缘提取

    __author__ = "WSX" import cv2 as cv import numpy as np def lapalian_demo(image): #拉普拉斯算子 # ...

  9. P4196 [CQOI2006]凸多边形 半平面交

    \(\color{#0066ff}{题目描述}\) 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. \(\color{#0066f ...

  10. P2948 [USACO09OPEN]滑雪课Ski Lessons

    题意:Bessie去滑雪,限时T,滑雪场有S节课 每节课开始于$m_i$,长度为$l_i$,可以将Bessie的能力值变成$a_i$(注意是变成不是增加) 有n个滑雪坡,去滑雪需要$c_i$的能力,并 ...