有没有小火伴是特别喜欢玩五子棋的,我记得我初中是特别喜欢的。于是,我今天就用Python给大家写了一个黑白棋游戏。代码放在下面了。

01、绘制棋盘

Python学习交流Q群:906715085###
import pygame, sys, random
from pygame.locals import *
BACKGROUNDCOLOR = (255, 255, 255)
FPS = 40
# 初始化
pygame.init()
mainClock = pygame.time.Clock()
# 加载图片
boardImage = pygame.image.load('board.png')
boardRect = boardImage.get_rect()
blackImage = pygame.image.load('black.png')
blackRect = blackImage.get_rect()
whiteImage = pygame.image.load('white.png')
whiteRect = whiteImage.get_rect()
# 设置窗口
windowSurface = pygame.display.set_mode((boardRect.width, boardRect.height))
pygame.display.set_caption('黑白棋')
# 游戏主循环
while True:for event in pygame.event.get():if event.type == QUIT:terminate()#鼠标事件完成玩家走棋(见下文)…..#电脑走棋(见下文)…..windowSurface.fill(BACKGROUNDCOLOR)windowSurface.blit(boardImage, boardRect, boardRect)#重画所有的棋子(见下文)…..#游戏结束,显示双方棋子数量(见下文)……pygame.display.update()mainClock.tick(FPS)

02、绘制棋子

(1)黑白棋的规则,开局时先放置上黑白各两个棋子在中间。

(2)用一个8x8列表保存棋子。

CELLWIDTH = 80
CELLHEIGHT = 80
PIECEWIDTH = 78
PIECEHEIGHT = 78
BOARDX = 40
BOARDY = 40
# 重置棋盘
def resetBoard(board):for x in range(8):for y in range(8):board[x][y] = 'none'# Starting pieces:board[3][3] = 'black'board[3][4] = 'white'board[4][3] = 'white'board[4][4] = 'black'# 开局时建立新棋盘
def getNewBoard():board = []for i in range(8):board.append(['none'] * 8)return board
mainBoard = getNewBoard()
resetBoard(mainBoard)
for x in range(8):for y in range(8):rectDst = pygame.Rect(BOARDX+x*CELLWIDTH+2, BOARDY+y*CELLHEIGHT+2, PIECEWIDTH, PIECEHEIGHT)if mainBoard[x][y] == 'black':windowSurface.blit(blackImage, rectDst, blackRect) #画黑棋elif mainBoard[x][y] == 'white':windowSurface.blit(whiteImage, rectDst, whiteRect) #画白棋

03、随机决定谁先走棋

# 谁先走
def whoGoesFirst():if random.randint(0, 1) == 0:return 'computer'else:return 'player'turn = whoGoesFirst()
if turn == 'player':playerTile = 'black'computerTile = 'white'
else:playerTile = 'white'computerTile = 'black'

04、鼠标事件

(1)鼠标操纵,完成玩家走棋

(2)轮流走棋

for event in pygame.event.get():if event.type == QUIT:terminate()#玩家走棋if turn == 'player' and event.type == MOUSEBUTTONDOWN and event.button == 1:x, y = pygame.mouse.get_pos()col = int((x-BOARDX)/CELLWIDTH)row = int((y-BOARDY)/CELLHEIGHT)if makeMove(mainBoard, playerTile, col, row) == True:if getValidMoves(mainBoard, computerTile) != []:turn = 'computer'          #轮到电脑走棋#电脑走棋if (gameOver == False and turn == 'computer'):x, y = getComputerMove(mainBoard, computerTile)makeMove(mainBoard, computerTile, x, y)savex, savey = x, y# 玩家没有可行的走法了,则电脑继续,否则切换到玩家走if getValidMoves(mainBoard, playerTile) != []:turn = 'player'          #轮到玩家走棋windowSurface.fill(BACKGROUNDCOLOR)windowSurface.blit(boardImage, boardRect, boardRect)

05、游戏规则实现

(1)是否允许落子

(2)落子后的翻转

# 是否是合法走法,如果合法返回需要翻转的棋子列表
def isValidMove(board, tile, xstart, ystart):# 如果该位置已经有棋子或者出界了,返回Falseif not isOnBoard(xstart, ystart) or board[xstart][ystart] != 'none':return False# 临时将tile 放到指定的位置board[xstart][ystart] = tileif tile == 'black':otherTile = 'white'else:otherTile = 'black'# 要被翻转的棋子tilesToFlip = []for xdirection, ydirection in [ [0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1] ]:x, y = xstart, ystartx += xdirectiony += ydirectionif isOnBoard(x, y) and board[x][y] == otherTile:x += xdirectiony += ydirectionif not isOnBoard(x, y):continue# 一直走到出界或不是对方棋子的位置while board[x][y] == otherTile:x += xdirectiony += ydirectionif not isOnBoard(x, y):break# 出界了,则没有棋子要翻转OXXXXXif not isOnBoard(x, y):continue# 是自己的棋子OXXXXXXOif board[x][y] == tile:while True:x -= xdirectiony -= ydirection# 回到了起点则结束if x == xstart and y == ystart:break# 需要翻转的棋子tilesToFlip.append([x, y])# 将前面临时放上的棋子去掉,即还原棋盘board[xstart][ystart] = 'none' # restore the empty space# 没有要被翻转的棋子,则走法非法。翻转棋的规则。if len(tilesToFlip) == 0: # If no tiles were flipped, this is not a valid move.return Falsereturn tilesToFlip# 是否出界
def isOnBoard(x, y):return x >= 0 and x <= 7 and y >= 0 and y <=7# 获取可落子的位置
def getValidMoves(board, tile):validMoves = []for x in range(8):for y in range(8):if isValidMove(board, tile, x, y) != False:validMoves.append([x, y])return validMoves
# 将一个tile棋子放到(xstart, ystart)
def makeMove(board, tile, xstart, ystart):tilesToFlip = isValidMove(board, tile, xstart, ystart)if tilesToFlip == False:return Falseboard[xstart][ystart] = tilefor x, y in tilesToFlip: #tilesToFlip是需要翻转的棋子列表board[x][y] = tile #翻转棋子

06、电脑AI走法

如果电脑在所有落子的选择中,有四个边角,可落子在边角,因为边角的棋子无法被翻转。如果没有边角,则选择可以翻转对手最多的位置落子。

def getComputerMove(board, computerTile):# 获取所以合法走法possibleMoves = getValidMoves(board, computerTile)# 打乱所有合法走法random.shuffle(possibleMoves)# [x, y]在角上,则优先走,因为角上的不会被再次翻转for x, y in possibleMoves:if isOnCorner(x, y):return [x, y]bestScore = -1for x, y in possibleMoves:dupeBoard = getBoardCopy(board)makeMove(dupeBoard, computerTile, x, y)# 按照分数选择走法,优先选择翻转后分数最多的走法score = getScoreOfBoard(dupeBoard)[computerTile]if score > bestScore:bestMove = [x, y]bestScore = scorereturn bestMove
# 是否游戏结束
def isGameOver(board):for x in range(8):for y in range(8):if board[x][y] == 'none':return Falsereturn True
# 获取棋盘上黑白双方的棋子数
def getScoreOfBoard(board):xscore = 0oscore = 0for x in range(8):for y in range(8):if board[x][y] == 'black':xscore += 1if board[x][y] == 'white':oscore += 1return {'black':xscore, 'white':oscore}

主程序中加入游戏结束,显示双方棋子数量功能。

if isGameOver(mainBoard): #游戏结束,显示双方棋子数量scorePlayer = getScoreOfBoard(mainBoard)[playerTile]scoreComputer = getScoreOfBoard(mainBoard)[computerTile]outputStr = gameoverStr + str(scorePlayer) + ":" + str(scoreComputer)text = basicFont.render(outputStr, True, BLACK, BLUE)textRect = text.get_rect()textRect.centerx = windowSurface.get_rect().centerxtextRect.centery = windowSurface.get_rect().centerywindowSurface.blit(text, textRect)

至此完成基于Pygame的黑白棋游戏设计。游戏效果如图所示。今天的分享就到这里了,下一章见。

【Python案例】基于Pygame黑白棋游戏(附源码)相关推荐

  1. 【Python游戏】基于化学方程式的基础上,用Python实现一个消灭泡泡小游戏 | 附源码

    前言 halo,包子们下午好 今天实现的这个小游戏呀,说实话化学不太好的小伙伴可能看起来会有点懵逼 不过不用担心,咱们今天不是来学化学的,我们是来学习Python的 所以呀,不要太担心啦,大家先好好看 ...

  2. 一口气用Python写了13个小游戏 (附源码)

    大家好,今天给大家分享13个游戏源码,可以自己复现玩玩,研究下里面的编程逻辑,对学习编程(特别是初学者)应该会有很大帮助. 由于文章较长,大家记得滑到文末点个赞哈- 1.吃金币 源码分享: impor ...

  3. 分享Python开发的13个小游戏(附源码)

    导语 哈喽哈喽~铁汁萌!愉快的周末到了天气也变好了不知道大家有没有出去玩吖!小编这几天太累了周末就宅在家里啦

  4. 20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放

    20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放 文章目录 202205 ...

  5. [附源码]计算机毕业设计Python+uniapp基于Android的懂球帝APPqkwan(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的懂球帝APPqkwan(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境 ...

  6. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

  7. 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...

  8. java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载

    运行于手机上的中国象棋游戏,鉴于JAVA J2ME技术,本游戏分服务端和客户端,导入JAR包即可在手机上运行,内有开发文档和运用说明. Java手机网络版象棋游戏附源码 (1 folders, 2 f ...

  9. html实现扫雷小游戏(附源码)

    文章目录 实现功能 1.扫雷设计 1.1 主界面 1.2 扫雷难度 1.3 附带功能 2.效果和源码 2.1 动态效果 2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blo ...

最新文章

  1. mysql分页的优势_数据库经典分页几种实例及各优缺点
  2. 4个在2020年持续发展的数据中心冷却趋势
  3. nginx访问502 gateway,*1 connect() failed (111: Connection refused) while connecting to upstream
  4. zigbee zcl规范及其协议栈实现3 读取服务器端属性值
  5. SpringBoot+Shiro学习(四):Realm授权
  6. .NET 异步,你也许不知道的5种用法
  7. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)
  8. 10分钟学会vuex
  9. 微软将所有的Windows代码库迁移到Git
  10. 随机过程(二):更新过程的详细理解
  11. 《Web漏洞防护》读书笔记——第9章,XSS防护
  12. linux安装中文输入法 -谷歌拼音
  13. 串口通信基本接线方法
  14. 阿里云服务器ddos攻击防御
  15. Cuba 设置debug模式
  16. jekyll 配置环境变量——zsh
  17. ios根据服务器修改App名称,iOS 修改APP 名称
  18. Multisim仿真—恒流源电路(一)
  19. UID-04-PS-书籍装帧
  20. 多线程 ---- 线程的通信

热门文章

  1. 不希望你懈——写给宫岩
  2. 17.2.2 裁剪图片
  3. 专升本第四讲(计算机的“灵魂”)
  4. FreeNAS 0.72 安装 mldonkey 3.0.6
  5. 微软控诉四大PC品牌经销商
  6. 基于Faster-RCNN的水书古籍手写文字的检测与识别-论文阅读
  7. 安装centOS 7双系统(四)——解决Broadcom博通BCM 43xx无线网卡驱动问题
  8. 博通Broadcom SDK源码学习与开发5——ECOS系统层剖析
  9. 李滔搜狐大数据之Spark广告和新闻推荐
  10. 反馈的基本概念及在电路中的作用