Manao ny Bot-nao
Ny fanaovana bot manokana no fomba tsara indrindra hanehoana fa mahay ianao amin’ity lalao ity. Tsy resaka foana. Tsy fandrebirebena ny mpifanandrina hino fa diso ny fanisany boty. Vokatra mangatsiaka sy azo porofoina fotsiny.
Manome template vonona ho an’ny Python, TypeScript, C#, Go ary Java izahay. Raha mahay manoratra function amin’ny iray amin’ireo ianao, dia afaka manao bot ianao. Tsy ilaina ny mahalala ny fomba fiasan’ny HTTP, ny parsing JSON, na ny fifandraisana eo amin’ny moteur de jeu. Misafidiana template, adikao ny dossier, ovao rakitra iray. Izay ihany.
Zavatra ilaina
Section titled “Zavatra ilaina”- .NET 10, ilaina hampiasana
giretra-manage, ny fitaovana CLI hampiasainao hitsapana ny bot-nao - Ny runtime ho an’ny fiteny-nao : Node 20+ ho an’ny TypeScript, Python 3 ho an’ny Python, Go 1.23+ ho an’ny Go, Java 17+ ho an’ny Java
Izay ihany. Tsy misy base de données, tsy misy file de messages, tsy misy orchestration de conteneurs.
Dingana 1 : Adikao ny dépôt
Section titled “Dingana 1 : Adikao ny dépôt”git clone https://github.com/giretra/giretra.gitcd giretraAo anatin’io repo io avokoa ny zava-drehetra : template, fitaovana fitsapana, ary ny dossier bot hipetrahan’ny bot-nao.
Dingana 2 : Adikao ny template iray
Section titled “Dingana 2 : Adikao ny template iray”Adikao ny iray amin’ireo dossier template ao amin’ny external-bots/ ary ovao ny anarany :
cp -r external-bots/random-python-bot external-bots/my-botcp -r external-bots/random-node-bot external-bots/my-botcp -r external-bots/random-dotnet-bot external-bots/my-botcp -r external-bots/random-go-bot external-bots/my-botcp -r external-bots/random-java-bot external-bots/my-botNy dossier template tsirairay dia misy :
| Rakitra | Andraikitra | Ovaina ? |
|---|---|---|
bot.meta.json | Mombamomba ny bot sy ny configuration de lancement | Eny |
Rakitry ny bot (bot.py, bot.ts, Bot.cs, bot.go, Bot.java) | Ny logique de jeu anao | Eny |
| Rakitry ny serveur | Boilerplate HTTP | Tsia |
| Famaritana karazana | Structures de données ho an’ny requête sy réponse | Tsia |
Dingana 3 : Amboary ny bot.meta.json
Section titled “Dingana 3 : Amboary ny bot.meta.json”Sokafy ny bot.meta.json ary ovao ny champs mombamomba :
{ "name": "my-bot", "displayName": "My Awesome Bot", "pun": "I never bluff... except when I do", "author": "Anaranao", "authorGithub": "github-username-nao"}Tondro ho an’ny champs :
| Champ | Fanazavana |
|---|---|
name | Anarana anatiny. Tsy maintsy tokana, litera kely, tsy misy espace. Anarana ho an’ny dossier-nao koa ity. |
displayName | Izay miseho ao amin’ny classement sy ny résultat-n’ny match. |
pun | Teny iray mahafinaritra miseho eo akaikin’ny anaran’ny bot-nao. Tsy voatery fa tsara raha misy. |
author | Ny anaranao. |
authorGithub | Ny GitHub username anao. |
init | Fomba fametrahana dépendances na compilation. Atao indray mandeha alohan’ny fanombohan’ny bot-nao. |
launch | Fomba fanombohana ny serveur-n’ny bot-nao. Ny moteur no mametraka variable d’environnement PORT. |
Avelao init sy launch raha tsy mila manova ny fomba fanangonana na fanombohana ny bot-nao ianao. Efa voalamina tsara ireo ao amin’ny template.
Dingana 4 : Ampidiro ny logique-n’ny bot-nao
Section titled “Dingana 4 : Ampidiro ny logique-n’ny bot-nao”Ny bot-nao dia mandray karazana fanapahan-kevitra 3 monja :
- Misafidiana toeran’ny fanapahana. Alohan’ny donne tsirairay, misy manapaka ny karatra. Misafidiana toerana eo anelanelan’ny 6 sy 26.
- Misafidiana action fifampiraharahana. Ny fizotran’ny enchère. Ny moteur manome anao lisitry ny action azo atao (miantso fomba, mandray, contrer, surcontrer). Misafidiana iray.
- Misafidiana karatra hilalaovana. Ny fototry ny stratégie anao. Ny moteur manome anao lisitry ny karatra azo alalaovina. Misafidiana iray.
Ity misy bot feno amin’ny fiteny tsirairay. Ity no rakitra tokana ovainao :
bot.py
import randomfrom bot_types import *
class Bot: def __init__(self, match_id: str): self.match_id = match_id
def choose_cut(self, ctx: ChooseCutContext) -> CutResult: position = random.randint(6, 26) return CutResult(position=position, from_top=True)
def choose_negotiation_action( self, ctx: ChooseNegotiationActionContext ) -> NegotiationActionChoice: # ctx.valid_actions dia misy izay rehetra azo atao return ctx.valid_actions[0]
def choose_card(self, ctx: ChooseCardContext) -> Card: # ctx.valid_plays dia misy ny karatra ara-dalàna rehetra azo alalaovina return random.choice(ctx.valid_plays)bot.ts
import type { ChooseCutContext, ChooseNegotiationActionContext, ChooseCardContext, CutResult, NegotiationActionChoice, Card} from './types';
export class Bot { constructor(public readonly matchId: string) {}
chooseCut(ctx: ChooseCutContext): CutResult { const position = Math.floor(Math.random() * 21) + 6; return { position, fromTop: true }; }
chooseNegotiationAction(ctx: ChooseNegotiationActionContext): NegotiationActionChoice { // ctx.validActions dia misy izay rehetra azo atao return ctx.validActions[0]; }
chooseCard(ctx: ChooseCardContext): Card { // ctx.validPlays dia misy ny karatra ara-dalàna rehetra azo alalaovina return ctx.validPlays[Math.floor(Math.random() * ctx.validPlays.length)]; }}Bot.cs
namespace RandomDotnetBot;
public class Bot{ private readonly Random Rng = new(); public string MatchId { get; }
public Bot(string matchId) => MatchId = matchId;
public CutResult ChooseCut(ChooseCutContext ctx) { return new CutResult { Position = Rng.Next(6, 27), FromTop = true }; }
public NegotiationActionChoice ChooseNegotiationAction( ChooseNegotiationActionContext ctx) { // ctx.ValidActions dia misy izay rehetra azo atao return ctx.ValidActions[0]; }
public Card ChooseCard(ChooseCardContext ctx) { // ctx.ValidPlays dia misy ny karatra ara-dalàna rehetra azo alalaovina return ctx.ValidPlays[Rng.Next(ctx.ValidPlays.Count)]; }}bot.go
package main
import "math/rand/v2"
type Bot struct { MatchID string}
func NewBot(matchID string) *Bot { return &Bot{MatchID: matchID}}
func (b *Bot) ChooseCut(ctx ChooseCutContext) CutResult { return CutResult{Position: rand.IntN(21) + 6, FromTop: true}}
func (b *Bot) ChooseNegotiationAction( ctx ChooseNegotiationActionContext,) NegotiationActionChoice { // ctx.ValidActions dia misy izay rehetra azo atao return ctx.ValidActions[0]}
func (b *Bot) ChooseCard(ctx ChooseCardContext) Card { // ctx.ValidPlays dia misy ny karatra ara-dalàna rehetra azo alalaovina return ctx.ValidPlays[rand.IntN(len(ctx.ValidPlays))]}Bot.java
package randomjavabot;
import java.util.concurrent.ThreadLocalRandom;import randomjavabot.BotTypes.*;
public class Bot { private final String matchId;
public Bot(String matchId) { this.matchId = matchId; }
public CutResult chooseCut(ChooseCutContext ctx) { int position = ThreadLocalRandom.current().nextInt(6, 27); return new CutResult(position, true); }
public NegotiationActionChoice chooseNegotiationAction( ChooseNegotiationActionContext ctx) { // ctx.validActions() dia misy izay rehetra azo atao return ctx.validActions().get(0); }
public Card chooseCard(ChooseCardContext ctx) { // ctx.validPlays() dia misy ny karatra ara-dalàna rehetra azo alalaovina var plays = ctx.validPlays(); return plays.get(ThreadLocalRandom.current().nextInt(plays.size())); }}Izay ihany. Méthode telo. Ny moteur milaza aminao izay ara-dalàna amin’ny alalan’ny validActions sy validPlays, ka tsy afaka manao fihetsika tsy ara-dalàna tsy nahy ianao. Misafidiana ao amin’ny menu fotsiny. Manomboha tsotra, ary amboary tsikelikely.
Ny contexte-n’ny requête dia ahitana koa ny karatra eny an-tananao, ny pli ankehitriny, ny isa, ary ny tantaran’ny fifampiraharahana, izay rehetra ilainao hanorenana stratégie tena izy.
Dingana 5 : Tsapao ny bot-nao
Section titled “Dingana 5 : Tsapao ny bot-nao”Ny baiko rehetra eto ambany dia mieritreritra fa eo amin’ny fototry ny clone Giretra anao ianao. Ampiasao ./giretra-manage.sh amin’ny Linux/macOS na giretra-manage.cmd amin’ny Windows.
Fanamarinana
Section titled “Fanamarinana”Ny baiko voalohany tokony ataonao. Mampilalao ny bot-nao amin’ny match 100 amin’ny Kialasoa ary manamarina fa mandeha tsara ny zava-drehetra :
./giretra-manage.sh validate my-botMahazo tatitra feno ianao misy :
- Fandikana fitsipika sy isan’ny crash (ny tanjonao : aotra)
- Fotoana famaliana isaky ny karazana fanapahan-kevitra (min, moy, P50, P95, P99, max)
- Firakofana ny fomba filalaovana (raha voatsapa tamin’ny fomba enina rehetra ny bot-nao)
- Fironana performance (ny fiovam-potoana famaliana mandritra ny run)
Afaka amboarinao amin’ny option toy ny -n 500 ho an’ny match betsaka kokoa, -o Razavavy ho an’ny mpifanandrina sarotra kokoa, -d ho an’ny fitsapana déterminisme, na -v ho an’ny antsipiriany momba ny fandikana fitsipika.
Benchmark
Section titled “Benchmark”Rehefa madio ny fanamarinana ny bot-nao, atrehoy ny mpifanandrina voarafitra :
./giretra-manage.sh benchmark my-bot Kialasoa./giretra-manage.sh benchmark my-bot Razavavy./giretra-manage.sh benchmark my-bot Eva| Bot | Hasarotana | Stratégie |
|---|---|---|
Kialasoa | Mora | Milalao kisendrasendra. Raha tsy maharesy azy ianao, misy olana. |
Razavavy | Antonony | Manara-maso karatra sy mamaky ny famantarana-n’ny mpiara-milalao. |
Eva | Sarotra | Fanisana karatra, fanadihadiana vide, filalaovana araka ny toerana. Ny boss ankehitriny. |
Ny benchmark milalao match 1000 amin’ny ankapobeny ary manome anao ny taha-pandresena miaraka amin’ny intervalle de confiance 95%, ny classement ELO ary ny signification statistique. Ampiasao -n hanovana ny isan’ny match.
Tournoi suisse
Section titled “Tournoi suisse”Jereo ny toeran’ny bot-nao eo amin’ny bot rehetra misy :
./giretra-manage.sh swissIo baiko io mahita ny bot rehetra (voarafitra sy externe) ary mandefa tournoi au format suisse feno miaraka amin’ny classement farany, ny tantaran’ny fandresena/faharesena ary ny classement ELO. Afaka mandefa anarana bot manokana koa ianao hamerana ny mpandray anjara.
Andramo ao amin’ny navigateur
Section titled “Andramo ao amin’ny navigateur”Afaka alefanao eo an-toerana ny application web play.giretra.com manontolo mba hilalaovana amin’ny bot-nao amin’ny toe-javatra tena izy. Voalohany, apetraho ny dépendances frontend :
cd src/Giretra.Web/ClientApp/giretra-webnpm installAvy eo alefaso ny application avy amin’ny fototry ny dépôt miaraka amin’ny flag --offline :
dotnet run --project src/Giretra.Web -- --offlineIzany dia manomboka ny backend ASP.NET sy ny frontend Angular miaraka amin’ny authentification simulée, ka tsy mila service externe. Sokafy ny http://localhost:4200 ao amin’ny navigateur-nao mba hidirana ny application.
Araho ny sortie console. Raha tsy mipoitra ny bot externe anao (dépendances tsy ampy, script init simba, conflit de port), ny erreur dia hiseho ao amin’ny stdout. Izay ny fomba haingana indrindra hahitana olana amin’ny fanombohana alohan’ny hahatongavany ho échec de test saro-pantarina.
Événements d’observation (tsy voatery)
Section titled “Événements d’observation (tsy voatery)”Raha tianao ny bot-nao hanara-maso izay ataon’ny mpilalao hafa, abonnez azy amin’ny notification amin’ny fampidirana karazana événement ao amin’ny bot.meta.json :
"notifications": ["card-played", "trick-completed", "deal-ended"]Avy eo ampidiro ny méthode de gestion mifanaraka amin’izany :
def on_card_played(self, ctx: CardPlayedContext) -> None: # Manara-maso ny karatra efa nolalaovina pass
def on_trick_completed(self, ctx: TrickCompletedContext) -> None: # Manara-maso ny pli azon'ny ekipa tsirairay pass
def on_deal_ended(self, ctx: DealEndedContext) -> None: # Mandinika ny vokatry ny donne passonCardPlayed(ctx: CardPlayedContext): void { // Manara-maso ny karatra efa nolalaovina}
onTrickCompleted(ctx: TrickCompletedContext): void { // Manara-maso ny pli azon'ny ekipa tsirairay}
onDealEnded(ctx: DealEndedContext): void { // Mandinika ny vokatry ny donne}public virtual void OnCardPlayed(CardPlayedContext ctx){ // Manara-maso ny karatra efa nolalaovina}
public virtual void OnTrickCompleted(TrickCompletedContext ctx){ // Manara-maso ny pli azon'ny ekipa tsirairay}
public virtual void OnDealEnded(DealEndedContext ctx){ // Mandinika ny vokatry ny donne}func (b *Bot) OnCardPlayed(ctx CardPlayedContext) { // Manara-maso ny karatra efa nolalaovina}
func (b *Bot) OnTrickCompleted(ctx TrickCompletedContext) { // Manara-maso ny pli azon'ny ekipa tsirairay}
func (b *Bot) OnDealEnded(ctx DealEndedContext) { // Mandinika ny vokatry ny donne}public void onCardPlayed(CardPlayedContext ctx) { // Manara-maso ny karatra efa nolalaovina}
public void onTrickCompleted(TrickCompletedContext ctx) { // Manara-maso ny pli azon'ny ekipa tsirairay}
public void onDealEnded(DealEndedContext ctx) { // Mandinika ny vokatry ny donne}Événement misy : deal-started, card-played, trick-completed, deal-ended, match-ended.
Tsara be ireo amin’ny fanorenana fahatsiarovana : manara-maso ny karatra efa nolalaovina, mahita vide, manisa isa. Fa tsy voatery mihitsy. Bot tsy misy état dia ampy tsara ho fanombohana.
Fitsipika
Section titled “Fitsipika”Fitsipika iray : tsy miantso ressource externe mandritra ny lalao. Tsy misy appel API amin’ny IA cloud, tsy misy fifandraisana amin’ny serveur lavitra, tsy misy fanisintanana fichier stratégie mandritra ny lalao.
Ny bot-nao mihodina eo an-toerana, mandray fanapahan-kevitra eo an-toerana. Afaka mampiasa librairie sy dépendances eo an-toerana rehetra tianao ianao : librairie mathématique, structures de données, na modèle ML eo an-toerana aza. Aoka ho autonome fotsiny.
Dingana manaraka
Section titled “Dingana manaraka”Manomboha amin’ny bot adala indrindra fa mandeha. Tsapao azy. Avy eo ataovy maranitra kokoa, fanapahan-kevitra iray isaky ny mandeha. Reseo Kialasoa, avy eo kendreo Razavavy, ary andramo aongana Eva.
Vonona hivoaka amin’ny sehatra ? Araho ny torolalana Publier ny Bot-nao mba hanokafana pull request sy hahatonga ny bot-nao ho azo lalaoina amin’ny play.giretra.com.
Te hahalala ny protocole ao ambadika na te hanao bot amin’ny fiteny tsy misy template ? Jereo ny Manao avy amin’ny tsy misy.