1votos

Ajedrez aleatorio de Fischer en Haskell

por josejuan hace 2 años

Con una pequeña modificación se pueden obtener todas las salidas, sólo una aleatoria, restringidas, combinación de las anteriores, etc...

Generar posición inicial de una partida de ajedrez aleatorio de Fischer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{-# LANGUAGE TupleSections #-} 
import Data.List (sort) 
import System.Random 
import Control.Monad.Random 
 
data Piece = King | Queen | Rook | Knight | Bishop | Pawn deriving (Eq, Enum, Ord) 
 
restrictedChess960 :: Monad m ⇒ ([Int] → m Int) → m [Piece] 
restrictedChess960 r = do 
  k  ← r [2…7]                                                     -- el rey no puede estar ni al principio ni al final 
  r1 ← r [1…k-1]                                                   -- una torre a su izq 
  r2 ← r [k+1…8]                                                   -- la otra a su der 
  b1 ← r [i | i ← [1,3…8], ¬(i ∈ [k, r1, r2])]                     -- un alfil en negras 
  b2 ← r [i | i ← [2,4…8], ¬(i ∈ [k, r1, r2])]                     -- otro alfil en blancas 
  q  ← r [i | i ← [1…8], ¬(i ∈ [k, r1, r2, b1, b2])]               -- la reina donde pille 
  let [k1, k2] = [i | i ← [1…8], ¬(i ∈ [k, r1, r2, b1, b2, q])]  -- los caballos en donde queda 
  η $ snd ↥ sort (zip [k   , r1  , r2  , b1    , b2    , q    , k1    , k2    ] 
                      [King, Rook, Rook, Bishop, Bishop, Queen, Knight, Knight]) 
 
-- genera todas las posiciones iniciales 
chess960 :: [[Piece]] 
chess960 = restrictedChess960 id 
 
-- sin generar todas, elige una aleatoriamente 
randomChess960 :: MonadRandom m ⇒ m [Piece] 
randomChess960 = restrictedChess960 (fromList ∘ ↥(, 1)) 
 
-- aquellas en las que la reina está en blancas 
whiteQueenChess960 :: [[Piece]] 
whiteQueenChess960 = restrictedChess960 r 
  where r p@[_, _, _] = filter even p 
        r p           = p 
 
-- si se quieren mostrar de forma chulipandi 
instance Show Piece where 
  show King   = "♔" 
  show Queen  = "♕" 
  show Rook   = "♖" 
  show Bishop = "♗" 
  show Knight = "♘" 
  show Pawn   = "♙" 
 
{- 
 
-- por ejemplo 
 
> evalRandIO randomChess960  
[♘,♖,♗,♘,♔,♗,♖,♕] 
> evalRandIO randomChess960  
[♘,♗,♗,♖,♔,♖,♘,♕] 
>  
> mapM_ print $ take 20 whiteQueenChess960  
[♖,♔,♖,♗,♗,♕,♘,♘] 
[♖,♔,♖,♗,♗,♘,♘,♕] 
[♖,♔,♖,♕,♗,♗,♘,♘] 
[♖,♔,♖,♘,♗,♗,♘,♕] 
[♖,♔,♖,♕,♗,♘,♘,♗] 
[♖,♔,♖,♘,♗,♕,♘,♗] 
[♖,♔,♖,♗,♘,♕,♗,♘] 
[♖,♔,♖,♗,♘,♘,♗,♕] 
[♖,♔,♖,♕,♘,♗,♗,♘] 
[♖,♔,♖,♘,♘,♗,♗,♕] 
[♖,♔,♖,♕,♘,♘,♗,♗] 
[♖,♔,♖,♘,♘,♕,♗,♗] 
[♖,♔,♗,♗,♖,♕,♘,♘] 
[♖,♔,♗,♗,♖,♘,♘,♕] 
[♖,♔,♗,♕,♖,♗,♘,♘] 
[♖,♔,♗,♘,♖,♗,♘,♕] 
[♖,♔,♗,♕,♖,♘,♘,♗] 
[♖,♔,♗,♘,♖,♕,♘,♗] 
[♖,♔,♘,♗,♖,♕,♗,♘] 
[♖,♔,♘,♗,♖,♘,♗,♕] 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.