J'essaie de comprendre les jeux de stratégie d'écriture en utilisant Scala fonctionnellement, mais malheureusement, je semble être coincé à la base même. (Ce n'est pas le travail à domicile, mais mes tentatives pour apprendre quelque chose de nouveau, à savoir la programmation fonctionnelle "pure".)Générer des mouvements de jeu fonctionnellement avec Scala
Prenons le suivant "jeu" simple: le joueur (seul) a x pièces identiques sur une ligne sans fin de carrés. Les pièces commencent au carré 0 et chaque tour, il peut déplacer une pièce en avant d'un carré.
Comme la structure de données, je vais utiliser un List[Int]
où chaque élément est la position (carré) d'une seule pièce.
Pour générer les mouvements possibles, je suis venu avec:
def moves(start: List[Int]) =
(0 until start.length).map({i => start.updated(i, start(i) + 1)});
val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(1, 0, 0), List(0, 1, 0), List(0, 0, 1))
val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))
Ce que je n'aime pas est l'utilisation de la boucle d'index (0 until start.length)
. Cela ne me semble pas très "fonctionnel". Est-ce la bonne façon de le faire ou existe-t-il un meilleur moyen?
Maintenant, dans mon exemple de jeu toutes les pièces sont identiques, en cas m1
les trois mouvements possibles sont également identiques et pourraient/devraient être condensés en un seul mouvement. J'ai modifié moves
pour trier chaque élément de déplacement, de sorte que je puisse obtenir une liste d'éléments distincts:
def moves(start: List[Int]) =
(0 until start.length).map({i => start.updated(i, start(i) + 1).sorted}).distinct;
val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(0, 0, 1))
val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))
Cependant, cela nécessite à la structure de données triables et dans mon application « réelle », il est très probablement pas un List[Int]
, mais un Tuple ou une classe de cas. Ce dont j'aurais besoin, c'est d'une méthode distinct
, qui prend une fonction qui définit l'égalité. Comment pourrais-je l'implémenter?
L'énumération du type de retour des méthodes facilite la lecture. Oui, je pourrais le prendre du commentaire pour m1, mais c'est trop tard ... – ziggystar