* New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations create-plugin.md (French) * New translations create-plugin.md (French) * New translations create-plugin.md (French) * New translations create-plugin.md (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations create-plugin.md (French) * New translations create-plugin.md (French) * New translations create-plugin.md (French) * New translations create-plugin.md (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations stream.md (French) * New translations reversi-bot.md (French) * New translations ja-JP.yml (English) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations stream.md (French) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (French) * New translations reversi-bot.md (French) * New translations reversi-bot.md (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations stream.md (French) * New translations stream.md (French) * New translations ja-JP.yml (French) * New translations stream.md (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Italian) * New translations theme.md (Italian) * New translations theme.md (French) * New translations theme.md (English) * New translations theme.md (Italian) * New translations theme.md (Italian) * New translations theme.md (Italian) * New translations ja-JP.yml (Chinese Simplified) * New translations deck.md (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (French) * New translations theme.md (French) * New translations theme.md (French) * New translations deck.md (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (French) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (English) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (French) * New translations ja-JP.yml (French) * New translations aiscript.md (Spanish) * New translations ja-JP.yml (German) * New translations ja-JP.yml (German) * New translations ja-JP.yml (English) * New translations ja-JP.yml (German) * New translations ja-JP.yml (English) * New translations ja-JP.yml (English) * New translations ja-JP.yml (Ukrainian) * New translations ja-JP.yml (Chinese Traditional) * New translations ja-JP.yml (Chinese Simplified) * New translations ja-JP.yml (Japanese, Kansai) * New translations ja-JP.yml (German) * New translations ja-JP.yml (Italian) * New translations ja-JP.yml (Spanish) * New translations ja-JP.yml (Arabic) * New translations ja-JP.yml (Russian) * New translations ja-JP.yml (Polish) * New translations ja-JP.yml (Korean) * New translations ja-JP.yml (French)
6.1 KiB
Développement du bot Reversi de Misskey
Cette page explique comment développer un bot pour la fonction Reversi de Misskey.
-
Connectez-vous au flux
games/reversi
avec les paramètres suivants :i
: Clé API pour le compte du bot
-
Lorsqu'une invitation à un jeu arrive, un événement
invited
sera lancé à partir du flux.- Le contenu de cet événement est un attribut
parent
, qui contient des informations sur l'utilisateur qui a envoyé l'invitation.
- Le contenu de cet événement est un attribut
-
Envoie une requête à
games/reversi/match
, où la valeur du paramètreuser_id
est l'attributid
de l'objetparent
obtenu précédemment. -
Si la requête fonctionne, les informations sur le jeu seront renvoyées et vous pourrez vous connecter au flux
games/reversi-game
avec les paramètres suivants :i
: Clé API pour le compte du botgame
:game
deid
-
Pendant ce temps, l'adversaire peut modifier les paramètres du jeu. Chaque fois qu'un paramètre est modifié, le flux envoie un événement
update-settings
, donc une logique pour gérer ces événements peut être nécessaire. -
Une fois que vous êtes satisfait·e des paramètres du jeu, envoyez le message
{ type : 'accept' }
au flux. -
Lorsque le jeu commence, l'événement
started
sera envoyé.- Les informations sur l'état du jeu seront inclus dans cet événement.
-
Pour placer une pierre, envoyez
{ type : 'set', pos : <Position> ; }
au flux (voir ci-dessous pour savoir comment calculer la position). -
Lorsque votre adversaire ou vous-même placez une pierre, un événement
set
est envoyé depuis le flux.color
contient la couleur de la pierre placéepos
contient la position de la pierre
Calculer la position
Si nous considérons une carte 8x8, la position de chaque carré (appelée index) est la suivante :
+--+--+--+--+--+--+--+--+
| 0| 1| 2| 3| 4| 5| 6| 7|
+--+--+--+--+--+--+--+--+
| 8| 9|10|11|12|13|14|15|
+--+--+--+--+--+--+--+--+
|16|17|18|19|20|21|22|23|
...
Trouver les index à partir des coordonnées X, Y
pos = x + (y * mapWidth)
mapWidth
est une donnée de la carte prise sur la map
comme suit :
mapWidth = map[0].length
Trouver les coordonnées X, Y depuis l'index
x = pos % mapWidth
y = Math.floor(pos / mapWidth)
Information sur la carte
Les données de la carte sont incluses dans map
dans les données du jeu. Comme les données sont représentées sous la forme d'un tableau de chaînes de caractères, chaque caractère représente un champ. Sur la base de ces données, vous pouvez reconstruire l'état de la carte :
(Vide)
... Aucun champ-
... Champb
... La première pierre placée est noirew
... La première pierre placée est blanche
Par exemple, supposons que nous ayons la carte simple suivante de 4×4 :
+---+---+---+---+
| | | | |
+---+---+---+---+
| | ○ | ● | |
+---+---+---+---+
| | ● | ○ | |
+---+---+---+---+
| | | | |
+---+---+---+---+
Dans ce cas, les données de la carte ressembleront à ceci :
['----', '-wb-', '-bw-', '----']
Créer un Bot interactif en présentant un formulaire à l'utilisateur.
Afin de communiquer avec l'utilisateur, un formulaire peut être présenté à l'utilisateur sur l'écran des paramètres du jeu. Par exemple, un scénario pourrait consister à permettre à l'utilisateur de définir la force du bot.
Pour présenter le formulaire, envoyez le message suivant au flux reversi-game
:
{
type: 'init-form',
body: [Tableau de contrôles de formulaires]
}
Nous allons maintenant expliquer le tableau des contrôles de formulaires. Un contrôle de formulaire est un objet qui ressemble à ce qui suit :
{
id: 'switch1',
type: 'switch',
label: 'Enable hoge',
value: false
}
id
... ID de l'élément de contrôle. type
... Le type d'élément de contrôle. Nous y reviendrons plus tard. Texte affiché à côté de l'élément de contrôle. value
... La valeur par défaut de l'élément de contrôle.
Gestion des interactions avec les formulaires
Lorsqu'un utilisateur interagit avec le formulaire, un événement update-form
est envoyé par le flux. Le contenu de l'événement contient l'ID du contrôle et la valeur définie par l'utilisateur. Par exemple, si l'utilisateur allume l'interrupteur illustré ci-dessus, l'événement suivant sera diffusé :
{
id: 'switch1',
value: true
}
Types d'éléments de contrôles de formulaires
Interrupteur
type: switch
Affiche un interrupteur.Cette fonction est utile lorsque vous souhaitez activer ou désactiver une fonction.
Propriétés
label
... Texte à marquer sur l'interrupteur.
Boutons radio
type: radio
Affiche le bouton radio.Il est utile pour proposer des options.Par exemple, pour choisir la difficulté du bot.
Propriétés
items
... Les options des boutons radio. Par exemple :
items: [{
label: 'Facile',
value: 1
}, {
label: 'Moyen',
value: 2
}, {
label: 'Difficile',
value: 3
}]
Glissière
type: slider
Affiche une glissière.
Propriétés
min
... Limite minimum de la glissière. max
... Limite maximum de la glissière. step
... Étapes entre les valeurs de la glissière.
Zones de texte
type: textbox
Affiche une zone de texte.Cette fonction peut être utilisée à des fins générales lorsque vous souhaitez que l'utilisateur tape quelque chose.
Afficher un message à l'utilisateur
C'est un autre moyen, autre que les formulaires, d'interagir avec les utilisateurs dans l'écran de configuration.Vous pouvez afficher un message à l'intention de l'utilisateur. Par exemple, vous pouvez afficher un avertissement lorsque l'utilisateur sélectionne un mode ou une carte qui n'est pas pris en charge par le Bot. Pour afficher un message, envoyez le message suivant au flux :
{
type: 'message',
body: {
text: 'contenu du message',
type: 'Type du message'
}
}
Type de message : success
, info
, warning
, error
.
Abandonner
Pour se rendre, faites une demande à cette terminaison.