From f807011f79fd9a0d6e97853fa1d8aee77f3a7b0d Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 18 Apr 2025 20:17:21 +0200 Subject: [PATCH] chess: added knight moves --- chess.apkg | Bin 1405146 -> 2846938 bytes generate_deck.py | 69 ++++++++++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/chess.apkg b/chess.apkg index fc6f71deb8209fc422a9309539ec574ec0836c55..859e8feb09cadcb5034eab6c301901cc42ba854f 100644 GIT binary patch delta 124055 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­vt!}7nF}kYrl~xDI_+se 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 RoX?FHjNcN?9^U0z?XV0 zKci{wM~5mRLex>i6YddRY<`e?2%@)T8a{Zft8E8d47qPUals5$ijo zPO59{RX5fpKZta?)@wT-^hp^U#OV$VC5542%2<=f0qeQ8%4bmlxmC*Vm0u_?D?d~o zR_;~4s(eBD>{xpE@03+s)Q&4Ze>$=VeMX6q2m1JRjO-EG&!fK&A@npxZ3yWx(jZiU zQ3*nE7-b+7i&2~df@xN}4KYX64~=b6$6G0U_`pbzVdA*j)g`suC2(NZtx?_G6OZ0C zMgkzRh>G|_#E**jLS!Ko@qvgp6;b1e3T5C$MGQr!)oy&ilMZxzsdnRYo<{}dLMt9r z#2q4YsE8XxT&ai)L{wB{Hbk7Mh!aGVRKyV?4pd|oMC_@E9Yk!Yhz&#(RKyx0R#e0i zB62EX0TGUh$Z!Om1l3(}XU=b%zRU5X4lssmK6Cexf3M5cz?M^g`r2D$)&+ zTU4YINBE?_rXq&j$BjwfqynuVc7uwngUEF%(gcyus7M1uu2GSCh+L&2br88iMQR{& ziHcO?2;b2QRKyVRfw80KsKA3D_7N2+hsbFvvKk_%sK^5lIYC8AA@V*IDTc@~DpClM zBUB_GB8R9*E<_Gek!*;(Lq)P6vY(1%LgZ~KvK%6NsK`=?Oi+TH@NQi8wBH<9(Mnys)vXzR2;D`gN zz;h583r(|B%hMdvhGVMvxoGFC;n60Ao}Ys3MntI1gI}p-4<}U>L&t!An-c^ zZxQ%4fj0@fLEv=)KO^uOfmadK8w;gh^(*&L(@C1SH6L^fkBLMZP zLx5EW34DjZ{RF;E;2r`e2;4>B8w9>a;41`<^DqNncdD1j;V}ZY6S$4Qtpq-2$FHv# zmvj((#wCD2e*%38^dV49-~s~Y6F8SZcLLoAbeVEV&nAbR2y`TH7J+sI+7M_>pe2D8 z1j+!aeib0Pq<;}`x$0*Ee35j8v?%~@Jj-}An`h+$1X>8F!N;$f_!)A^D z9{}7BbAR9qG4}=TjkynSFU-}zJuzPZd>-cWG1v1Adf)?d;RACpcL(l@xf^g5<}SdU zF`o@wiMbPS2h1IT+hab9=Xwln@&E1M0}9M-fE(*#4P1`nmcTj8Ed;K@XUate{0<*i z{R;dx=D#4W$I_~w@PVJ<13zH?Bk=Dq{~q`)%)bTxHRj&{zlr%*z;9swCGhK*f1#A? zjptnT89wkieBc`9p8~&%`6s}yVE!@iOPF5&mz1oNZ74`F^7_(9Cy)5C#x@PT)M@5lTA@V7DF2Ye6a zdx1}2{uc0EnC}Mu2Ig-9e+_f}>u}%|eBf2! ziuow;=Xh?TdLGYpQ(a+X7Vio{N-Ikn8+_Brf6yg>;{Fu(rMM5p)f8Vq@%d9Yc7?f9 z4)6)MQ{0W>E)<_laVLs9QhXNSMpv*S2XF;!C~i%0ONv`iTqfqo4@4DK{Q_J+iqF;0 zaKOlar1Rg|l;Vde{+^NR`MVpOz`N834p4j_#rIPDEsF1^_?r}e9dkVl zJJqYy2X<2YWs1K@@f{R@f#RbS$9C{^WTBH~n!_g9aH6_!_|e_r=)Ug9S;L_Rjq3$l zxs7o~Tm;Au&_Y1ofV=>C0-6WN1JE2mu7Fg4oDnk4mo7>;=m5wbkS!nuAS*y}K%9V7 zcLCi2bQ{o5fPT;e{0`79Kwks83Fro(>wrE3bPdo|Kvw`=0(4;#p+)#PIQS8u(|}F^ zIsxc?K*sS+7IY$9${xx?SX?6fOY|T1JG-LUI8=?=p{g7fVKnL252jw z=VWr3Olg=n;@@bf)CEP3x9sLLN=tOJ<}|Lkq}aoaS8sAlaO4j-8#JlPL*tuMID2lq zJ)QH#M`s%}1b#R1-{fR>Np9Gzv{Z~&Yu()K z7DPse`>6YqeemC5DM?{ny}Fdzwsmcts1+9j=Nj-AK8GmKVQSi7M|9zJTiRS#AL=F%0I$E?8o`>z0c z&Lhob0V@|TIu|uF7w`MeB{H5-mxa{X@D-m8Kk?b{H~nn5+ZirYSt!_N13g)hUXOuv z1%j9r2sX0aMFIO?Qaxotit8iva`eKPWxgWddAlH{LE42ZE49lKfJ$Sj*X2& z_WE*NYHng-=rZ5G-O=NRW@MJ;C!P%H;>OZD{o*(x6CiEvqPd= zGef?+`FwqZd?P>?*P(S)cYb+$ZcWK5iEe$Q3Hf>ox?y77?2Q{6bQ!rt%gUs>F@o*} zuY18(It2QU4q6_ngLDXuGB_W7L_fp5AN%iG^v5ovzx?S zDH6J}40Lf<^44ps!ZM1|+u|j<4KsCxzf^LCeA7YKn6GbMabs{@#9GFs9Y6gk#rduf zbW_E;8Kns;+E)g4hJ;D-)kFxo?4gKtmkM=A23=f-uHvD*Y;8bUM6yJ;9(39D#X~$< z$ae|o;yUzKmKDU;Cj@2%NOW~^CgdA0RwveXU&UKOX5?w8vH+CH+Y|wd& zKz|ZoRxmD362;Tu67h7HWX^QxiRWLmDvD(+2~t?oKq@^Aq%o&~bTg*`G&5iGTHtCc zEXbBoeO@l^bB4IjnWp#IxFBC0T=tzuPRHC=%<%nFp7U4d}nGM6rWjTV1V z=5We>)b_WE2dyIIwz7-J;@<^}FM%PAt)e4wb!uK^TuMu#WJuS{U_sd0dISq966Ior~q`0vtZr2@ZzANzV%Xz*Um7zV#{n6^34NXT!);5 zh}hJU{^0UrNxtSmZhak?5ocBMGoftJ$3 zil}zq@K}j%P3#N~&!_vKpu0kxZe(9YabA2|P`gA{2WuksS;GeZ0FthxhTvN95Udgp z!D`coAl&bSGfW7*zam}b*V03II>iO(5*MJ`^aAj$wpl8e(@-zf=z4LZed0#@ zO>fkA-6_SB>>#Vw8|YdOF>Afi%v!tKg~OyL*y(? z@D6OD8L9O>YYUgfrwmF4dEE@&fj#Lz1#7Mn>-J`)4OMr9HWy1*hdP)_?qMGMs{W6H zZlzeauO%|me@SI;RJk-?@X%>=e=m4l1?UI{Oi}E+gTiw%k=bX=qQe&gb_)ot2M;&JG)Q8ns?vG48a( z|49eKwkiuN=D>fHH5C7e9*Y0W9E$&9=1^4Iu^sPUDf9U^vHASF*nIxOT=P-5F(;bM zte$V7d;SMz&xg(I`K0x-6M2l4$m4V(24*5pn3)K_-^aTky3fO|Nbf`ciIvNr>0JK8 z%;iZla}kOX!CI31H+4-sCB7#9D!wNEX8JXOTIILl@43r(nXLb#<#w{mhIFTZ!%;?0 zX@jwkJ*Bfdu(&g}C?_;iGWIny>=a;6c|-7&7SP3>vOcgZGi7;Ds)Ip-!p&XlL3d;FqFj1^ej-U2Mb6OZxMxGHY|YdnNfcfDKP$m!|~X^o&xd zg|F1))(l9eWi3pf)94-$>d*nYxV{7ZYXb%%vtrt$`D$j+#rFOdI(P4|4B%bb01h$@ z;5{=9VA6Trq+$pQj6cfm!g2_fc>(=dufanJT~)aRELS7vQQn z1u(u+A$@+2PV+TZ_dlh({~5FUpWjFK(e-xEB|d(N`#jq3;U@tbc#4Z(Bp9)WL61$U zzdt;;wNIB`u~cGGwI=M#a8{FMGGYt5*i1Samgg09_ayg4Npv+}e)l$2PA2Fo#JU-Y zA?*&=Dv53_>~pYnu~~mVc~3GT z2VHzm(zGGTJ2^=c+LR&Dt(jrc!uL>L3;A-Oi}P*FPH5}(jc8aSz1OLO^EOSsUkH! z%2|k7<>aDPIZM-9o!ru3+C7K9Z7zAP!6~SEb2hAcbGByIJHSq~&(GOYJ)R}*v4gnB zj;8n6-7ZXcmLr+tjSGGBvY4>Ym%J=C;vpW>?b&6?DJw#HLKaKLbS-!$+lzT`;{pW_ znj_Y2YFM#2V<^+VMd}qg6ZWz>UqRPZtlQU87?Bgu9gxr`$+rP?r^(k#m^)OUi|3^L zlvGVmVBAnzl0;VrUd;APe(vDr3i&#NF7{$wQhj@CQPW2M1c|QJgt>!r6?Bzi-MWn6 zl>>FFdOK4jy0tSb$nkk|66)Xpy2d(0WtEmJ>s#9?twTNB@Z6&gXdj0|U%%m;S;KBN zJ?vD>VdrAzu;cgD8F%;``r!=e&_{19i(aed+?hFen3;ocv%&IPZXV?W^Tj^kDfWQ{ z=J)`-w#1lgI5n#P-gE(cm<3p9W&zN4i?F}OdXtv(W95QgSQej*Ma*0R%+E#G$14#);w#|M2&D+lLjatwQCNvNP!6?_S~I@5mxB25e*!8 z#+xS?nV(pqY67_igZt%NR=6N$Su5b(p5U34*StShqQ8wYO%Y zZ&XK*RM&)?0WMn5ohR1K@Ac1U@oous)M=8}B>xiBZMR8}r&bS~)SQt5YsxTXJ(Tv%R(ep*Ia z7xdz(*t;{CxvVfV7v87vW*OsaLflGLBIun|aUwa)L~_kcWXhvr<_SW-_#-V!0i8=B zGnb@=vCDzU)tgxFnxhBc{b)T?=m=tQ|K-OeUb8z1DY}L zmjFfr!6EQcvcIcrlCiS2=5m diff --git a/generate_deck.py b/generate_deck.py index ef130b1..117f320 100755 --- a/generate_deck.py +++ b/generate_deck.py @@ -18,21 +18,19 @@ deck = genanki.Deck( ) model= genanki.Model( - 614661503, - 'Simple Model', + 1120858226, + 'Chess Model', fields=[ - {'name': 'Slug'}, - {'name': 'Square'}, - {'name': 'Piece'}, + {'name': 'guid'}, {'name': 'Question'}, {'name': 'Answer'}, {'name': 'Board'}, ], templates=[ { - 'name': 'Card 1', - 'qfmt': '{{Question}} {{Square}}', - 'afmt': '{{FrontSide}}
{{Answer}}
{{Board}}
', + 'name': 'Base Card with SVG board in answer', + 'qfmt': '{{Question}}', + 'afmt': '{{FrontSide}}
{{Answer}} {{Board}}', }, ] ) @@ -41,34 +39,39 @@ class ChessNote(genanki.Note): @property def guid(self): # slug-square-piece - return genanki.guid_for(self.fields[0], self.fields[1], self.fields[2]) + return genanki.guid_for(self.fields[0]) -board = chess.BaseBoard() -board.clear_board() - -notes = [] -for sq_name in chess.SQUARE_NAMES: - # square colors +def square_color(sq_name): sq_id = chess.parse_square(sq_name) sq_file = chess.square_file(sq_id) sq_rank = chess.square_rank(sq_id) - sq_color = 'black' if (sq_file+sq_rank) % 2 == 0 else 'white' - board_svg = chess.svg.board( - board, - squares=chess.SquareSet([sq_id]), - ) - note = ChessNote( - model=model, - fields=[ - 'color', - sq_name, - '', - 'What is the color of square', - sq_color, - board_svg, - ], - ) - notes.append(note) + + guid = f'{sq_name}-color' + question = f'What is the color of square {sq_name}?' + answer = 'black' if (sq_file+sq_rank) % 2 == 0 else 'white' + board_svg = chess.svg.board(None, squares=sq_id) + return ChessNote(model, [guid, question, answer, board_svg]) + +def knight_moves(sq_name): + board = chess.Board().empty() + sq_id = chess.parse_square(sq_name) + board.set_piece_at(sq_id, chess.Piece(chess.KNIGHT, chess.WHITE)) + attacks = board.attacks(sq_id) + + guid = f'{sq_name}-knight-moves' #guid + question = f'Where can the knight move from square {sq_name}?' + answer = ', '.join(chess.SQUARE_NAMES[sq] for sq in list(attacks)) + board_svg = chess.svg.board(board, fill=dict.fromkeys(attacks, "#cc0000cc")) + # return ChessNote(model, [guid, question, answer, board_svg]) + return ChessNote(model, [guid,question,answer,board_svg]) + +def notes(): + # square colors + for sq_name in chess.SQUARE_NAMES: + yield square_color(sq_name) + yield knight_moves(sq_name) + +notes = list(notes()) # randomize the order of the notes random.shuffle(notes) @@ -76,4 +79,4 @@ for note in notes: deck.add_note(note) genanki.Package(deck).write_to_file('chess.apkg') -print('Deck generated: chess.apkg') +print(f'Created deck chess.apkg with {len(deck.notes)} notes')