Play a valid chess move, given a board on stdin The program plays white.

Example stdin:

8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h


Example stdout:

8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h


Any valid move is ok. "En passant" and castling are ignored. It is ok to show error messages or print nothing if there is no valid move.

The answer with the most votes wins.
I'm not complaining about upvotes, but to be fair... my solution here isn't actually all that great. Ugoren's is better, apart from lacking unicode support. Be sure to look at all the answers before voting, if you've come across this question only now!Anyway.
Haskell, 1074 bytes (without castling)

χ=w⋈b;w=&quot;♙♢♤♔♕♖♗♘&quot;;b=&quot;♟♦♠♚♛♜♝♞&quot;
μ=t⤀ζ++((\(x,y)-&gt;(x,-y))⤀)⤀μ;q c|((_,m):_)&lt;-((==c).fst)☂(χ⋎μ)=m
t(x:y:l)=(d x,d y):t l;t _=[];d c=fromEnum c-78
ζ=[&quot;NM&quot;,&quot;NL&quot;,&quot;MMOM&quot;,&quot;MMMNMONMNOOMONOO&quot;,σ⋈δ,σ,δ,&quot;MLOLPMPOOPMPLOLM&quot;]
σ=l&gt;&gt;=(\c-&gt;'N':c:c:&quot;N&quot;);δ=[l⋎l,reverse l⋎l]&gt;&gt;=(&gt;&gt;=(\(l,r)-&gt;[l,r]))
l=&quot;GHIJKLMOPQRSTU&quot;
α c|c∊&quot;♢♤&quot;='♙'|c∊&quot;♦♠&quot;='♟'|c∊χ=c;π('♙':_)=6;π _=1
(⋎)=zip;(⤀)=map;(∊)=elem;(✄)=splitAt;(☂)=filter;(⋈)=(++)
φ r@(x,y)p a
 |x&gt;7=φ(0,y+1)p a
 |y&gt;7=[]
 |c&lt;-a✠r=(c⌥r)p a y⋈φ(x+1,y)p a
(c⌥r)p a y
 |c==p!!0=(a☈r)c χ++const(y==π p)☂(a☈r)(p!!1)χ++(a☈r)(p!!2)('…':w)
 |c∊p=(a☈r)c χ
 |True=[]
a✠(x,y)=a!!y!!(x*2);o(x,y)=x&gt;=0&amp;&amp;x&lt;8&amp;&amp;y&gt;=0&amp;&amp;y&lt;8
(n➴a)(x,y)|(u,m:d)&lt;-y✄a,(l,_:r)&lt;-(x*2)✄m=u⋈(l⋈(n:r):d)
(a☈r@(x,y))c b=(α c➴('…'➴a)r)⤀((\r-&gt;o r&amp;&amp;not((a✠r)∊b))☂((\(ξ,υ)-&gt;(x+ξ,y+υ))⤀q c))
main=interact$unlines.uncurry((⋈).zipWith((⋈).(:&quot; ║&quot;))['8','7'..]
 .head.((all(any('♔'∊)).φ(0,0)b)☂).φ(0,0)w.(drop 3⤀)).(8✄).lines

Try it online!

When you have GHC installed (for instance as part of the Haskell platform) you can do just
$ runhaskell def0.hs &lt; examplechessboard.txt
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… ♘ … … ♟ … … …
4 ║… … … … … … … …
3 ║… … … … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h