# 1. 实验介绍
## 1.1 实验内容
实验利用 Python 模拟 AI 和玩家进行四子棋游戏,利用游戏实验 Pygame 库,为游戏提供界面和操作支持。AI 算法借用蒙特卡洛搜索树思想。通过设置 AI 的难度系数,即 AI 所能考虑到的未来棋子的可能走向,从而选择出最佳的方案和玩家对抗。难度系数越大,AI 搜索范围越广,它所能做出的决定越明智。
游戏最终效果截图:
![](https://www.writebug.com/myres/static/uploads/2022/8/14/f1dd567cd27b92d70e85522cc985be2d.writebug)
## 1.2 实验知识点
- Pygame 的基础操作
- 蒙特卡洛搜索树
## 1.3 实验环境
- Python2.7
- gedit
## 1.4 适合人群
本课程难度一般,属于初级课程,适合具有 Python 基础并对 Pygame 有所了解的用户学习。
## 1.5 代码获取
你可以通过下面命令将代码下载到实验楼环境中,作为参照对比进行学习。
```c++
$ wget http://labfile.oss.aliyuncs.com/courses/746/fourinrow.py
```
# 2. 四子棋游戏
四子棋游戏是在 7*6 的格子中。轮流从格子最上方落下棋子。棋子会落在该列格子中最下面的空格子里。先将四个棋子连成一条线(水平直线,竖直直线,或倾斜直线)者获胜,游戏结束。
# 3. 项目文件结构
![](https://www.writebug.com/myres/static/uploads/2022/8/14/a8b65eed819bbaba79e6ba0a78b5a825.writebug)
# 4. 实验步骤
## 4.1 开发准备
在 Code 目录下进行创建工程文件 Fourinrow,在终端执行命令
```c++
cd Code && mkdir Fourinrow
```
下载本次实验所需的图片资源到 Fourinrow 文件下
```c++
$ cd Fourinrow
$ wget http://labfile.oss.aliyuncs.com/courses/746/images.zip
$ unzip images.zip
```
![](https://www.writebug.com/myres/static/uploads/2022/8/14/601e3801fd1e48fa6ad77a99471dec00.writebug)
安装依赖包
```c++
$ sudo apt-get update
$ sudo apt-get install python-pygame
```
## 4.2 游戏流程
![](https://www.writebug.com/myres/static/uploads/2022/8/14/c1daf8a9ee44928caf9216a9df313f63.writebug)
## 4.3 初始化变量
用到的变量包括,棋盘的宽度,长度(可以修改,设计不同规格的棋盘),难度系数,棋子大小以及一些设计坐标变量的设定。
在 FourinRow.py 文件中输入如下代码:
```c++
import random, copy, sys, pygame
from pygame.locals import *
BOARDWIDTH = 7 # 棋子盘的宽度栏数
BOARDHEIGHT = 6 # 棋子盘的高度栏数
assert BOARDWIDTH >= 4 and BOARDHEIGHT >= 4, 'Board must be at least 4x4.'
#python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。
#可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
DIFFICULTY = 2 # 难度系数,计算机能够考虑的移动级别
#这里2表示,考虑对手走棋的7种可能性及如何应对对手的7种走法
SPACESIZE = 50 # 棋子的大小
FPS = 30 # 屏幕的更新频率,即30/s
WINDOWWIDTH = 640 # 游戏屏幕的宽度像素
WINDOWHEIGHT = 480 # 游戏屏幕的高度像素
XMARGIN = int((WINDOWWIDTH - BOARDWIDTH * SPACESIZE) / 2)#X边缘坐标量,即格子栏的最左边
YMARGIN = int((WINDOWHEIGHT - BOARDHEIGHT * SPACESIZE) / 2)#Y边缘坐标量,即格子栏的最上边
BRIGHTBLUE = (0, 50, 255)#蓝色
WHITE = (255, 255, 255)#白色
BGCOLOR = BRIGHTBLUE
TEXTCOLOR = WHITE
RED = 'red'
BLACK = 'black'
EMPTY = None
HUMAN = 'human'
COMPUTER = 'computer'
```
除此之外我们还需要定义一些 pygame 的全局变量。这些全局变量在之后的各个模块中会被多次调用。其中很多是存储载入图片的变量,准备工作有点长,请大家耐心一点哦。
```c++
#初始化pygame的各个模块
pygame.init()
#初始化了一个Clock对象
FPSCLOCK = pygame.time.Clock()
#创建游戏窗口
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
#游戏窗口标题
pygame.display.set_caption(u'four in row')
#Rect(left,top,width,height)用来定义位置和宽高
REDPILERECT = pygame.Rect(int(SPACESIZE / 2), WINDOWHEIGHT - int(3 * SPACESIZE / 2), SPACESIZE, SPACESIZE)
#这里创建的是窗口中左下角和右下角的棋子
BLACKPILERECT = pygame.Rect(WINDOWWIDTH - int(3 * SPACESIZE / 2), WINDOWHEIGHT - int(3 * SPACESIZE / 2), SPACESIZE, SPACESIZE)
#载入红色棋子图片
REDTOKENIMG = pygame.image.load('4row_red.png')
#将红色棋子图片缩放为SPACESIZE
REDTOKENIMG = pygame.transform.smoothscale(REDTOKENIMG, (SPACESIZE, SPACESIZE))
#载入黑色棋子图片
BLACKTOKENIMG = pygame.image.load('4row_black.png')
#将黑色棋子图片缩放为SPACESIZE
BLACKTOKENIMG = pygame.transform.smoothscale(BLACKTOKENIMG, (SPACESIZE, SPACESIZE))
#载入棋子面板图片
BOARDIMG = pygame.image.load('4row_board.png')
#将棋子面板图片缩放为SPACESIZE
BOARDIMG = pygame.transform.smoothscale(BOARDIMG, (SPACESIZE, SPACESIZE))
#载入人胜利时图片
HUMANWINNERIMG = pygame.image.load('4row_humanwinner.png')
#载入AI胜时图片
COMPUTERWINNERIMG = pygame.image.load('4row_computerwinner.png')
#载入平局提示图片
TIEWINNERIMG = pygame.image.load('4row_tie.png')
#返回一个Rect实例
WINNERRECT = HUMANWINNERIMG.get_rect()
#游戏窗口中间位置坐标
WINNERRECT.center = (int(WINDOWWIDTH / 2), int(WINDOWHEIGHT / 2))
#载入操作提示图片
ARROWIMG = pygame.image.load('4row_arrow.png')
#返回一个Rect实例
ARROWRECT = ARROWIMG.get_rect()
#操作提示的左位置
ARROWRECT.left = REDPILERECT.right + 10
#将操作提示与下方红色棋子实例在纵向对齐
ARROWRECT.centery = REDPILERECT.centery
```
至此我们完成了前期的准备工作。
## 4.4 棋盘设计
初始时,将棋盘二维列表清空,然后根据玩家和 AI 的走法将棋盘相应位置设定颜色。
```python
def drawBoard(board, extraToken=None):
#DISPLAYSURF 是我们的界面,在初始化变量模块中有定义
DISPLAYSURF.fill(BGCOLOR)#将游戏窗口背景色填充为蓝色
spaceRect = pygame.Rect(0, 0, SPACESIZE, SPACESIZE)#创建Rect实例
for x in range(BOARDWIDTH):
#确定每一列中每一行中的格子的左上角的位置坐标
for y in range(BOARDHEIGHT):
spaceRect.topleft = (XMARGIN + (x * SPACESIZE), YMARGIN + (y * SPACESIZE))
#x =0,y =0时,即第一列第一行的格子。
if board[x][y] == RED:#如果格子值为红色
#则在在游戏窗口的spaceRect中画红色棋子
DISPLAYSURF.blit(REDTOKENIMG, spaceRect)
elif board[x][y] == BLACK: #否则画黑色棋子
DISPLAYSURF.blit(BLACKTOKENIMG, spaceRect)
# extraToken 是包含了位置信息和颜色信息的变量
# 用来显示指定的棋子
if extraToken != None:
if extraToken['color'] == RED:
DISPLAYSURF.blit(REDTOKENIMG,(extraToken['x'],
extraToken['y'], SPACESIZE, SPACESIZE))
elif extraToken['color'] == BLACK:
DISPLAYSURF.blit(BLACKTOKENIMG, (extraToken['x'], extraToken['y'], SPACESIZE, SPACESIZE))
# 画棋子面板
for x in range(BOARDWIDTH):
for y in range(BOARDHEIGHT):
spaceRect.topleft = (XMARGIN + (x * SPACESIZE), YMARGIN + (y * SPACESIZE))
DISPLAYSURF.blit(BOARDIMG, spaceRect)
# 画游戏窗口中左下角和右下角的棋子
DISPLAYSURF.blit(REDTOKENIMG, REDPILERECT) # 左边的红色棋子
DISPLAYSURF.blit(BLACKTOKENIMG, BLACKPILERECT) # 右边的黑色棋子
def getNewBoard():
board = []
for x in range(BOARDWIDTH):
board.append([EMPTY] * BOARDHEIGHT)
return board #返回board列表,其值为BOARDHEIGHT数量的None
```
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实验利用Python模拟AI和玩家进行四子棋游戏,利用游戏实验Pygame库,为游戏提供界面和操作支持。AI算法借用蒙特卡洛搜索树思想。通过设置AI的难度系数,即AI所能考虑到的未来棋子的可能走向,从而选择出最佳的方案和玩家对抗。
资源推荐
资源详情
资源评论
收起资源包目录
100011748-基于Python实现四子棋游戏.zip (11个子文件)
chessgame
LICENSE 1KB
fourinrow.py 10KB
images
4rowhumanwinner.png 25KB
4rowtie.png 9KB
4rowarrow.png 10KB
4rowboard.png 8KB
4rowblack.png 7KB
4rowred.png 8KB
4rowcomputerwinner.png 18KB
文档.docx 30.07MB
README.md 25KB
共 11 条
- 1
资源评论
神仙别闹
- 粉丝: 2667
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功