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

// 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;
}