目录

  • 单元1  初识Python
    • ● 任务 1.1  计算机程序设计语言概述
    • ● 任务 1.2 Python语言
    • ● 任务1.3 Python开发环境搭建
    • ● 任务 1.4 Python的简单使用
    • ● 知识拓展
    • ● 思考与练习
  • 单元2   Python基础知识
    • ● 任务2.1 Python程序基本结构
    • ● 任务2.2  标准输入输出
    • ● 任务2.3  Python对象
    • ● 任务2.4 Python变量
    • ● 任务2.5  数据类型
    • ● 任务2.6 字符串
    • ● 任务2.7 运算符
    • ● 知识拓展
    • ● 思考与练习
  • 单元3   程序流程控制
    • ● 任务3.1  顺序结构
    • ● 任务3.2 选择结构
    • ● 任务3.3  循环结构
    • ● 知识拓展
    • ● 思考与练习
  • 单元4  Python序列
    • ● 任务4.1  序列
    • ● 任务4.2 列表
    • ● 任务4.3  用于序列操作的常用内置函数
    • ● 任务4.4   元组
    • ● 任务4.5  字典
    • ● 任务4.6  集合
    • ● 知识拓展
    • ● 思考与练习
  • 单元5  函数
    • ● 任务5.1 函数的定义与调用
    • ● 任务5.2 函数的参数
    • ● 任务5.3   参数类型
    • ● 任务5.4  变量作用域
    • ● 任务5.5   嵌套调用与递归调用
    • ● 任务5.6  lambda表达式
    • ● 任务5.7  模块
    • ● 知识拓展
    • ● 思考与练习
  • 单元6  异常处理
    • ● 任务6.1 异常处理的基本概念
    • ● 任务6.2 Python的异常处理语句
    • ● 任务6.3  自定义异常
    • ● 知识扩展
    • ● 思考与练习
  • 单元7  文件操作
    • ● 任务7.1  文件的分类
    • ● 任务7.2  文件对象
    • ● 任务7.3  文本文件
    • ● 任务7.4  二进制文件
    • ● 知识拓展
    • ● 思考与练习
  • 单元8  面向对象程序设计
    • ● 任务8.1 面向对象技术的基本概念
    • ● 任务8.2 类与对象
    • ● 任务8.3 类的继承
    • ● 任务8.4 方法重写
    • ● 知识扩展
    • ● 思考与练习
  • 单元9  网络编程基础
    • ● 任务9.1  Socket概述
    • ● 任务9.2   Socket对象内建方法
    • ● 任务9.3  Socket编程实例
    • ● 任务9.4    PythonInternet模块
    • ● 知识扩展
    • ● 思考与练习
  • 单元10    Python标准库及第三方库
    • ● 任务10.1 Python标准库
    • ● 任务10.2 Python第三方库的下载及安装
    • ● 任务10.3  Python第三方库举例
    • ● 知识扩展
    • ● 思考与练习
  • 任务11 用户图形界面(GUI)
    • ● 任务11.1 图形用户界面概述
    • ● 任务11.2 窗体容器和组件
    • ● 任务11.3 界面布局管理
    • ● 任务11.4 文本框组件
    • ● 任务11.5 其他组件
    • ● 任务11.6菜单与对话框
    • ● 任务11.7 鼠标键盘事件
    • ● 知识扩展
    • ● 思考与练习
  • 任务12   Python操作数据库
    • ● 数据库基础
    • ● 结构化查询语言SQL
    • ● Python操作数据库核心API
    • ● Python操作数据库案例
    • ● sqlite3 实训练习案例
    • ● pymysql 数据库实训案例
    • ● 小结  思考与练习
  • 习题解析(线上作业等参考解答)
    • ● 第一单元 初识Python  作业
    • ● 第二单元  Python基础(作业)
    • ● 第三单元  程序流程控制 作业(1)
    • ● 第三单元  程序流程控制  作业(2)
    • ● 第四单元  Python序列   作业
    • ● 第五单元   函数   作业
    • ● 单元六  异常处理  作业
    • ● 单元七、八  文件操作,GUI,面向对象
    • ● 单元九   网络编程基础
    • ● 线上习题解析
    • ● 编程训练
  • 应用题解(综合编程技术)
    • ● 《食品识别小专家》
    • ● 格式输出
    • ● 习题选解
    • ● 每日一帖
    • ● 模拟基本信息
    • ● 模拟基本数据
    • ● 数制转换
    • ● 定制每日运动计划
    • ● 《简易购物系统》
  • 课程章节测验
    • ● 第1次章节测验
  • 复习
    • ● Python基础知识总结
  • 第三方库TOOLS(备用)
    • ● 库模块(可下载)
    • ● 供考查备用的库模块(可下载)
知识拓展

五子棋棋盘

五子棋游戏是棋类游戏中比较简单的,但是可别小看这个游戏,能够完美运行需要很多知识作为基础。由于所学知识有限,本节中只会介绍对棋盘进行抽象的方法,并根据抽象创建棋盘。

(一) 五子棋盘的选择:列表

(1)棋盘的抽象

棋盘是五子棋游戏的基础,毕竟这个游戏就是在这样一个方形网格状的区域上进行的。事实上,这样一个棋盘在程序中就是一种能存储棋子状态(是否落子)和位置的数据结构。对于程序设计的初学者来说,这里可能存在一个误会:一般看到的棋盘界面和这里讲的棋盘是不同的东西,前者由游戏视觉设计师设计的,而后者是游戏程序中针对棋盘抽象出来数据结构。

前面已介绍过多种数据结构:列表、元组、字典和集合,哪种比较适合棋盘呢?元组肯定是不可以,因为伴随着落子,棋盘的状态一定会改变,而元组是一种是不能改变的类型。

事实上,列表、字典和可变集合都可以作为棋盘的载体。可以将“(x,y,z)”当做集合的元素,其中x,y组成棋子的坐标,z表示棋子的有无和属方,如果集合中存在一个坐标说明这个坐标的位置上有棋子,并且z值标明这个棋子的属方,否则没有这个棋子。也可以将“(x,y):z”作为字典的项,x,y,z意义同上。但是每次走棋都需要对棋盘进行更新(重新绘制),此时还需要对当前步骤棋子位置是否已存在棋子进行判断,这如何操作呢?答案是使用列表,利用列表特性不仅会解决这个问题而且将会显得更优雅。

(2)棋子的状态

前面讲过,列表是个容器类型,它里面的元素可以是任何对象,是否想过如果列表里的对象是列表会有什么情况发生?这其实拓展了列表的维度——从一维到二维,这时如果想访问到列表中列表的元素需要二重索引:第一重返回一个列表,第二重返回里面列表的元素。

>>> chessboard=[[0,1],[2,3],[4,5],[6,7]]

>>> chessboard[1][1]                            #两重索引

3

  相信读者已发现,二重索引其实可以当坐标使用。如果棋盘有n行n列,那么这个棋盘可以抽象为一个包含n个列表的列表,其中每个列表包含n个元素。这样一个数据结构可以完整描述整个棋盘,那么输出棋盘时就不需要每次判断当前位置上是否有棋子了。那么如何记录每个位置上的棋子状态呢?棋盘中每个位置有三种状态:无子、己方棋子和敌方棋子,那么可以用三个值来区别这三种状态:0表示无子,1表示有己方棋子,2表示有敌方棋子,并且当下棋时读取该位置上的状态信息来判断是否能够行棋。

(3)棋盘的状态

  除了要记录棋子的状态,棋盘的状态也需记录,即该谁落子。可以看出棋盘的状态只有两种,和棋子的状态的处理方法相同,也可以用一个who变量来记录,这个变量有两个值:False表示该玩家1落子,True表示该玩家2落子。之所以选用逻辑值来作为状态,因为可以使用not语句来改变状态,比较方便:

>>> who=False

>>> who

False

>>> who=not who                   #not取反

>>> who

True

如果使用其它值,如0和1,那么状态的改变需要两条语句,who=0和who=1。而使用上面的方法只需一条即可:who=not who。

游戏开始时首先会创建一个棋盘,并对其进行初始化。这里可能需要提前透露一下后面的知识:循环(下章会讲到)。有时需要一些重复的操作,如果一条一条语句地写出来,代码会显得冗长。有时候这些操作甚至无法全部写出来,因为很多操作可能需要执行百万千万次。循环的使用可以使这些语句变成一条,创建棋盘便是个例子:

maxx=10

maxy=10

qipan=[]

 for i in range(maxx):                      #for循环语句

       qipan.append([])

       for j in range(maxy):                  #for循环语句

              qipan[i].append(0)  

for i in range(maxx):   

     print(qipan[i])      #输出

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]