pygame 练习 五子棋
Posted fluentsc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pygame 练习 五子棋相关的知识,希望对你有一定的参考价值。
1 import pygame 2 from pygame.locals import * 3 pygame.init()#导入,初始化 4 #-------------------------------------一些初始化的东西 5 ScreenSize=(800,800) 6 font=pygame.font.SysFont(‘ubuntumono‘,30)#这个字体建议改成自己有的例如下面: 7 #font=pygame.font.Font(‘字体路径/msyh.ttf‘,30) 8 #font=pygame.font.SysFont(‘consolas‘,30) 9 10 bw=font.render(‘black is win!‘,True,(0,0,0))#黑棋胜利白旗胜利black_win,write_win 11 ww=font.render(‘write is win!‘,True,(255,255,255)) 12 13 shuoming=font.render(‘press o to restart!‘,True,(0,255,0))#按下o键,重新开始游戏 14 15 smb=font.render(‘is time!‘,True,(0,0,0))#说明黑,说明白,就是该谁走了,花哨一点 16 smw=font.render(‘is time!‘,True,(255,255,255)) 17 18 screen=pygame.display.set_mode(ScreenSize,0,32) 19 20 21 #--------------------------------------一些功能,落子,判定输赢 22 23 #棋子,items【0】是黑棋棋子,items【1】是白棋棋子,例如items[0].append([x,y,0]),就是在x,y处下了一个黑棋 24 items=[[],[]] 25 player=0#该谁走了,0是黑,1是白。当前下棋人。 26 27 def Plane(x,y,linesNum,interval,lineWidth=2):#画五子棋棋盘,x,y是棋盘左上角坐标,linesnum是行数,interval是行间距,linewidth是线宽 28 mx=x 29 my=y 30 w=mx+(linesNum-1)*interval 31 h=my+(linesNum-1)*interval 32 for i in range(linesNum): 33 pygame.draw.line(screen,(90,140,26),(mx,my),(w,my),lineWidth) 34 my+=interval 35 for i in range(linesNum): 36 pygame.draw.line(screen,(90,140,26),(x,y),(x,h),lineWidth) 37 x+=interval 38 39 def JudgePos(x,y):#这个是判定落点,根据鼠标位置判定落到哪个交点上。ms,x,z,y是上下左右。正方形内某个点距离四周多少来判断落到哪个点。 40 ms,mx,mz,my=0,0,0,0 41 ms=y%50 42 mx=50-ms 43 mz=x%50 44 my=50-mz 45 if ms<=mx and mz>=my: 46 return (x//50*50+50,y//50*50) 47 if ms<=mx and mz<my: 48 return (x//50*50,y//50*50) 49 if ms>mx and mz>=my: 50 return (x//50*50+50,y//50*50+50) 51 if ms>mx and mz<my: 52 return (x//50*50,y//50*50+50) 53 def DumpHand():#落子,就是把items里的画一遍 54 if len(items)!=0: 55 for li in items: 56 for i in li: 57 if i[2]==0: 58 pygame.draw.circle(screen,(0,0,0),(i[0],i[1]),22) 59 if i[2]==1: 60 pygame.draw.circle(screen,(255,255,255),(i[0],i[1]),22) 61 else: 62 pass 63 64 def Jugg1(x,y,pl):#jugg1~4是五子棋四种胜利方式:横,竖,左斜,右斜 65 tem=1 66 for i in range(1,5): 67 if [x+i*50,y,pl] in items[pl]: 68 tem+=1 69 if tem==5: 70 return 1 71 else : 72 return 0 73 def Jugg2(x,y,pl): 74 tem=1 75 for i in range(1,5): 76 if [x+i*50,y+i*50,pl] in items[pl]: 77 tem+=1 78 if tem==5: 79 return 1 80 else : 81 return 0 82 def Jugg3(x,y,pl): 83 tem=1 84 for i in range(1,5): 85 if [x,y+i*50,pl] in items[pl]: 86 tem+=1 87 if tem==5: 88 return 1 89 else : 90 return 0 91 def Jugg4(x,y,pl): 92 tem=1 93 for i in range(1,5): 94 if [x-i*50,y+i*50,pl] in items[pl]: 95 tem+=1 96 if tem==5: 97 return 1 98 else : 99 return 0 100 101 def Judge():#把上面四个用一下,这里jugg几个是我为了省事写的。判断五子棋输赢用回溯也可以反正能用就行 102 for li in items: 103 for i in li: 104 if Jugg1(i[0],i[1],i[2]): 105 return 1 106 if Jugg2(i[0],i[1],i[2]): 107 return 1 108 if Jugg3(i[0],i[1],i[2]): 109 return 1 110 if Jugg4(i[0],i[1],i[2]): 111 return 1 112 113 114 #------------------------------开始主体 115 116 x,y=-100,-100#int一个坐标 117 screen.fill((50,120,99))#初始化屏幕,打印棋盘 118 Plane(50,50,(ScreenSize[0]-100)//50,50) 119 120 scene=0#控制场景,我就写了两个。0是游戏,1是胜利。 121 122 123 124 while 1:#一个循环让游戏不断进行,用scene进行场景控制 125 126 if scene==0: 127 while 1: 128 for e in pygame.event.get(): 129 if e.type==MOUSEBUTTONDOWN: 130 if e.button==1: 131 x,y=e.pos 132 x,y=JudgePos(x,y)#落子并且不能覆盖之前的棋子 133 if [x,y,0] not in items[0] and [x,y,1] not in items[1]: 134 items[player].append([x,y,player]) 135 player+=1#换人走了 136 if player>1: 137 player=0 138 139 140 #该谁走了,其实没啥用 141 if player==1: 142 pygame.draw.circle(screen,(255,255,255),(200,25),22) 143 screen.blit(smw,(130,12)) 144 else: 145 pygame.draw.circle(screen,(0,0,0),(200,25),22) 146 screen.blit(smb,(130,12)) 147 148 #画棋子,blit可以渲染一小部分,或者surface的设置剪辑set_clip()来优化,我直接全画一遍 149 DumpHand() 150 151 #判断输赢 152 if Judge(): 153 scene=1 154 break 155 156 pygame.display.update() 157 158 if scene==1: 159 while 1: 160 161 screen.fill((50,120,99)) 162 #一些说明 163 if player==0: 164 screen.blit(ww,(50,50)) 165 else: 166 screen.blit(bw,(50,50)) 167 screen.blit(shuoming,(350,150)) 168 #按下o重新开始 169 for e in pygame.event.get(): 170 if e.type==KEYDOWN: 171 if e.key==K_o: 172 screen.fill((50,120,99)) 173 items=[[],[]] 174 Plane(50,50,(ScreenSize[0]-100)//50,50) 175 scene=0 176 if scene==0: 177 break 178 pygame.display.update()
以上是关于pygame 练习 五子棋的主要内容,如果未能解决你的问题,请参考以下文章