永发信息网

帮忙编一个c++程序

答案:1  悬赏:20  手机版
解决时间 2021-04-23 06:03

数组与函数

1. 实验目的:掌握数组与函数的使用方法,掌握,面向过程的程序设计方法,复习分支与循环语句的使用。

2. 实验内容:设计一个21点的游戏,游戏规则如下:

两个玩家,一个是人,一个是电脑。首先由电脑随机派两张牌给人类玩家(牌不能重复,牌的表示方式为 花色牌号,如红桃8),然后玩家通过自己判断再选择是否继续要牌。如果要,则继续随机派给玩家一张牌,若此时所有牌的点数之和大于21,则判断玩家为输,如果不是,则玩家可以继续选择要牌与否。如果不要牌,则人类玩家阶段结束。轮到电脑。电脑阶段与玩家阶段基本相同。电脑首先自己要两张牌,然后由电脑自己判断是否继续要牌,判断的最重要依据是刚好赢人类玩家就收手。而输赢是按照两家的点数与牌数,赢的一方是点数较大的一方,若点数相同,则取牌数量更多的一方胜,若牌数也一样,则不分胜负。

点数的计算方式为:不论花色(红桃,黑桃,梅花,方块),数字牌(2到10)按照数字算,A按照1来算, J,Q,K均算成0.5点。

3. 难点提示:1.由于牌是不能重复,可以把纸牌当成一个全局数组,2.细分程序为各种功能的函数,可以大致分成这几个函数:洗牌(将玩家手中的牌收回),发牌(随机发给玩家一张牌),显示牌号(将数组映射成相应的扑克牌),玩家阶段(包括发牌,要牌,判断是否超过21点了),电脑阶段,判断输赢阶段(在双方点数均不超21点的情况下)。

4. 标准输入输出:加粗加大的是输入部分

第一种情况:玩家超过21点了

玩家阶段

玩家获得牌 梅花5 方块8

是否继续要牌(y/n):y

继续要一张牌:梅花5 方块8 红桃10

玩家输了

是否继续(y/n):n

第二种情况:

玩家阶段

玩家获得牌 红桃7 方块Q

是否继续要牌(y/n):y

继续要一张牌:红桃7 方块Q 红桃3

是否继续要牌(y/n):y

继续要一张牌:红桃7 方块Q 红桃3 梅花8

是否继续要牌(y/n):n

电脑阶段

电脑获得牌 方块8 红桃4

继续要一张牌:方块8 红桃4 红桃J

继续要一张牌:方块8 红桃4 红桃J 梅花5

继续要一张牌:方块8 红桃4 红桃J 梅花5 红桃8

玩家赢了

是否继续(y/n):n

第三种情况:

玩家阶段

玩家获得牌 红桃2 黑桃Q

是否继续要牌(y/n):y

继续要一张牌:红桃2 黑桃Q 方块10

是否继续要牌(y/n):n

电脑阶段

电脑获得牌 红桃4 方块K

继续要一张牌:红桃4 方块K 红桃6

继续要一张牌:红桃4 方块K 红桃6 梅花10

玩家输了

是否继续(y/n):n

第四种情况:

玩家阶段

玩家获得牌 黑桃6 方块5

是否继续要牌(y/n):y

继续要一张牌:黑桃6 方块5 红桃9

是否继续要牌(y/n):y

继续要一张牌:黑桃6 方块5 红桃9 红桃Q

是否继续要牌(y/n):n

电脑阶段

电脑获得牌 梅花7 黑桃8

继续要一张牌:梅花7 黑桃8 黑桃A

继续要一张牌:梅花7 黑桃8 黑桃A 黑桃3

继续要一张牌:梅花7 黑桃8 黑桃A 黑桃3 黑桃2

玩家输了

是否继续(y/n):n

最佳答案

先附上图片




代码如下:



#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
using namespace std;


#include<time.h>
const float CardTotal[4][13] =
{
{1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 0.5f, 0.5f, 0.5f},
{1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 0.5f, 0.5f, 0.5f},
{1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 0.5f, 0.5f, 0.5f},
{1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 0.5f, 0.5f, 0.5f}
};


const string CardNames[4][13] =
{
{"黑桃A", "黑桃2", "黑桃3", "黑桃4", "黑桃5", "黑桃6", "黑桃7", "黑桃8", "黑桃9", "黑桃10", "黑桃J", "黑桃Q", "黑桃K"},
{"红桃A", "红桃2", "红桃3", "红桃4", "红桃5", "红桃6", "红桃7", "红桃8", "红桃9", "红桃10", "红桃J", "红桃Q", 红桃K"},
{"梅花A", "梅花2", "梅花3", "梅花4", "梅花5", "梅花6", "梅花7", "梅花8", "梅花9", "梅花10", "梅花J", "梅花Q", "梅花K"},
{"方块A", "方块2", "方块3", "方块4", "方块5", "方块6", "方块7", "方块8", "方块9", "方块10", "方块J", "方块Q", "方块K"}
};


class Card
{
public:
Card(int row = 0, int col = 0)
{
this->row = row;
this->col = col;
}
void Show()
{
cout<<CardNames[row][col]<<" ";
}
int GetRow()
{
return row;
}
int GetCol()
{
return col;
}
bool operator==(const Card& card)
{
Card temp = card;
if(row == temp.GetRow()&& col == temp.GetCol())
return true;
return false;
}
private:
int row;
int col;
};


class Player
{
public:
Player()
{
total = 0.0f;
cardnum = 0;
}
bool Die()
{
return total>21.0f;
}
float GetTotal()
{
return total;
}
int GetCardNum()
{
return cardnum;
}
void GoOn(Card card)
{
cards.push_back(card);
total += CardTotal[card.GetRow()][card.GetCol()];
cardnum ++;
}
void Show()
{
for(int i=0; i<cards.size(); i++)
cards[i].Show();
cout<<endl;
}
private:
float total;
int cardnum;
vector<Card> cards;
};


int Judge(Player p1, Player p2)
{
if(p1.GetTotal() > p2.GetTotal())
return 1;
else if(p1.GetTotal() == p2.GetTotal())
{
if(p1.GetCardNum() > p2.GetCardNum())
return 1;
else if(p1.GetCardNum() == p2.GetCardNum())
return 0;
else
return 2;
}
else
return 2;
}


void main()
{
char goon = 0;
do{
bool playerdie = false;
SYSTEMTIME curtime;
GetLocalTime(&curtime);
Player man;
Player computer;
Card curcard;
vector<Card>::iterator it;

vector<Card> AllCards;
for(int i=0; i<4; i++)
{
for(int j=0; j<13; j++)
{
Card temp(i, j);
AllCards.push_back(temp);
}
}

curcard = AllCards[(curtime.wSecond+curtime.wMilliseconds)%AllCards.size()];
man.GoOn(curcard);
for(it=AllCards.begin(); it!=AllCards.end(); it++)
{
if(*it == curcard)
AllCards.erase(it);
}
GetLocalTime(&curtime);
curcard = AllCards[(curtime.wSecond+curtime.wMilliseconds)%AllCards.size()];
man.GoOn(curcard);
for(it=AllCards.begin(); it!=AllCards.end(); it++)
{
if(*it == curcard)
AllCards.erase(it);
}

cout<<"玩家阶段"<<endl<<"玩家获得牌 ";
man.Show();
char cmd;
cout<<"是否继续(y/n)";
cin>>cmd;
while('y' == cmd)
{
GetLocalTime(&curtime);
curcard = AllCards[(curtime.wSecond+curtime.wMilliseconds)%AllCards.size()];
man.GoOn(curcard);
for(it=AllCards.begin(); it!=AllCards.end(); it++)
{
if(*it == curcard)
AllCards.erase(it);
}
if(!man.Die())
{
cout<<"继续要一张牌:";
man.Show();
cout<<"是否继续(y/n):";
cin>>cmd;
if('y' != cmd)
break;
}
else
{
man.Show();
cout<<"玩家输了"<<endl;
playerdie = true;
break;
}
}

if(!playerdie)
{
cout<<endl<<"电脑阶段"<<endl<<"电脑获得牌 ";
for(i=0; i<2; i++)
{
GetLocalTime(&curtime);
curcard = AllCards[(curtime.wSecond+curtime.wMilliseconds)%AllCards.size()];
computer.GoOn(curcard);
for(it=AllCards.begin(); it!=AllCards.end(); it++)
{
if(*it == curcard)
AllCards.erase(it);
}
}
computer.Show();
bool computerdie = false;
while(!computer.Die())
{
if(2 == Judge(computer, man))
{
cout<<"继续要一张牌:";
GetLocalTime(&curtime);
curcard = AllCards[(curtime.wSecond+curtime.wMilliseconds)%AllCards.size()];
computer.GoOn(curcard);
for(it=AllCards.begin(); it!=AllCards.end(); it++)
{
if(*it == curcard)
AllCards.erase(it);
}
computer.Show();
if(computer.Die())
{
cout<<"玩家赢了"<<endl;
computerdie = true;
break;
}
}
else if(0 == Judge(computer, man))
{
if(computer.GetTotal() < 21.0f)
continue;
else
{
cout<<"平手"<<endl;
break;
}
}
else
{
cout<<"玩家输了"<<endl;
break;
}
}
}
cout<<"是否继续(y/n):";
cin>>goon;
cout<<endl;
}while('y' == goon);
}


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
人流后什么时候来月经
谁有黑金刚手写连笔王4代驱动下载
说一个女人带刺玫瑰,是什么意思
橘红上衣配什么裤子
请问极限思想有什么作用
弟子说;吾已失其三心,恨之焉,悔之焉,愁之焉.
淮滨县万和纺织有限公司地址在哪,我要去那里
淘宝的网上银行能不能用邮政储蓄的卡
合肥出租车怎么计费,洛阳市出租车收费标准:
形容言语伤人的句子,一句话 形容对方说的话很
小区门口商铺开超市东边好还是西边好
为什么零线和火线要同时有
《虎友谜苑》 参观少林留个影(字)
下流梗不存在的灰暗世界,百度云
做防水打钉子灌浆多远距离一个最好
推荐资讯
我这里网通为什么没有1M的
怎么刷永久QQVIP会员啊
现在使用的是宇瞻捷豹战神8GB DDR3 3000双
昨日清晨牧马人是什麼歌
福顺源酒楼在哪里啊,我有事要去这个地方
爱情现代诗句经典,关于爱情的现代诗句。。。
淮安罗马迪吧的DJ开场音乐有哪些?
联华由由店在什么地方啊,我要过去处理事情
过期的食品不小心吃了,对身体有多少坏处
风行里面下载的电影(韩国的)怎么才能把它翻
QQ华夏城战秘决
好看的动漫剧场版,越多越好
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?