- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在初学者 C++ 类(class)中,我正在尝试构建一个 Yahtzee 游戏,用户可以在该游戏中掷骰子,希望所有五个骰子都获得相同的数字。我们需要尝试握住弹出次数最多的骰子(例如,我们掷出“4 5 3 3 1”,我想握住一个 3,以便它在整个游戏中保持不变)然后再次掷出以继续尝试获得所有五个骰子都一样。这是我目前所拥有的:
#include <iostream>
using namespace std;
void choiceRoll(){
int num;
int dice1 = rand()%6+1;
int dice2 = rand()%6+1;
int dice3 = rand()%6+1;
int dice4 = rand()%6+1;
int dice5 = rand()%6+1;
cout << "Your roll is: " << dice1 << " " << dice2 << " " << dice3
<< " " << dice4 << " " << dice5 << endl;
}
int main() {
srand(time(NULL));
int dice1 = rand()%6+1;
int dice2 = rand()%6+1;
int dice3 = rand()%6+1;
int dice4 = rand()%6+1;
int dice5 = rand()%6+1;
int x;
int num;
char play;
cout << "Let's play some Yahtzee!" << endl;
choiceRoll();
while(x<1){
cout << "Which number do you want to hold?";
cin >> num;
if (num>=1 and num<=6)
choiceRoll();
else{
cout << "Thanks for playing!";
}
}
if (dice1=dice2=dice3=dice4=dice5){
cout << "YAHTZEE!!!!" << endl;
}
return 0;
}
任何人都可以帮助我能够让用户输入保持一定的数字并能够继续滚动直到所有数字都相同吗?
最佳答案
我的灵感来自于一些 c++17 的新鲜感。开始了:
#include <algorithm>
#include <array>
#include <cassert>
#include <iostream>
#include <iomanip>
#include <map>
#include <random>
#include <string>
#include <string_view>
using namespace std;
using Score = size_t;
namespace {
enum class face : Score { one=1, two, three, four, five, six, _hide=0 };
ostream& operator<<(ostream& os, face f) {
switch(f) {
case face::one: return os << "⚀";
case face::two: return os << "⚁";
case face::three: return os << "⚂";
case face::four: return os << "⚃";
case face::five: return os << "⚄";
case face::six: return os << "⚅";
case face::_hide: default: return os << ".";
}
}
face roll_one() {
static mt19937 e { random_device{}() };
static uniform_int_distribution<Score> dist(Score(face::one), Score(face::six));
return face{dist(e)};
}
}
template <size_t... I>
struct hand_impl {
static constexpr size_t N = sizeof...(I);
private:
static_assert(is_same_v<index_sequence<I...>, make_index_sequence<N> >, "this hack merely enables fold expressions");
using dice_t = array<face, N>;
using selection_t = array<bool, N>;
dice_t faces;
selection_t held = {};
public:
hand_impl() {
generate_n(faces.begin(), N, roll_one);
}
void hold_highest() {
held = matching(max({faces[I]...}));
}
void reroll() {
faces = {{ (held[I]? faces[I] : roll_one())... }};
}
enum class method { upper_box, _3_of_a_kind, _4_of_a_kind, full_house,
small_straight, large_straight, yahtzee, chance };
struct candidate_t {
dice_t faces;
selection_t key;
method how;
};
friend size_t score(candidate_t c) {
// fixed
switch(c.how) {
case method::full_house: return 25;
case method::small_straight: return 30;
case method::large_straight: return 40;
case method::yahtzee: return 50;
default: break;
}
// depending on face values
size_t all_values[] = { Score(c.faces[I])... };
switch(c.how) {
case method::upper_box: return ((c.key[I]? all_values[I] : 0) + ...);
case method::_3_of_a_kind:
case method::_4_of_a_kind:
case method::chance: return (all_values[I] + ...);
default: throw runtime_error("illegal move");
}
}
auto generate() const {
vector<candidate_t> result;
result.push_back({ faces, all(), method::chance });
// equal groups
for (face f : {face::one, face::two, face::three, face::four, face::five, face::six}) {
auto m = matching(f);
auto n = cardinality(m);
if (n) result.push_back({ faces, m, method::upper_box });
if (n==5) result.push_back({ faces, m, method::yahtzee });
if (n>=4) {
if (n>4) *find(begin(m), end(m), true) = false; // discard one
result.push_back({ faces, m, method::_4_of_a_kind });
}
if (n>=3) {
if (n>3) *find(begin(m), end(m), true) = false; // discard one
result.push_back({ faces, m, method::_3_of_a_kind });
// look at remaining two
dice_t other {{ (m[I]? face::_hide : faces[I])... }};
sort(begin(other), end(other));
// if they match, it's also a full house
if (other[0] == other[1])
result.push_back({ faces, m, method::full_house });
}
}
{
// straights (increasing series)
auto inorder = faces;
sort(begin(inorder), end(inorder), greater<>{}); // favour the higher values
auto decreasing_at = [&](size_t i) {
return Score(inorder[i]) == 1 + Score(inorder[(i+1) % N])? 'y':'n';
};
char const s[] = { decreasing_at(I)... };
if (auto where = string_view(s).find("yyyy"); where != string_view::npos)
result.push_back({ inorder, selection_t { (I>=where && I<where+4)... }, method::large_straight });
if (auto where = string_view(s).find("yyy"); where != string_view::npos)
result.push_back({ inorder, selection_t { (I>=where && I<where+3)... }, method::small_straight });
}
return result;
}
private:
static selection_t all() { return { (void(I), true)... }; }
selection_t matching(face f) const {
return { (faces[I] == f)... };
}
static size_t cardinality(selection_t s) {
return count(begin(s), end(s), true);
}
template <size_t Index>
static ostream& print_held(ostream& os, dice_t faces, selection_t held) {
return os << faces[Index] << (held[Index]? "\xCC\xB2":"");
}
template <size_t Index>
static ostream& print_key_dice(ostream& os, dice_t faces, selection_t key) {
return os << (key[Index]? faces[Index] : face::_hide);
}
friend ostream& operator<<(ostream& os, hand_impl h) {
return (print_held<I>(os, h.faces, h.held), ...);
}
friend ostream& operator<<(ostream& os, candidate_t const& c) {
struct R { ostream& os; ios::fmtflags kept; ~R() { os.flags(kept); } } keep { os, os.flags() };
os << "[" << left << setw(15) << c.how << "] ";
return (print_key_dice<I>(os, c.faces, c.key), ...);
}
friend ostream& operator<<(ostream& os, method m) {
switch(m) {
case method::upper_box: return os << "upper box";
case method::_3_of_a_kind: return os << "three of a kind";
case method::_4_of_a_kind: return os << "four of a kind";
case method::full_house: return os << "full house";
case method::small_straight: return os << "small straight";
case method::large_straight: return os << "large straight";
case method::yahtzee: return os << "yahtzee";
case method::chance: return os << "chance";
}
return os << "[no score]";
}
};
template <size_t... I> hand_impl<I...> make_hand_helper(index_sequence<I...>) { return {}; }
template <size_t N = 5> auto make_hand() { return make_hand_helper(make_index_sequence<N>{}); }
template <size_t N = 5> using hand = decltype(make_hand<N>());
using Yahtzee = hand<>;
int main() {
Yahtzee hand = make_hand();
auto rolls = 3;
do {
hand.hold_highest();
cout << hand << "\n";
multimap<Score, Yahtzee::candidate_t, greater<> > ranked;
for (auto c : hand.generate())
ranked.emplace(score(c), c);
for (auto&& [score, c] : ranked)
cout << setw(2) << score << " - " << c << "\n";
hand.reroll();
} while (--rolls);
}
打印
⚁⚄⚅̲⚃⚂ ¹
40 - [large straight ] ⚅⚄⚃⚂.
30 - [small straight ] ⚅⚄⚃..
20 - [chance ] ⚁⚄⚅⚃⚂
6 - [upper box ] ..⚅..
5 - [upper box ] .⚄...
4 - [upper box ] ...⚃.
3 - [upper box ] ....⚂
2 - [upper box ] ⚁....
⚃⚃⚅̲⚅̲⚁ ¹
22 - [chance ] ⚃⚃⚅⚅⚁
12 - [upper box ] ..⚅⚅.
8 - [upper box ] ⚃⚃...
2 - [upper box ] ....⚁
⚅̲⚅̲⚅̲⚅̲⚂ ¹
27 - [chance ] ⚅⚅⚅⚅⚂
27 - [four of a kind ] ⚅⚅⚅⚅.
27 - [three of a kind] .⚅⚅⚅.
25 - [full house ] .⚅⚅⚅.
24 - [upper box ] ⚅⚅⚅⚅.
3 - [upper box ] ....⚂
关于c++ - (作业)尝试用 C++ 制作 Yahtzee 游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46897687/
我希望使用 API 根据处理 Q 的大小更改运行的 Web 作业实例的数量,我知道我可以在门户中设置规则,但最短聚合时间为 60 分钟,并且我如果我们突然遇到大量工作,不希望系统在扩展之前等待 60
假设我有一个 spark 应用程序并且有两个操作导致两个 spark 作业。 //spark Application //Spark Job1 .... erro
大家好! 作为我对Java的自学的一部分,我正在尝试完成可用的Java初学者分配之一here(非常古老的东西-2001) 问题是我不知道如何应对这个挑战:(我将不胜感激任何建议,因为该解决方案不再可用
我一直在使用 HADOOP 1.2.1 服务器,并在那里执行许多 pig 作业。最近,我考虑将我的 Hadoop 服务器更改为 HADOOP 2.2.0。所以我在 HADOOP 2.2.0 中尝试了一
好的,我修复了静态错误。现在我只是想找出为什么每个对象都得到相同的条目(即相同的名字、年龄、体重等)。这是代码: package classlab3b; import classlab3B.BodyM
我的家庭作业中的一个问题需要一些帮助,我已经尝试了大约一个小时,但无法运行。 列出购买商品数量超过每位顾客平均商品数量的顾客 表格如下: Customer(Cnum, CustomerName, Ad
Kubernetes Jobs重复创建 Pod,直到指定数量的容器成功终止。作业通常与更高级别的CronJob机制一起使用,该机制会按循环计划自动启动新作业。 定期使用 Jobs 和 CronJobs
我有以下工作类(我已经删除了实际的工作代码): @On("0 0 1 * * ?") public class DailyJob extends Job { @Override pub
假设您将 cron 作业配置为每分钟运行一次以做某事。如果实际任务运行时间超过一分钟会发生什么? cron 会创建另一个作业实例/线程吗?还是 cron 会等待并确保上一次运行完成? 谢谢! 最佳答案
我们正在使用 TeamCity 7 并想知道是否可以仅在前一个步骤失败时才运行步骤?我们在构建步骤配置中的选项让您可以选择仅在所有步骤都成功时执行,即使步骤失败,或者始终运行它。 有没有办法仅在前一个
我在 oracle 中编写作业以执行存储过程,但是当时机成熟时,它不会无缘无故地发生任何事情。 是否有某种日志可以让我查看是否发生了错误或其他事情? 我使用 dbms_job 包来创建作业 恩克斯。
我正在用 Java 创建一个用于文件共享的 p2p 应用程序。每个对等节点都将在我的机器上的不同端口上运行并监听请求。但我遇到的问题是,当创建 PeerNode 实例时,我的代码会进入无限循环。以下是
我正在尝试创建一个队列,但当我运行 php artisanqueue:work 时它不起作用,我在终端中得到的只是 [2017-11-30 19:56:27] Processing: App\Jobs
我正在使用PHP库phpseclib0.2.2将SSH自动化到我的一台服务器中。我将其设置为每5分钟运行一次的cron任务。 在设置完它并确保其运行等情况下注销后,我看到了以下内容: $ logout
有没有办法获取多分支管道作业扫描收集到的所有分支的名称? 我想设置一个依赖于现有构建作业的夜间构建,因此需要检查多分支作业是否包含某些特定分支。另一种方法是检查现有作业。 最佳答案 我通过使用 Jen
我在编程方面还很陌生,我不太确定如何完成分配给我的学校作业。 Write a function void print_min(unsigned char a, short b,int c),which
我的作业有问题,需要帮助! 问题 1: 完成下面的 Java 方法,以便 raiseToPower(x,n) 将数字 x 提高到整数 n 次方(即计算值 xn )。请记住 x-n = 1/xn,x0
我正在做一项家庭作业,该作业有四个文本字段和一个文本区域,以及一个将文本字段和文本区域保存到文本文件的按钮,每行一个元素。然后,应出现一个对话框通知用户文件已保存。当对话框关闭时,它应该清空文本字段和
我需要运行一个名为ArrayHolder的java程序,它将运行两个线程。 ArrayHolder 将有一个 Array。 ThreadSeven 会用 7 覆盖该 Array 的每个元素,并用 1
在我的程序中,应该读取学生姓名、ID 号和 GPA,将其分配给指定的学生,然后打印出来。一切都编译正常,但出现错误 Error: Could not find or load main class L
我是一名优秀的程序员,十分优秀!