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.除了现有的文档资料,可以补充一些视频讲解资源,尤其是对于代码演示部分,视频能更清晰地展示代码编写、运行和调试的全过程,可以更好地观察和学习代码的细节和技巧。

6. 参考资料

posted @ 2025-06-09 21:46  20241311廖江泽  阅读(7)  评论(0)    收藏  举报