20241311廖江泽实验四实验报告
20241311 2024-2025-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2413
姓名: 廖江泽
学号:20241311
实验教师:王志强
实验日期:2025年5月14日
必修/选修: 公选课
1.实验内容
由于主包在之前的系编程比赛里编写五子棋程序出现失误,主包痛定思痛,决定写一份完美的五子棋程序。
2. 实验过程及结果
实验思路
- 1.棋盘表示
采用 15 行 15 列的二维列表来呈现棋盘,列表里的每个元素初始值为空格' ',代表该位置没有棋子。 - 2.核心功能模块
棋盘初始化:init_board()函数会构建一个全是空格的 15×15 二维列表。
棋盘显示:print_board()函数能够打印出当前棋盘的状态,同时标出行号和列号,方便玩家确定落子位置。
胜负判定:check_win()函数会对新落子位置的四个方向(水平、垂直、两条对角线)进行检查,看是否形成了五连子。具体步骤为:先检查正方向上连续相同棋子的数量,再检查反方向上的数量,若总数达到或超过 5 个,就判定该玩家获胜。 - 3.主循环控制:main()函数作为游戏的主控制流程,它会:
初始化棋盘并设定当前玩家为X。
在游戏未结束时,持续显示棋盘并获取当前玩家的落子位置。
验证输入的有效性,确保落子位置在棋盘范围内且该位置为空。
落子后检查是否有玩家获胜或者游戏是否平局。
若游戏未结束,则切换当前玩家。 - 4.游戏流程
游戏开始时,棋盘是空的,由玩家X先落子。
玩家需要输入行号和列号来确定落子位置。
程序会对输入进行验证,只有有效的输入才能落子。
每落一子后,程序会检查是否形成五连子,若形成则当前玩家获胜,游戏结束。
若棋盘被填满但没有玩家获胜,则游戏平局。
若游戏未结束,则切换到另一位玩家继续游戏。
实验代码:
# 初始化棋盘
def init_board():
return [[' ' for _ in range(15)] for _ in range(15)]
# 打印棋盘
def print_board(board):
print(' ', end='')
for i in range(15):
print(f'{i:2}', end='')
print()
for i in range(15):
print(f'{i:2}', end='')
for j in range(15):
print(f'{board[i][j]:2}', end='')
print()
# 检查是否有玩家获胜
def check_win(board, x, y, player):
directions = [
(1, 0), # 水平
(0, 1), # 垂直
(1, 1), # 右下对角线
(1, -1) # 右上对角线
]
for dx, dy in directions:
count = 1
# 正方向检查
for i in range(1, 5):
nx, ny = x + dx * i, y + dy * i
if 0 <= nx < 15 and 0 <= ny < 15 and board[nx][ny] == player:
count += 1
else:
break
# 反方向检查
for i in range(1, 5):
nx, ny = x - dx * i, y - dy * i
if 0 <= nx < 15 and 0 <= ny < 15 and board[nx][ny] == player:
count += 1
else:
break
if count >= 5:
return True
return False
# 主函数
def main():
board = init_board()
current_player = 'X'
game_over = False
while not game_over:
print_board(board)
print(f"当前玩家: {current_player}")
# 获取玩家输入
while True:
try:
x = int(input("请输入行号 (0-14): "))
y = int(input("请输入列号 (0-14): "))
if 0 <= x < 15 and 0 <= y < 15 and board[x][y] == ' ':
break
else:
print("无效的位置,请重新输入!")
except ValueError:
print("请输入有效的数字!")
# 落子
board[x][y] = current_player
# 检查是否获胜
if check_win(board, x, y, current_player):
print_board(board)
print(f"玩家 {current_player} 获胜!")
game_over = True
else:
# 检查是否平局
if all(' ' not in row for row in board):
print_board(board)
print("游戏平局!")
game_over = True
else:
# 切换玩家
current_player = 'O' if current_player == 'X' else 'X'
if __name__ == "__main__":
main()
- 运行结果:
- 运行视频:
视频链接
3. 实验过程中遇到的问题和解决过程
- 问题1:在加入复数这个功能后运行时出错
- 问题1解决方案:发现python的复数是a+bj而不是a+bi,这与平时数学学到的略有出入,需注意。
4.全课总结
Python网络编程技术:
-
Socket技术
Socket即套接字,由IP地址和端口组成,是应用程序进行网络通讯的关键接口。分为低级别Socket(提供标准BSD Sockets API,可访问底层操作系统接口)和高级别Socket(如SocketServer模块,简化网络服务器开发)。
Socket原理类似打电话过程,服务器端先初始化Socket、绑定端口、监听并等待客户端连接;客户端则初始化Socket后连接服务器,双方建立连接后可发送和接收数据。
Socket模块涉及不同类型(如AF_UNIX、AF_INET等)和多种函数(服务端有bind、listen、accept,客户端有connect等,公共函数包括recv、send等),需注意TCP和UDP的区别(如TCP面向连接,UDP面向无连接)。 -
网络爬虫技术
网络爬虫是模拟人浏览网站行为获取信息的工具,Python因多种优势成为热门爬虫语言。简单Demo通过urllib.request实现网络请求并获取网页内容。
网络爬虫常用技术包括网络请求(有Urllib、Urllib3、Requests等模块)、请求headers处理(应对反爬虫策略)、网络超时异常处理、代理服务(解决访问受限问题)以及HTML解析(常用LXML、BeautifulSoup等模块)。
还有多种网络爬虫框架,如Scrapy(快速、高层次的抓取框架)、Crawley(支持多种数据库和数据导出格式)、PySpider(功能强大,有浏览器界面操作等优势)。
Python基础数据结构与相关操作:
-
序列
序列涵盖列表、元组、字典、集合等。列表是有序可变序列,元素可不同,支持多种操作(如创建、访问、增删改、排序、推导式等);元组与列表类似但元素不可变;字典是无序可变的键值对集合,通过键访问值,可进行创建、遍历、添加修改删除元素等操作;集合是无序可变的无重复元素集合,支持添加、删除、交并差集等操作。 -
字符串与正则表达式
字符串支持拼接、重复、截断、分割合并、检索(如count、find方法,in和not in运算符)、大小写转换、去除首尾字符以及格式化(%操作符和format方法)等多种操作。
正则表达式用于字符串模式匹配,包含普通字符和特殊字符(元字符),通过re模块实现查找(match、search、findall)、替换(sub)和分割(split)等操作,可处理如匹配特定格式(QQ号、身份证号等)的复杂情况。
Python进阶主题:
-
模块及异常处理
模块是.py文件,用于提高代码重用性和可维护性。导入模块有import和from...import两种方式,需注意函数名或模块名重名问题以及测试代码的编写(利用if name == 'main'语句)。
包是包含__init__.py文件的目录,用于解决模块重名问题,导入包有多种方式。异常是程序运行时发生的错误,异常处理可控制错误影响,如处理除0异常等。 -
文件及目录操作
文件操作包括打开、读写(不同模式如r、w、a等对应不同操作方式)和关闭,os模块和os.path模块提供了众多与目录相关的函数,os.walk用于遍历目录。
5.课程感想体会
王老师是一位幽默风趣的老师,将晦涩难懂的知识生动形象的传授给了我们,我觉得每个星期的python课都是一种享受,都很期待上王老师的课。但是这个学期太短,python课很快就结束了,希望以后还有机会跟着王老师一起学习。
“人生苦短,我用python”
意见和建议
-
1.对于一些较为抽象或复杂的概念(如Socket底层通信原理、正则表达式等),可以增加更多的图示、动画解释。
-
2.除了现有的文档资料,可以补充一些视频讲解资源,尤其是对于代码演示部分,视频能更清晰地展示代码编写、运行和调试的全过程,可以更好地观察和学习代码的细节和技巧。