You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
7.0 KiB
217 lines
7.0 KiB
// UNOSimulator.cpp: 定义应用程序的入口点。
|
|
//
|
|
|
|
#include "UNOSimulator.h"
|
|
#include <print>
|
|
#include <conio.h>
|
|
using namespace UNO;
|
|
void CreateDeck_CrazyFestival(std::vector<Card>& deck) {
|
|
using std::print, std::println;
|
|
deck.reserve(400);
|
|
std::vector<CardColor> colors({ CardColor::Red,CardColor::Yellow, CardColor::Green, CardColor::Blue });
|
|
for (auto c : colors) {
|
|
deck.emplace_back(c, CardType::Normal, 0);
|
|
for (int pt = 1; pt <= 9; pt++) {
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(c, CardType::Draw, 1);
|
|
deck.emplace_back(c, CardType::Draw, 1);
|
|
deck.emplace_back(c, CardType::Draw, 1);
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Draw, 3);
|
|
deck.emplace_back(c, CardType::Draw, 3);
|
|
deck.emplace_back(c, CardType::Draw, 3);
|
|
}
|
|
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 2);
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 2);
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 2);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 4);
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 4);
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 4);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Normal, 15);
|
|
}
|
|
for (int i = 0; i < 40; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 5);
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 5);
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 5);
|
|
}
|
|
}
|
|
void CreateDeck_SuperFestival(std::vector<Card>& deck) {
|
|
using std::print, std::println;
|
|
deck.reserve(1000);
|
|
std::vector<CardColor> colors({ CardColor::Red,CardColor::Yellow, CardColor::Green, CardColor::Blue });
|
|
for (int p = 0; p < 3; p++) {
|
|
for (auto c : colors) {
|
|
deck.emplace_back(c, CardType::Normal, 0);
|
|
for (int pt = 1; pt <= 9; pt++) {
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(c, CardType::Draw, 1);
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Draw, 3);
|
|
}
|
|
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 2);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 4);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Normal, 15);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 5);
|
|
}
|
|
}
|
|
}
|
|
void CreateDeck_Festival(std::vector<Card>& deck) {
|
|
using std::print, std::println;
|
|
deck.reserve(400);
|
|
std::vector<CardColor> colors({ CardColor::Red,CardColor::Yellow, CardColor::Green, CardColor::Blue });
|
|
for (auto c : colors) {
|
|
deck.emplace_back(c, CardType::Normal, 0);
|
|
for (int pt = 1; pt <= 9; pt++) {
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(c, CardType::Draw, 1);
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Draw, 3);
|
|
}
|
|
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 2);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 4);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Normal, 15);
|
|
}
|
|
for (int i = 0; i < 8; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 5);
|
|
}
|
|
}
|
|
void CreateDeck_Normal(std::vector<Card>& deck) {
|
|
using std::print, std::println;
|
|
deck.reserve(400);
|
|
std::vector<CardColor> colors({ CardColor::Red,CardColor::Yellow, CardColor::Green, CardColor::Blue });
|
|
for (auto c : colors) {
|
|
deck.emplace_back(c, CardType::Normal, 0);
|
|
for (int pt = 1; pt <= 9; pt++) {
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
deck.emplace_back(c, CardType::Normal, pt);
|
|
}
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Draw, 2);
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Ban, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
deck.emplace_back(c, CardType::Reverse, 0);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Draw, 4);
|
|
}
|
|
for (int i = 0; i < 4; i++) {
|
|
deck.emplace_back(CardColor::Black, CardType::Normal, 15);
|
|
}
|
|
|
|
}
|
|
void Arena() {
|
|
using std::print, std::println;
|
|
std::vector<Card> deck{}, deck2{};
|
|
CreateDeck_SuperFestival(deck);
|
|
Game game(Rules::CanMatchCard_Festival);
|
|
int win[10]{}, result = 0;
|
|
for (int count = 0; count < 100000; count++) {
|
|
deck2 = deck;
|
|
game.AddPlayer<SmartCat1>("SmartCat1");
|
|
game.AddPlayer<RandomCat>("RandomCat1");
|
|
game.AddPlayer<RandomCat>("RandomCat2");
|
|
game.AddPlayer<RandomCat>("RandomCat3");
|
|
game.ReadDeck(std::move(deck2));
|
|
result = game.Launch();
|
|
win[result]++;
|
|
println("Game {} Winner = {}", count + 1, result);
|
|
game.Reset();
|
|
}
|
|
println("{:=^40}", "STAT");
|
|
println("SmartCat1 : {}",win[0]);
|
|
println("RandomCat1: {}",win[1]);
|
|
println("RandomCat2: {}",win[2]);
|
|
println("RandomCat3: {}",win[3]);
|
|
println("平局 : {}",win[4]);
|
|
return;
|
|
}
|
|
void Play() {
|
|
Game game(Rules::CanMatchCard_Festival);
|
|
game.AddPlayer<SmartCat1>("入机A");
|
|
game.AddPlayer<SmartCat1>("入机B");
|
|
game.AddPlayer<SmartCat1>("入机C");
|
|
game.AddPlayer<UserPlayer>("入");
|
|
std::vector<Card> deck{};
|
|
CreateDeck_CrazyFestival(deck);
|
|
std::println("{:=^40}", "牌堆构成");
|
|
std::println("总牌数:{}", deck.size());
|
|
for (auto& i : deck) {
|
|
std::print("{}\t", i);
|
|
}
|
|
std::println("\n按任意键开始!");
|
|
_getch();
|
|
game.ReadDeck(std::move(deck));
|
|
game.Launch(true);
|
|
|
|
}
|
|
int main(int argc, char* argv[]) {
|
|
Arena();
|
|
|
|
|
|
return 0;
|
|
}
|