python小游戏

核心提示#五子棋import appuifw,e32,key_codesfrom graphics import *def cn(x):return x.decode('utf-8')def quit(): _quit=1global runnin

#五子棋import appuifw,e32,key_codes

from graphics import *def cn(x):return x.decode('utf-8')

def quit(): _quit=1

global running

running=1

def redraw(rect): canvas.blit(img)def default():

global con,color,font

con={"l":15,"x":15,"y":33,"r":13,"n":15}

color={"bg":0x7777bb,"fg":0x333333,"p1":0x000000,"p2":0xffffff,"w":0xff0000}

font=u"Sans MT 936_S60"def initial():

global img,canvas,con,color,cur_x,cur_y,turn,pos1,pos2,pos

appuifw.app.screen='full'

appuifw.app.body=canvas=appuifw.Canvas()

img=Image.new((240,320))

img.clear(color["bg"])

cur_x=7

cur_y=7

turn=1

pos1=[]

pos2=[]

pos=[]

for i in range(con["n"]*con["n"]):

pos.append(0)def paint_back():

global img,color,font

#img.text((90,25),cn('欢乐五子棋'),color["fg"],font)

for i in range(con["x"],con["x"]+con["l"]*con["n"]-1,con["l"]):

img.line((i,con["y"],i,con["y"]+con["l"]*(con["n"]-1)),color["fg"])

for i in range(con["y"],con["y"]+con["l"]*con["n"]-1,con["l"]):

img.line((con["x"],i,con["x"]+con["l"]*(con["n"]-1),i),color["fg"])

img.text((40,270),cn('玩家1'),color["p1"],font)

img.text((160,270),cn('玩家2'),color["p2"],font)

img.point((90,263),color["p1"],width=con["r"],fill=color["p1"])

img.point((144,263),color["p2"],width=con["r"],fill=color["p2"])

def paint_cur(x,y,sh):

global img,con,color,pos1,pos2,running

if running<>1:return

ax=con["x"]+con["l"]*x

ay=con["y"]+con["l"]*y

b=con["l"]/2

if sh<>0:

c=color["p"+str(sh)]

if rp((x,y))<>0:

c=color["w"]

if sh==0:

c=color["bg"]

img.line((ax-b,ay-2,ax-b,ay-b,ax-2,ay-b),c)

img.line((ax-b,ay+2,ax-b,ay+b,ax-2,ay+b),c)

img.line((ax+b,ay-2,ax+b,ay-b,ax+2,ay-b),c)

img.line((ax+b,ay+2,ax+b,ay+b,ax+2,ay+b),c)

redraw(())def paint_q(x,y,z):

global img,con,color

ax=con["x"]+con["l"]*x

ay=con["y"]+con["l"]*y

b=con["l"]/2

if z==0:

c=color["bg"]

else:

c=color["p"+str(z)]

img.point((ax,ay),c,width=con["r"],fill=c)

redraw(())

if z==0:

img.line((ax-b,ay,ax+b,ay),c)

img.line((ax,ay-b,ax,ay+b),c)

def k_up():

global cur_x,cur_y,con,turn

paint_cur(cur_x,cur_y,0)

cur_y=cur_y-1

if cur_y==-1:

cur_y=con["n"]-1

paint_cur(cur_x,cur_y,turn)def k_down():

global cur_x,cur_y,con,turn

paint_cur(cur_x,cur_y,0)

cur_y=cur_y+1

if cur_y==con["n"]:

cur_y=0

paint_cur(cur_x,cur_y,turn)def k_left():

global cur_x,cur_y,con,turn

paint_cur(cur_x,cur_y,0)

cur_x=cur_x-1

if cur_x==-1:

cur_x=con["n"]-1

paint_cur(cur_x,cur_y,turn)def k_right():

global cur_x,cur_y,con,turn

paint_cur(cur_x,cur_y,0)

cur_x=cur_x+1

if cur_x==con["n"]:

cur_x=0

paint_cur(cur_x,cur_y,turn)def rp(x):

global con,pos

if (x[0]<0 or x[0]>=con["n"] or x[1]<0 or x[1]>=con["n"]):return 0

#print x,pos[x[0]*con["n"]+x[1]]

return pos[x[0]*con["n"]+x[1]]def wp(x,y):

global con,pos

pos[x[0]*con["n"]+x[1]]=y

def win():

for i in pos1:

k=0

for j in range(0,6):

if rp((i[0]+j,i[1]))==1:

k=k+1

else:

break

if k>=5:

return 1

k=0

for j in range(0,6):

if rp((i[0],i[1]+j))==1:

k=k+1

else:

break

if k>=5:

return 1

k=0

for j in range(0,6):

if rp((i[0]+j,i[1]+j))==1:

k=k+1

else:

break

if k>=5:

return 1

k=0

for j in range(0,6):

if rp((i[0]+j,i[1]-j))==1:

k=k+1

else:

break

if k>=5:

return 1 for i in pos2:

k=0

for j in range(0,6):

if rp((i[0]+j,i[1]))==2:

k=k+1

else:

break

if k>=5:

return 2

k=0

for j in range(0,6):

if rp((i[0],i[1]+j))==2:

k=k+1

else:

break

if k>=5:

return 2

k=0

for j in range(0,6):

if rp((i[0]+j,i[1]+j))==2:

k=k+1

else:

break

if k>=5:

return 2

k=0

for j in range(0,6):

if rp((i[0]+j,i[1]-j))==2:

k=k+1

else:

break

if k>=5:

return 2

return 0

def k_enter():

global cur_x,cur_y,turn,pos1,pos2,con,color,font,running

if running<>1:return

if rp((cur_x,cur_y))==0:

if turn==1:

pos1.append((cur_x,cur_y))

img.rectangle((35,255,100,272),color["bg"])

img.rectangle((135,255,200,272),color["p2"])

if turn==2:

pos2.append((cur_x,cur_y))

img.rectangle((35,255,100,272),color["p1"])

img.rectangle((135,255,200,272),color["bg"])

paint_q(cur_x,cur_y,turn)

wp((cur_x,cur_y),turn)

if win()<>0:

#img.text((80,300),cn('玩家')+str(turn)+cn("获胜!"),color["fg"],font)

img.rectangle((35,255,100,272),color["bg"])

img.rectangle((135,255,200,272),color["bg"])

paint_cur(cur_x,cur_y,0)

running=2

turn=3-turn

paint_cur(cur_x,cur_y,turn)def bindkey():

canvas.bind(key_codes.EKeyUpArrow, k_up)

canvas.bind(key_codes.EKeyDownArrow,k_down)

canvas.bind(key_codes.EKeyLeftArrow, k_left)

canvas.bind(key_codes.EKeyRightArrow,k_right)

canvas.bind(key_codes.EKeySelect,k_enter)default()

initial()

paint_back()

paint_cur(cur_x,cur_y,1)

img.rectangle((35,255,100,272),color["p1"])

bindkey()redraw(())

appuifw.app.exit_key_handler = quit()

_quit=0

while (1-_quit):

e32.ao_sleep(0.2)

redraw(())

游戏规则:从一副扑克牌中抽取4张牌,对4张牌使用加减乘除中的任何方法使计算结果为24,例如(((4-2)+6)*3) = 24,最快算出24者胜。

实现思路:参照原作者想法,由于设计到了表达式,很自然的想到了用二叉树来实现。简单概括为:先列出所有表达式的可能性,然后运用表达式树,也就是二叉树计算表达式的值,当然还需要使用递归来具体实现各个功能,下面我们具体来实现下吧。

表达式树的所有叶子节点均为操作数(operand), 其它节点为运算符(operator),本次采用二叉树来表示表达式中各个属性的值,这样也方便我们计算。

首先是遍历所有表达式的可能情况,这里得到得是操作数所有可能得情况,假如传入的l是序列[1,2,3,4],count1是4,count2是4,那么得到的结果就是12个随机且不重复的[1,2,3,4]序列

同理,产生运算符的不同排列结果

然后根据传入的表达式的值,构造表达式树,首先我们创建一个表示节点的类

然后树的形式无非两种,就是上面大家看到的两种形式,用程序表示出来就是两种函数,参数分别对应了运算符和运算符,还是比较好理解的,知识涉及一些二叉树的知识。

然后就是计算表达式树的值,这里也运用了递归。

输出所有可能的结果,这里注意print_node方法也是使用的递归来打印数据,并且使用 end='' 去掉了换行符。

最后在程序的入口调用calculate方法,并传入数据,也就是你得到的牌。

成果:

 
友情链接
鄂ICP备19019357号-22