更改SmartCat1的小逻辑错误

目前SmartCat1的胜率可以达到32%
main
Cym10x 5 months ago
parent 7628dae74e
commit e6a1b30f6f

@ -4,12 +4,12 @@
#include <chrono>
#include <thread>
using std::print,std::println;
using std::print, std::println;
namespace UNO {
void sleep(long long duration) {
std::this_thread::sleep_for(std::chrono::milliseconds(duration));
}
void Game::ReadDeck(std::vector<Card> && oDeck) {
void Game::ReadDeck(std::vector<Card>&& oDeck) {
discardDeck = oDeck;
ShuffleDeck();
}
@ -22,7 +22,8 @@ namespace UNO {
deck = std::move(discardDeck);
discardDeck.reserve(deck.size());
discardDeck.push_back(x);
} else {
}
else {
std::shuffle(discardDeck.begin(), discardDeck.end(), gen);
deck = std::move(discardDeck);
discardDeck.reserve(deck.size());
@ -30,13 +31,13 @@ namespace UNO {
}
void Game::Start() {
isStart = true;
for (auto& i : players) {
for (int n = 0; n < 7; n++) {
i->Draw(FetchCard());
}
}
}
int Game::Run(bool monitor) {
bool flag = false;
@ -45,9 +46,9 @@ namespace UNO {
card = FetchCard();
discardDeck.push_back(card);
} while (card.exactColor() == CardColor::Black);
std::vector<std::pair<std::string,int>> playersCards{};
std::vector<std::pair<std::string, int>> playersCards{};
for (nowTurn = 0;; MoveToNext()) {
auto& it = players[nowTurn];
@ -56,28 +57,30 @@ namespace UNO {
playersCards.clear();
for (auto& i : players) {
if (i->TotalCards() == 0) {
// println("结束!胜利者是{}", i->Name());
if (monitor) println("结束!胜利者是{}", i->Name());
return i->Index();
}
playersCards.emplace_back(i->Name(), i->TotalCards());
}
//该玩家进行回合
card = it->Turn(GameView(playersCards,discardDeck,drawCount,direction));
card = it->Turn(GameView(playersCards, discardDeck, drawCount, direction));
if (card.type() != CardType::None) {
discardDeck.back().Detransform();
discardDeck.push_back(card);
for (auto& iter : players) {
iter->GetBroadCast(BroadCast(it->Name(),nowTurn,card));
iter->GetBroadCast(BroadCast(it->Name(), nowTurn, card));
}
//执行相应操作
CardAction(card);
} else {
}
else {
if (drawCount > 0) {
// println("{}需要抽{}张", it->Name(), drawCount);
// sleep(500);
if (monitor){
println("{}需要抽{}张", it->Name(), drawCount);
sleep(500);
}
do {
it->Draw(FetchCard());
@ -86,14 +89,15 @@ namespace UNO {
return players.size();
}
} while (--drawCount);
} else {
}
else {
card = FetchCard();
for(auto& iter : players) {
for (auto& iter : players) {
iter->GetBroadCast(BroadCast(it->Name(), nowTurn, Card::None()));
}
if (auto decision = it->PlayDrawedCard(
GameView(playersCards, discardDeck, drawCount, direction),
card);decision.isPlayed) {
card); decision.isPlayed) {
if (card.color() == CardColor::Black) {
card.Transform(decision.transform);
}
@ -108,9 +112,11 @@ namespace UNO {
}
}
}
}
int Game::Launch(bool monitor) {
this->monitor = monitor;
Start();
Start();
return Run(monitor);
}
@ -144,9 +150,10 @@ namespace UNO {
break;
case CardType::Draw:
drawCount += card.point();
// println("当前加牌数:{}", drawCount);
// sleep(500);
if (monitor) {
println("\t当前加牌数:{}", drawCount);
sleep(500);
}
break;
case CardType::Ban:
@ -154,10 +161,10 @@ namespace UNO {
break;
case CardType::Reverse:
direction = !direction;
// println("当前方向:{}", direction ? "反向" : "正向");
// sleep(500);
if (monitor) {
println("\t当前方向:{}", direction ? "反向" : "正向");
sleep(500);
}
break;
}
}

@ -20,7 +20,7 @@ namespace UNO {
class Game {
public:
Game(std::function<bool(Card, Card, bool)> rule):players(),deck(),discardDeck(),playerCount(),isStart(false),drawCount(0),
direction(false),nowTurn(0),canMatchCard(rule){
direction(false),nowTurn(0),canMatchCard(rule),monitor(false){
deck.reserve(500);
std::random_device rd;
gen.seed(rd());
@ -49,6 +49,7 @@ namespace UNO {
int nowTurn;
bool isStart;
bool direction;
bool monitor;
};
template<UNOPlayer player, typename... Args>

@ -12,13 +12,15 @@ namespace UNO {
}
std::shuffle(randomvec.begin(),randomvec.end(),gen);
Card prev = table.TopCard();
int colors[6]{};
int colors[6]{}, drawcolors[6]{};
for (auto& x : handCard) {
colors[static_cast<int>(x.color())]++;
if(x.type() ==CardType::Draw) drawcolors[static_cast<int>(x.color())]++;
}
int max = 0, ind = 1;
int max = 0, ind = 1,max_dr = 0,ind_dr = 1;
for (int i = 1; i <= 4; i++) {
if (colors[i] > max)max = colors[i], ind = i;
if (drawcolors[i] > max_dr)max_dr = drawcolors[i], ind_dr = i;
}
if (false && table.PlayersCards()[index].second <= 2) {
@ -65,12 +67,19 @@ namespace UNO {
for (auto& i : randomvec) {
if (CanMatchCard(prev, i.second, false)) {
if (i.second.color() == CardColor::Black)
return { i.first,static_cast<CardColor>(index) };
return { i.first,static_cast<CardColor>(ind) };
else
return i.first;
}
}
} else {
//优先出手中颜色较多的牌
for (auto& i : randomvec) {
if (CanMatchCard(prev, i.second, true)
&& i.second.color() == static_cast<CardColor>(ind_dr)) {
return i.first;
}
}
//Ïȳö·ÇºÚ
for (auto& i : randomvec) {
if (CanMatchCard(prev, i.second, true)&& i.second.color() != CardColor::Black) {

@ -5,6 +5,63 @@
#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);
@ -134,12 +191,12 @@ void Arena() {
}
void Play() {
Game game(Rules::CanMatchCard_Festival);
game.AddPlayer<CopyCat>("龙智博");
game.AddPlayer<CopyCat>("徐梓焯");
game.AddPlayer<CopyCat>("田浩宗");
game.AddPlayer<UserPlayer>("程奕铭");
game.AddPlayer<SmartCat1>("入机A");
game.AddPlayer<SmartCat1>("入机B");
game.AddPlayer<SmartCat1>("入机C");
game.AddPlayer<UserPlayer>("");
std::vector<Card> deck{};
CreateDeck_Festival(deck);
CreateDeck_CrazyFestival(deck);
std::println("{:=^40}", "牌堆构成");
std::println("总牌数:{}", deck.size());
for (auto& i : deck) {
@ -148,7 +205,7 @@ void Play() {
std::println("\n按任意键开始!");
_getch();
game.ReadDeck(std::move(deck));
game.Launch();
game.Launch(true);
}
int main(int argc, char* argv[]) {

@ -3,6 +3,8 @@
#include <format>
#include <iostream>
#include <algorithm>
#include <thread>
#include <chrono>
using std::print, std::println, std::cin;
namespace UNO {
void UserPlayer::GetBroadCast(BroadCast brd) {
@ -14,7 +16,9 @@ namespace UNO {
} else {
println("{}´ò³öÒ»ÕÅ{}", brd.name,brd.card);
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
Decision::PlayCardDecision UserPlayer::PlayCard(const GameView& table) {
auto& handCard = HandCard();

Loading…
Cancel
Save