博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
One By One扑克牌游戏(C++)
阅读量:4322 次
发布时间:2019-06-06

本文共 2818 字,大约阅读时间需要 9 分钟。

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

 

思路:

  • 将出牌双方看成两个队列,将桌子看成栈。
  • 队列中,一个变量依次增加表示打出第几张牌,第二个变量表示经手的牌的总数(包括打出和拿到的),使用容器保存手中的牌。
  • 栈中,一个变量表示桌子上牌的数量-1(top),使用容器储存牌,top访问。
  • 在主函数中,创建一个容器用于标记全部牌的数量,传入到游戏进行函数中。

注意C++版本的栈(桌子)因为牌数量的变化,添加打出的牌的方式也会不同,下标添加或者push_back()。

#include 
#include
#include
using namespace std;struct poker { vector
data;//储存手中的牌 int ShCard;//表示打出的第几张牌 int ReCard;//表示经手的牌的总数};struct tack { vector
data;//储存桌面上的牌 int pop;//表示栈顶};void Game(poker *val, tack *sal, vector
&vec) { int temp = val->data[val->ShCard]; if (vec[temp] == 0) { //当打出的牌在桌面上不存在 ++(val->ShCard);//下次出牌序列加一 ++(sal->pop);//桌面上的牌加一,对尾向后移动 if (sal->pop >= static_cast
(sal->data.size()))//因为桌面上的牌,存在被收走或是增加,所以需要判断 sal->data.push_back(temp); else sal->data[sal->pop] = temp; vec[temp] = 1;//标记牌面 } else { //当打出的牌在桌面上存在 ++(val->ShCard); val->data.push_back(temp);//将牌收回到手牌尾部 ++(val->ReCard);//经手手牌总数加一 while (sal->data[sal->pop] != temp) { //循环拿取桌面上的牌,直到再次遇到和打出牌,牌面相同的牌 vec[sal->data[sal->pop]] = 0;//标记清零 val->data.push_back(sal->data[sal->pop]);//桌面拿牌 --(sal->pop);//桌面队尾前移 ++(val->ReCard);//经手手牌总数加一 } //最后一张需要拿的牌,和打出牌牌面相同的牌 vec[sal->data[sal->pop]] = 0; 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 = 1; vector
arr(16, 0); poker p1, p2; tack t; t.pop = -1; p1.ReCard = 0; p1.ShCard = 0; p2.ReCard = 0; p2.ShCard = 0; srand((unsigned)time(NULL)); for (int i = 0; i < 8; ++i) { //初始化,随机拿牌8张 int temp = rand() % 13 + 1; p1.data.push_back(temp); ++(p1.ReCard); } for (int i = 0; i < 8; ++i) { int temp = rand() % 13 + 1; 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 = 0; 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 0;}

 

转载于:https://www.cnblogs.com/Mayfly-nymph/p/10198182.html

你可能感兴趣的文章
seL4环境配置
查看>>
Git报错:insufficient permission for adding an object to repository database .git/objects
查看>>
ajax跨域,携带cookie
查看>>
BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
查看>>
洛谷 CF937A Olympiad
查看>>
Codeforces Round #445 C. Petya and Catacombs【思维/题意】
查看>>
用MATLAB同时作多幅图
查看>>
python中map的排序以及取出map中取最大最小值
查看>>
ROR 第一章 从零到部署--第一个程序
查看>>
<form>标签
查看>>
vue去掉地址栏# 方法
查看>>
Lambda03 方法引用、类型判断、变量引用
查看>>
was集群下基于接口分布式架构和开发经验谈
查看>>
MySQL学习——MySQL数据库概述与基础
查看>>
ES索引模板
查看>>
HDU2112 HDU Today 最短路+字符串哈希
查看>>
JPanel重绘
查看>>
图片放大器——wpf
查看>>
SCALA STEP BY STEP
查看>>
cocos2d-x学习笔记
查看>>