五子棋源码,原创代码,仅供 python 开源项目学习。
目前电脑走法笨笨的,下一期版本会提高电脑算法
ps:另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我建了个Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步
第二版已发布与另外一篇博文,有兴趣的可以去查看下载。
import pygame import time SCREEN_WIDTH=900 SCREEN_HEIGHT=800 BG_COLOR=pygame.Color(200, 200, 200) Line_COLOR=pygame.Color(255, 255, 200) TEXT_COLOR=pygame.Color(255, 0, 0) # 定义颜色 BLACK = ( 0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = ( 0, 255, 0) BLUE = ( 0, 0, 255) class MainGame(): window = None Start_X = 50 Start_Y = 50 Line_Span = 40 Max_X = Start_X + 18 * Line_Span Max_Y = Start_Y + 18 * Line_Span player1Color = 'B' player2Color = 'W' overColor = 'S' # 1代表玩家1 , 2代表到玩家2 0代表结束 Putdownflag = player1Color ChessmanList = [] def __init__(self): '''初始化''' def startGame(self): MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) pygame.display.set_caption("五子棋") #初始化 while True: time.sleep(0.1) #获取事件 MainGame.window.fill(BG_COLOR) self.drawchChessboard() self.bitechessman() self.VictoryOrDefeat() self.Computerplay() self.getEvent() pygame.display.update() pygame.display.flip() def drawchChessboard(self): for i in range(0,19): x = MainGame.Start_X + i * MainGame.Line_Span y = MainGame.Start_Y + i * MainGame.Line_Span pygame.draw.line(MainGame.window, BLACK, [x, MainGame.Start_Y], [x, MainGame.Max_Y], 1) pygame.draw.line(MainGame.window, BLACK, [MainGame.Start_X, y], [MainGame.Max_X, y], 1) def getEvent(self): # 获取所有的事件 eventList = pygame.event.get() for event in eventList: if event.type == pygame.QUIT: self.endGame() elif event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() mouse_x = pos[0] mouse_y = pos[1] if (mouse_x > MainGame.Start_X- MainGame.Line_Span/2 and mouse_x < MainGame.Max_X + MainGame.Line_Span / 2) and (mouse_y > MainGame.Start_Y- MainGame.Line_Span/2 and mouse_y < MainGame.Max_Y + MainGame.Line_Span / 2): #print( str(mouse_x) + "" + str(mouse_y)) #print(str(MainGame.Putdownflag)) if MainGame.Putdownflag != MainGame.player1Color: return click_x = round((mouse_x - MainGame.Start_X) / MainGame.Line_Span) click_y = round((mouse_y - MainGame.Start_Y) / MainGame.Line_Span) click_mod_x = (mouse_x - MainGame.Start_X) % MainGame.Line_Span click_mod_y = (mouse_y - MainGame.Start_Y) % MainGame.Line_Span if abs(click_mod_x-MainGame.Line_Span/2) >=5 and abs(click_mod_y-MainGame.Line_Span/2) >=5: #print("有效点:x="+str(click_x)+" y="+str(click_y)) #有效点击点 self.putdownchess(MainGame.player1Color, click_x, click_y) else: print("out") def putdownchess(self, t, x, y): flag = False for item in MainGame.ChessmanList: if item.x == x and item.y == y: flag = True if not flag: cm = Chessman(t, x, y) MainGame.ChessmanList.append(cm) MainGame.Putdownflag = MainGame.player2Color #print("ChessmanListlen:" + str(len(MainGame.ChessmanList))) def bitechessman(self): for item in MainGame.ChessmanList: item.displaychessman() def bureautime(self): '''''' def Computerplay(self): if MainGame.Putdownflag == MainGame.player2Color: print("轮到电脑了") computer = self.getComputerplaychess() if computer==None: return #print("computer x="+str(computer.x) + " y="+str(computer.y)) MainGame.ChessmanList.append(computer) MainGame.Putdownflag = MainGame.player1Color def getComputerplaychess(self): if len(MainGame.ChessmanList) == 0: return Chessman(MainGame.player2Color, 9, 9) # 进攻 for item in MainGame.ChessmanList: if item.troops == MainGame.player2Color: prev_x = item.x - 1 prev_y = item.y - 1 next_x = item.x + 1 next_y = item.y + 1 print(str(self.calVerticalityCount(item))) if self.calVerticalityCount(item) == 4 : if not len(list(filter(lambda x: x.x == prev_x and x.y == item.y, MainGame.ChessmanList))) : return Chessman(MainGame.player2Color, prev_x, item.y) elif not len(list(filter(lambda x: x.x == item.x+4 and x.y == item.y, MainGame.ChessmanList))) : print("YYYY " +str(item.x)+" "+str(item.y)) return Chessman(MainGame.player2Color, item.x+4, item.y) if self.calHorizontalCount(item) == 4: if not len(list(filter(lambda x: x.x == item.x and x.y == item.y-1, MainGame.ChessmanList))): return Chessman(MainGame.player2Color, prev_x, item.y-1) elif not len( list(filter(lambda x: x.x == item.x and x.y == item.y+ 4, MainGame.ChessmanList))): return Chessman(MainGame.player2Color, item.x, item.y+ 4) # 防守 for item in MainGame.ChessmanList: if item.troops == MainGame.player1Color: next_x = item.x + 1 next_y = item.y + 1 if self.calVerticalityCount(item) == 4 : if not len(list(filter(lambda x: x.x == prev_x and x.y == item.y, MainGame.ChessmanList))) : return Chessman(MainGame.player2Color, prev_x, item.y) elif not len(list(filter(lambda x: x.x == item.x+4 and x.y == item.y, MainGame.ChessmanList))) : return Chessman(MainGame.player2Color, item.x+4, item.y) if self.calHorizontalCount(item) == 4: if not len(list(filter(lambda x: x.x == item.x and x.y == item.y-1, MainGame.ChessmanList))): return Chessman(MainGame.player2Color, prev_x, item.y-1) elif not len( list(filter(lambda x: x.x == item.x and x.y == item.y+ 4, MainGame.ChessmanList))): return Chessman(MainGame.player2Color, item.x, item.y+ 4) if next_x < 19 and len(list(filter(lambda x: x.x == next_x and x.y == item.y, MainGame.ChessmanList)))==0: return Chessman(MainGame.player2Color, next_x, item.y) if next_y < 19 and len(list(filter(lambda x: x.x == item.x and x.y == next_y, MainGame.ChessmanList)))==0: return Chessman(MainGame.player2Color, item.x, next_y) for i in range(0,18): for j in range(0, 18): fi= filter(lambda x: x.x == i and x.y == j, MainGame.ChessmanList) if len(list(fi)) == 0 : return Chessman(MainGame.player2Color, i, j) return None #判断游戏胜利 def VictoryOrDefeat(self): for item in MainGame.ChessmanList: if self.calHorizontalCount(item) == 5 or self.calVerticalityCount(item) == 5 or self.calBevelsUpCount(item) == 5 or self.calBevelsDownCount(item)==5: txt ="" if item.troops == MainGame.player1Color : txt = "玩家" else: txt = "电脑" MainGame.window.blit(self.getTextSuface("%s获胜" % txt), (SCREEN_WIDTH-100, 200)) MainGame.Putdownflag = MainGame.overColor return def calHorizontalCount(self,chessman): count = 1 for i in range(1, 5): fi = filter(lambda x: x.troops == chessman.troops and x.x == chessman.x and x.y == chessman.y + i, MainGame.ChessmanList) if len(list(fi)) == 1: count += 1 else: break return count def calVerticalityCount(self, chessman): count = 1 for i in range(1, 5): fi = filter(lambda x:x.troops==chessman.troops and x.x == chessman.x+ i and x.y == chessman.y , MainGame.ChessmanList) if len(list(fi)) == 1: count += 1 else: break return count def calBevelsUpCount(self, chessman): count = 1 for i in range(1, 5): fi = filter(lambda x: x.troops == chessman.troops and x.x == chessman.x + i and x.y == chessman.y - i, MainGame.ChessmanList) if len(list(fi)) == 1: count += 1 else: break return count def calBevelsDownCount(self, chessman): count = 1 for i in range(1, 5): fi = filter(lambda x: x.troops == chessman.troops and x.x == chessman.x + i and x.y == chessman.y + i, MainGame.ChessmanList) if len(list(fi)) == 1: count += 1 else: break return count def getTextSuface(self, text): pygame.font.init() # print(pygame.font.get_fonts()) font = pygame.font.SysFont('kaiti', 18) txt = font.render(text, True, TEXT_COLOR) return txt def endGame(self): print("exit") exit() class Chessman(): def __init__(self,t,x,y): self.images = { 'B' : pygame.image.load("imgs/black.gif"), 'W' : pygame.image.load('imgs/white.gif'), 'N' : pygame.image.load("imgs/black.gif"), } self.troops = t self.image = self.images[self.troops] self.x = x self.y = y self.rect = self.image.get_rect() self.rect.left = MainGame.Start_X + x * MainGame.Line_Span - MainGame.Line_Span/2 self.rect.top = MainGame.Start_Y + y * MainGame.Line_Span - MainGame.Line_Span/2 def displaychessman(self): if self.troops != 'N': self.image = self.images[self.troops] MainGame.window.blit(self.image,self.rect) if __name__ == '__main__': MainGame().startGame()
以上就是本次源码,另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我建了个Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步