Вам потребуется микроконтроллер. Вот вам пример моей шахматной программы. Разумеется, там есть контроль правильности ходов.
Общая идея следующая. Поле представляется массивом 16x16 (чтобы удобно было не следить за выходом за границы массива) заданного типа CELL.
Код: Выделить всё
//----------------------------------------------------------------------------------------------------
//Битовые маски
//----------------------------------------------------------------------------------------------------
#define BYTE8(b7,b6,b5,b4,b3,b2,b1,b0) ((CELL)((b7<<7)|(b6<<6)|(b5<<5)|(b4<<4)|(b3<<3)|(b2<<2)|(b1<<1)|(b0<<0)))
//цвета фигур
#define BLACK BYTE8(0,0,1,0,0,0,0,0)
#define WHITE BYTE8(0,1,0,0,0,0,0,0)
//флаг короткой рокировки
#define CASTLING_O_O (BYTE8(0,0,0,1,0,0,0,0)<<8)
//флаг длинной рокировки
#define CASTLING_O_O_O (BYTE8(0,1,0,0,0,0,0,0)<<8)
//структура полей доски:AHIIIIEWB0MFFF
//W-фигура белая
//B-фигуры чёрная
//F-тип фигуры (0-фигуры нет)
//M-ходила ли фигура
//E-край доски
//I-индекс фигуры в массиве для поиска фигур (0-15)
//H-была короткая рокировка (флаг ставится только у короля и ладьи)
//A-была длинная рокировка (флаг ставится только у короля и ладьи)
//сдвиг индекса
#define INDEX_SHIFT 8
//маска белых
#define MASK_WHITE WHITE
//маска чёрных
#define MASK_BLACK BLACK
//маска цвета
#define MASK_COLOR (MASK_WHITE|MASK_BLACK)
//маска типа
#define MASK_TYPE BYTE8(0,0,0,0,0,1,1,1)
//маска границы
#define MASK_BORDER BYTE8(1,0,0,0,0,0,0,0)
//маска,ходила ли фигура
#define MASK_IS_MOVED BYTE8(0,0,0,0,1,0,0,0)
//маска индекса фигуры в массиве
#define MASK_INDEX ((BYTE8(0,0,0,0,1,1,1,1))<<INDEX_SHIFT)
//маска рокировки
#define MASK_CASTLING (BYTE8(0,0,1,1,0,0,0,0)<<8)
//----------------------------------------------------------------------------------------------------
//Типы данных
//----------------------------------------------------------------------------------------------------
//полное значение ячейки
#define CELL_FULL_VALUE 0xffffffff
//тип фигуры
#define FIGURE_TYPE long
#define FIGURE_COLOR long
#define COORD long
#define CELL long
#define ENGINE_BOOL long
#define ZOBRIST_COLOR long
#define ENGINE_TRUE 1L
#define ENGINE_FALSE 0L
#define ZOBRIST_BLACK 0
#define ZOBRIST_WHITE 1
#define CELL_EMPTY 0
#define CELL_ATTACK BYTE8(0,0,0,0,1,0,0,0)
//----------------------------------------------------------------------------------------------------
//Типы фигур
//----------------------------------------------------------------------------------------------------
//король
#define FIGURE_TYPE_KING 1
//ферзь
#define FIGURE_TYPE_QUEEN 2
//ладья
#define FIGURE_TYPE_ROOK 3
//слон
#define FIGURE_TYPE_BISHOP 4
//конь
#define FIGURE_TYPE_KNIGHT 5
//пешка
#define FIGURE_TYPE_PAWN 6
Получается вот такой вот массив CELL Board[256];//шахматная доска с полем посередине (16x16)
Ходы фигур описываются как
Код: Выделить всё
//----------------------------------------------------------------------------------------------------
//ходы фигур
//----------------------------------------------------------------------------------------------------
long KingMove[9]={16,-16,1,-1,17,-17,15,-15,0};//ходы короля
long QueenMove[9]={16,-16,1,-1,17,-17,15,-15,0};//ходы ферзя
long RookMove[5]={16,-16,1,-1,0};//ходы ладьи
long BishopMove[5]={17,-17,15,-15,0};//ходы слона
long KnightMove[9]={32+1,32-1,16+2,16-2,-(32+1),-(32-1),-(16+2),-(16-2),0};//ходы коня
А дальше вам потребуется разобраться с функцией Move_MoveOn.
К сожалению, переделать её под вас мне сейчас некогда, тем более, что всё это делалось для компьютера, а не для микроконтроллера. Тут много нужно вспоминать даже мне, хоть я и автор.

Впрочем, может быть, я это и сделаю позже.
Вообще, в книжке Корнилова "Программирование шахмат" это есть.
Добавлено after 37 minutes 56 seconds:
В принципе, выкинул всё ненужное. Осталась только обработка ходов. Правда, для микроконтроллера потребуется много памяти - в этом плане нифига не оптимально. Сперва собирается список ходов, а потом ваш ход ищется среди них.