A classic spider solitaire game.
Due to an obvious lack of screen space, if there is a stack of card only the one on top and at the bottom will be shown.
How to play :
L&R to move cursor
down arrow to select.
Shift to deal new cards
from random import * from kandinsky import fill_rect as f,draw_string as d from ion import * from time import * def draw(x): y=len(board[x])-1 f(29*x,height(x)-1,29,22+20*(board[x][y][1]!=1),COLORS[3]) f(29*x+1,height(x),27,20+20*(board[x][y][1]!=1),COLORS[2]) d(INDEX[board[x][y][0]],29*x+10-5*(board[x][y][0]==9),height(x),COLORS[1],COLORS[2]) if 1-board[x][y][1]: d(INDEX[board[x][y][0]-board[x][y][1]+1],29*x+10-5*((board[x][y][0]-board[x][y][1])==8),height(x)+20,COLORS[1],COLORS[2]) def height(x): h=21*len(board[x])+1 for i in range(len(board[x])-1): if board[x][i][1]!=1: h+=21 return h COLORS=( (41,42,43),# background (255,255,255),# text (41,42,43),# cards (100,100,100),# back (50,190,50),# cursor (50,50,190))# select INDEX=("A","2","3","4","5","6","7","8","9","10","J","Q","K") t=monotonic() board=[[] for _ in range(10)] stack=[i//8 for i in range(104)] hid=[[] for _ in range(10)] for a in range(54): r=randrange(len(stack)) if a>43: board[a%10].append([stack[r],1]) else: hid[a%10].append(stack[r]) del stack[r] sel=-1 cur=0 count=0 key_pressing={KEY_DOWN:0,KEY_SHIFT:0} key_pressed={k:0 for k in key_pressing} run=1 f(0,0,320,222,COLORS[0]) for a in range(10): f(29*a+1,0,27,20,COLORS[4-bool(a)]) d(str(len(hid[a])),29*a+10,0,COLORS[1],COLORS[4-bool(a)]) for b in range(len(board[a])): draw(a) d(str(len(stack)//10),292,10,COLORS[1],COLORS[0]) while run: check=0 for k in key_pressing: key_pressed[k]=0 if keydown(k): if not key_pressing[k]: key_pressed[k]=1 key_pressing[k]=1 else: key_pressing[k]=0 if monotonic()-t>0.13 and (keydown(KEY_RIGHT)-keydown(KEY_LEFT)): t=monotonic() f(29*cur+1,0,27,20,COLORS[3+2*(sel==cur)]) d(str(len(hid[cur])),29*cur+10,0,COLORS[1],COLORS[3+2*(sel==cur)]) cur=(cur-keydown(KEY_LEFT)+keydown(KEY_RIGHT))%10 f(29*cur+1,0,27,20,COLORS[4+(sel==cur)]) d(str(len(hid[cur])),29*cur+10,0,COLORS[1],COLORS[4+(sel==cur)]) elif sel!=-1 and keydown(KEY_UP): f(29*sel+1,0,27,20,COLORS[3+(sel==cur)]) d(str(len(hid[sel])),29*sel+10,0,COLORS[1],COLORS[3+(sel==cur)]) sel=-1 elif key_pressed[KEY_DOWN]: if sel==-1: if len(board[cur]): sel=cur f(29*cur+1,0,27,20,COLORS[5]) d(str(len(hid[cur])),29*cur+10,0,COLORS[1],COLORS[5]) elif sel==cur: f(29*sel+1,0,27,20,COLORS[4]) d(str(len(hid[sel])),29*sel+10,0,COLORS[1],COLORS[4]) sel=-1 else: check=1 do=1 if len(board[cur])==0: board[cur].append(board[sel][-1]) elif board[cur][-1][0]-board[cur][-1][1]==board[sel][-1][0]: board[cur][-1][1]+=board[sel][-1][1] elif 0>board[cur][-1][0]-board[cur][-1][1]-board[sel][-1][0]>-board[sel][-1][1]: delta=board[sel][-1][0]-board[sel][-1][1]-board[cur][-1][0]+board[cur][-1][1] board[cur][-1][1]-=delta board[sel][-1][1]+=delta do=2 else: do=0 if do: f(29*sel,height(sel),29,42,COLORS[0]) f(29*sel+1,0,27,20,COLORS[3]) d(str(len(hid[sel])),29*sel+10,0,COLORS[1],COLORS[3]) draw(cur) if do==1: board[sel].pop(-1) else: draw(sel) sel=-1 elif sel==-1 and key_pressed[KEY_SHIFT] and len(stack): check=1 for a in range(10): r=randrange(len(stack)) if len(board[a]) and board[a][-1][0]-board[a][-1][1]==stack[r]: board[a][-1][1]+=1 else: board[a].append([stack[r],1]) stack.pop(r) draw(a) d(str(len(stack)//10),292,10,COLORS[1],COLORS[0]) if check: for a in range(10): if len(board[a]) and board[a][-1][1]==13: f(29*a,height(a),29,42,COLORS[0]) board[a].pop(-1) count+=1 if len(board[a])==0 and len(hid[a])>0: board[a].append([hid[a][-1],1]) hid[a].pop(-1) draw(a) d(str(len(hid[a])),29*a+10,0,COLORS[1],COLORS[3+(a==cur)]) if count==8: f(0,0,320,222,COLORS[0]) d("YOU WIN",125,104,COLORS[1],COLORS[0]) run=0