From 040c8022d205c56f6245f77a3218d6be09b62e5d Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Fri, 25 Dec 2009 20:46:30 +0000 Subject: more options for numbers game --- diff --git a/gencards.py b/gencards.py index d04861b..621096f 100755 --- a/gencards.py +++ b/gencards.py @@ -22,6 +22,7 @@ import os from gettext import gettext as _ import random +from math import sin, cos, pi RED_STROKE = "#FF6040" RED_FILL = "#FFC4B8" @@ -29,8 +30,8 @@ BLUE_STROKE = "#0060C8" BLUE_FILL = "#ACC8E4" GREEN_STROKE = "#00B418" GREEN_FILL = "#AFE8A8" -PURPLE_STROKE = "#780078" -PURPLE_FILL = "#E4AAE4" +# PURPLE_STROKE = "#780078" +# PURPLE_FILL = "#E4AAE4" color_pairs = ([RED_STROKE,RED_FILL], [GREEN_STROKE,GREEN_FILL], @@ -39,11 +40,89 @@ color_pairs = ([RED_STROKE,RED_FILL], fill_styles = ("none","gradient","solid") card_types = ("X","O","C") +roman_numerals = {5:'V',7:'VII',10:'X',11:'XI',14:'XIV',15:'XV',\ + 21:'XXI',22:'XXII',33:'XXXIII'} + +number_names = {5:_('five'),7:_('seven'),11:_('eleven'),10:_('ten'),\ + 14:_('fourteen'),15:_('fifteen'),22:_('twenty two'),\ + 21:_('twenty one'),33:_('thirty three')} + +# +# SVG generators +# +def svg_rect(f,w,h,rx,ry,x,y,stroke,fill,stroke_width): + f.write(" \n") + +def svg_circle(f,cx,cy,r,stroke,fill,stroke_width): + f.write(" \n") + +def svg_line(f,x1,y1,x2,y2,stroke,stroke_width): + f.write("\n") + +def svg_text(f,x,y,size,stroke,font,style,string): + f.write(" \n") + f.write(" "+string+"\n") + f.write(" \n") + + +def svg_check(f, x, style, stroke, fill): + f.write("\n") + elif style == "gradient": + f.write(" style=\"fill:"+fill+";stroke:"+stroke+\ + ";stroke-width:1.8;\" />\n") + else: + f.write(" style=\"fill:"+stroke+";stroke:"+stroke+\ + ";stroke-width:1.8;\" />\n") + +def svg_cross(f, x, style, stroke, fill): + f.write("\n") + elif style == "gradient": + f.write(" style=\"fill:"+fill+";stroke:"+stroke+\ + ";stroke-width:1.8;\" />\n") + else: + f.write(" style=\"fill:"+stroke+";stroke:"+stroke+\ + ";stroke-width:1.8;\" />\n") + def background(f,stroke,fill,width): - f.write("\n") + svg_rect(f,124.5,74.5,11,9,0.25,0.25,stroke,fill,width) def header(f,stroke,fill,width): f.write("\n") @@ -61,172 +140,280 @@ def footer(f): f.write("\n") f.write("\n") -def dots(f, n, x, y, stroke): - f.write(" \n") +# +# Card pattern generators +# +def line_of_dots(f, n, x, y, stroke): + f.write("\n") if n%5 == 0: - ox = 37.5 - j = 5 + cx = 37.5 elif n%7 == 0: - ox = 27.5 - j = 7 + cx = 27.5 else: - ox = 7.5 - j = 11 + cx = 7.5 + cy = 5 + for i in range(n): + svg_circle(f,cx,cy,3,stroke,stroke,2) + cx += 10 + f.write("\n") + +def hash(f, n, x, y, stroke): + f.write("\n") + if n%5 == 0: + cx = 42.5 + elif n%7 == 0: + cx = 32.5 + else: + cx = 22.5 + cy = 5 + x1 = 7.5+cx + x2 = cx + for i in range(n): + if (i+1)%5==0: + svg_line(f,x1-40,7.5,x2,7.5,stroke,1.8) + else: + svg_line(f,x1,0,x2,15,stroke,1.8) + x1 += 7.5 + x2 += 7.5 + f.write("\n") + +def dots_in_a_line(f, t, n, stroke): if n%3 == 0: - oy = 12.5 + y = 12.5 + nn = n/3 elif n%2 == 0: - oy = 22.5 + y = 22.5 + nn = n/2 + else: + y = 32.5 + nn = n + if n%5 == 0: + n/=5 + elif n%7 == 0: + n/=7 else: - oy = 32.5 - x = ox - y = oy + n/=11 for i in range(n): - f.write(" \n") - x += 10 - if (i+1)%j == 0: - x = ox - y += 20 - f.write(" \n") + line_of_dots(f, nn, 5, y, stroke) + y += 20 + +def circle_of_dots(f, n, x, y, stroke): + f.write("\n") + j = n + ox = 0 + oy = 32.5 + if j == 5: + r = 9 + elif j == 7: + r = 13 + else: + r = 17 + da = pi*2/j + a = 0 + x = ox+sin(a)*r + y = oy+cos(a)*r + for i in range(n): + svg_circle(f,x,y,3,stroke,stroke,2) + a += da + x = ox+sin(a)*r + y = oy+cos(a)*r + f.write("\n") + +def points_in_a_star(f, t, n, stroke): + if n%3 == 0: + x = 25 + nn = n/3 + elif n%2 == 0: + x = 37.5 + nn = n/2 + else: + x = 62.5 + nn = n + if n%5 == 0: + n/=5 + y = 15 + elif n%7 == 0: + n/=7 + y = 15 + else: + n/=11 + y = 15 + for i in range(n): + if n == 3: + if i == 0: + y+=12 + elif i == 1: + y-=24 + else: + y+=24 + star(f, nn, x, y, stroke) + if n == 2: + x += 50 + else: + x += 37.5 + +def dots_in_a_circle(f, t, n, stroke): + if n%3 == 0: + x = 25 + nn = n/3 + elif n%2 == 0: + x = 37.5 + nn = n/2 + else: + x = 62.5 + nn = n + if n%5 == 0: + n/=5 + y = 5 + elif n%7 == 0: + n/=7 + y = 5 + else: + n/=11 + y = 5 + for i in range(n): + if n == 3: + if i == 0: + y+=12 + elif i == 1: + y-=24 + else: + y+=24 + circle_of_dots(f, nn, x, y, stroke) + if n == 2: + x += 50 + else: + x += 37.5 def die(f, n, x, y, stroke): - f.write(" \n") - f.write(" \n") + f.write("\n") + svg_rect(f,25,25,2,2,0,0,stroke,"none",1.5) if n in [2,3,4,5,6]: - f.write(" \n") - f.write(" \n") + svg_circle(f,6,6,1.5,stroke,stroke,2) + svg_circle(f,19,19,1.5,stroke,stroke,2) if n in [1,3,5]: - f.write(" \n") + svg_circle(f,12.5,12.5,1.5,stroke,stroke,2) if n in [4,5,6]: - f.write(" \n") - f.write(" \n") + svg_circle(f,19,6,1.5,stroke,stroke,2) + svg_circle(f,6,19,1.5,stroke,stroke,2) if n in [6]: - f.write(" \n") - f.write(" \n") - f.write(" \n") + svg_circle(f,6,12.5,1.5,stroke,stroke,2) + svg_circle(f,19,12.5,1.5,stroke,stroke,2) + f.write("\n") -def circle(f, x, style, stroke, fill): - f.write("\n") - elif style == "gradient": - f.write(" style=\"fill:" + fill + ";stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") +def number_hash(f, t, n, stroke): + if n%3 == 0: + y = 12.5 + nn = n/3 + elif n%2 == 0: + y = 22.5 + nn = n/2 else: - f.write(" style=\"fill:" + stroke + ";stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") - f.write("\n") - -def check(f, x, style, stroke, fill): - f.write("\n") - elif style == "gradient": - f.write(" style=\"fill:" + fill + ";stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") + y = 32.5 + nn = n + if n%5 == 0: + n/=5 + elif n%7 == 0: + n/=7 else: - f.write(" style=\"fill:" + stroke + ";stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") + n/=11 + for i in range(n): + hash(f, nn, 5, y, stroke) + y += 20 + -def cross(f, x, style, stroke, fill): - f.write("\n") + turns = turntable[n] + x1 = 0 + y1 = 0 + a = 0 + for i in range(n*turns): + x2 = x1+sin(a)*40 + y2 = y1+cos(a)*40 + svg_line(f,x1,y1,x2,y2,stroke,1.8) + x1 = x2 + y1 = y2 + a += turns*2*pi/n + f.write("\n") + +def circle(f, x, style, stroke, fill): if style == "none": - f.write(" style=\"fill:#FFFFFF;stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") + svg_circle(f,x+17,38,16,stroke,"#FFFFFF",1.8) elif style == "gradient": - f.write(" style=\"fill:" + fill + ";stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") + svg_circle(f,x+17,38,16,stroke,fill,1.8) else: - f.write(" style=\"fill:" + stroke + ";stroke:" + stroke + \ - ";stroke-width:1.8;\" />\n") + svg_circle(f,x+17,38,16,stroke,stroke,1.8) + svg_circle(f,x+17,38,8,stroke,fill,1.8) def check_card(f, n, style, stroke, fill): if n == 1: - check(f, 45.5, style, stroke, fill) + svg_check(f, 45.5, style, stroke, fill) elif n == 2: - check(f, 25.5, style, stroke, fill) - check(f, 65.5, style, stroke, fill) + svg_check(f, 25.5, style, stroke, fill) + svg_check(f, 65.5, style, stroke, fill) else: - check(f, 5.5, style, stroke, fill) - check(f, 45.5, style, stroke, fill) - check(f, 85.5, style, stroke, fill) + svg_check(f, 5.5, style, stroke, fill) + svg_check(f, 45.5, style, stroke, fill) + svg_check(f, 85.5, style, stroke, fill) def cross_card(f, n, style, stroke, fill): if n == 1: - cross(f, 45.5, style, stroke, fill) + svg_cross(f, 45.5, style, stroke, fill) elif n == 2: - cross(f, 25.5, style, stroke, fill) - cross(f, 65.5, style, stroke, fill) + svg_cross(f, 25.5, style, stroke, fill) + svg_cross(f, 65.5, style, stroke, fill) else: - cross(f, 5.5, style, stroke, fill) - cross(f, 45.5, style, stroke, fill) - cross(f, 85.5, style, stroke, fill) + svg_cross(f, 5.5, style, stroke, fill) + svg_cross(f, 45.5, style, stroke, fill) + svg_cross(f, 85.5, style, stroke, fill) def circle_card(f, n, style, stroke, fill): if n == 1: @@ -239,81 +426,41 @@ def circle_card(f, n, style, stroke, fill): circle(f, 45.5, style, stroke, fill) circle(f, 85.5, style, stroke, fill) -def number(f, x, string, stroke): - f.write(" \n") - f.write(" "+string+"\n") - f.write(" ") +def number_arabic(f, t, n, stroke): + x = 63.5 + string = str(n) + svg_text(f,x,55.25,48,stroke,"DejaVu","",string) + +def number_roman(f, t, n, stroke): + x = 63.5 + string = roman_numerals[n] + svg_text(f,x,53.25,32,stroke,"DejaVu Serif","",string) + +def number_word(f, t, n, stroke): + x = 63.5 + strings = number_names[n].split(' ') + if len(strings) == 1: + svg_text(f,x,48.25,26,stroke,"DejaVu Serif","",strings[0]) + else: + svg_text(f,x,35.25,26,stroke,"DejaVu Serif","",strings[0]) + svg_text(f,x,63.25,26,stroke,"DejaVu Serif","",strings[1]) -def number_card(f, t, n, stroke): +def number_card(f, t, n, stroke, methodX, methodO, methodC): if t == 'X': - number(f, 63.5, str(n), stroke) + methodX(f, t, n, stroke) elif t == 'O': - if n == 5: - die(f, 5, 50, 25, stroke) - elif n == 10: - die(f, 5, 30, 25, stroke) - die(f, 5, 70, 25, stroke) - elif n == 15: - die(f, 5, 15, 25, stroke) - die(f, 5, 50, 25, stroke) - die(f, 5, 85, 25, stroke) - elif n == 7: - die(f, 3, 50, 10, stroke) - die(f, 4, 50, 40, stroke) - elif n == 14: - die(f, 4, 30, 10, stroke) - die(f, 3, 70, 10, stroke) - die(f, 3, 30, 40, stroke) - die(f, 4, 70, 40, stroke) - elif n == 21: - die(f, 3, 15, 10, stroke) - die(f, 4, 50, 10, stroke) - die(f, 3, 85, 10, stroke) - die(f, 4, 15, 40, stroke) - die(f, 3, 50, 40, stroke) - die(f, 4, 85, 40, stroke) - elif n == 11: - die(f, 5, 50, 10, stroke) - die(f, 6, 50, 40, stroke) - elif n == 22: - die(f, 6, 30, 10, stroke) - die(f, 5, 70, 10, stroke) - die(f, 5, 30, 40, stroke) - die(f, 6, 70, 40, stroke) - elif n == 33: - die(f, 5, 15, 10, stroke) - die(f, 6, 50, 10, stroke) - die(f, 5, 85, 10, stroke) - die(f, 6, 15, 40, stroke) - die(f, 5, 50, 40, stroke) - die(f, 6, 85, 40, stroke) + methodO(f, t, n, stroke) else: - dots(f, n, 5, 5, stroke) - -def word(f, x, string, stroke,style): - f.write(" \n") - f.write(" "+string+"\n") - f.write(" ") + methodC(f, t, n, stroke) def word_card(f, t, s, string, stroke): if t == 'X': - word(f, 63.5, string[s], stroke, "font-weight:bold;") + svg_text(f,63.5,45.5,30,stroke,"DejaVu","font-weight:bold;",string[s]) elif t == 'O': - word(f, 63.5, string[s], stroke, "font-style:italic;") + svg_text(f,63.5,45.5,30,stroke,"DejaVu Serif","font-style:italic;",\ + string[s]) else: - word(f, 63.5, string[s], stroke, "") + svg_text(f,63.5,45.5,30,stroke,"DejaVu","",string[s]) def open_file(datapath, filename): return file(os.path.join(datapath, filename), "w") @@ -342,6 +489,24 @@ def generator(datapath): i += 1 # number cards + # choose different card styles each time + methodX = number_arabic + r = random.randrange(3) + if r == 0: + methodO = number_roman + elif r == 1: + methodO = number_hash + else: + methodO = number_word + r = random.randrange(4) + if r == 0: + methodC = dots_in_a_line + elif r == 1: + methodC = dots_in_a_circle + elif r == 2: + methodC = points_in_a_star + else: + methodC = dice i = 0 for t in card_types: # ignoring this field for c in color_pairs: @@ -350,7 +515,7 @@ def generator(datapath): filename = "number-%d.svg" % (i) f = open_file(datapath, filename) header(f,"#000000",c[1],"0.5") - number_card(f,t,n*s,c[0]) + number_card(f,t,n*s,c[0],methodX,methodO,methodC) footer(f) close_file(f) i += 1 -- cgit v0.9.1