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

思路:

  • 将出牌双方看成两个队列,将桌子看成栈。
  • 队列中,一个变量依次增加表示打出第几张牌,第二个变量表示经手的牌的总数(包括打出和拿到的),使用容器保存手中的牌。
  • 栈中,一个变量表示桌子上牌的数量-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. 修改Oracle游标数及排查游标问题相关SQL

    查看当前游标数show parameter open_cursors; 修改游标最大数 ; commit; 查看游标消费情况 select o.sid, osuser, machine, count( ...

  2. MVC中使用代码创建数据库(code first +mysql+EF)

    1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework.MySql.Data(6.9.12)和MySql.Data.Entity (6.9.12) 这里有几点要注意 ...

  3. [raspberry pi3] 串口线使用

    直接上图 GPIO 口说明: 串口线连接: 参考地址: http://bbs.elecfans.com/jishu_596578_1_1.html

  4. Python之‘数据结构’

    简介 数据结构基本上就是--它们是可以处理一些数据的结构.或者说,它们是用来存储一组相关数据的.在Python里面有三种内建的数据结构--列表.元组和字典. 一.列表 list是处理一组有序项目的数据 ...

  5. 前端开发快速定位bug的一些小技巧

    1,根据报错信息定位: (1) Uncaught TypeError: Cannot read property 'attr' of undefined; 此类型为变量或者对象属性未定义类型. (2) ...

  6. python3查询mysql数据

    python3不支持MySQLdb,代替的是import pymysql 连接数据库查表: import pymysqlconn= pymysql.connect( host='xx.xx.xx.xx ...

  7. Ubuntu安装SHH服务

    1.打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"--> ...

  8. 牛客寒假算法基础集训营4 B applese 走方格

    链接:https://ac.nowcoder.com/acm/contest/330/B 构造题,但是有两个特判... 1  2 2  1 然后就水了,血亏 #include<stdio.h&g ...

  9. springboot整合mybatis,redis,代码(三)

    一 说明 接着上篇讲述redis缓存配置的用法: 二 正文 首先要使用缓存就必须要开开启缓存,第二步是需要开redis-server 下载redis包之后,点击图中两个都可以开启redis 怎么看是否 ...

  10. vscode 注册表

    Windows Registry Editor Version 5.00 ; Open files [HKEY_CLASSES_ROOT\*\shell\Open with VS Code] @=&q ...