Skip to content

Latest commit

 

History

History
110 lines (79 loc) · 6.4 KB

File metadata and controls

110 lines (79 loc) · 6.4 KB

Python_Projects

Contains some small projects I wrote in python. (python作品集)

项目1:Mine_Sweeping 扫雷

用python语言写一个文字版的经典扫雷游戏,玩家通过输入文字来与扫雷游戏进行互动。包含三种难度,分别是初级、中等、高级。初级难度对应8x8网格10个地雷;中级难度对应16x16网格40个地雷;高级难度对应24x24网格99个地雷。

在项目中,我用二位数组symbol(项目中的变量名)来表示每一个网格的状态,其中共三种状态,即未知(“ ”)、显示周围地雷总数(“数字”)、旗帜标记三种状态(“F”)。

在游戏中,玩家可以选择三种操作并通过输入坐标(如“A0、B5等”)来选定操作位置,三种操作分别为move(即挖雷)、label(标旗帜)、delete label(删除旗帜)。

  1. move:挖雷操作以下有三种情况(1)直接挖到地雷,输掉游戏并且游戏结束。 (2)未挖到雷,但周围8格内有地雷,在当前方格显示周围8格地雷总数 (3)未挖到雷,并且周围8块方格没有地雷,对周围8块方格进行当前挖雷操作
  2. label:在当前方格标一个旗帜(“F”)代表当前方格可能有地雷。
  3. delete label: 删除当前方格已存在的旗帜(将“F”变为“ ”)。

游戏胜利的方式只有一种,即剩余未知的方格数等于地雷总数,即将除了地雷之外的位置都揭露出来。

游戏失败的方式也只有一种,即move操作的方格位置为地雷的位置,即挖到地雷。 其中涉及到python的基础语法与递归的用法。

项目2:Print _the_calendar_vertically 竖向打印日历

用python语言打印出一个竖向显示的日历。用户通过输入1900年1月后任意一年的年份和月份来获取一个竖向打印的日历。

项目先计算当前选定年月与1900年1月1日相差的总天数(包含1900年1月1日和该年月的第一天),并将其除以7以得到余数代表该月第一天是星期几(其中余数为0代表星期天)。据该月第一天是星期几来遍历该月每一天,共遍历7次,每次筛选出该月只属于一个星期数的天数,并横向打印出来,。

难点:我们只能横向进行打印输出,因此我们每次打印前都要筛选出当月只属于该星期数的天数,并按从小到大依次打印出。

重点:(1)先确定当月1号所在的星期数,方便确定第二列第一个数字是几号。 (2)要注意区分闰年与平年,闰年2月有29天,平年2月有28天。 (3)注意不同月份最大天数不同,有四种28、29、30、31天。

实例1: 2000年1月 M 3 10 17 24 31 T 4 11 18 25 W 5 12 19 26 T 6 13 20 27 F 7 14 21 28 S 1 8 15 22 29 S 2 9 16 23 30

注:教师要求 (1) 只能用while循环,不能用for循环 (2) 不能调用库中的函数 (3) 只能用 variable = expression该种形式的赋值 (4) 只允许if…else和if…elif分支语句 (5) 不允许使用break和continue类似语句 (6) 尝试用I != 10 来控制循环条件而不是 i >10. (7) 尽量将程序分为多个可重复利用的函数模块。

项目3:Figures_of_reorganization 求一个10位数重组后仅小于该数的数值或仅大于该数的数值

用python语言来求一个10位数重组后仅小于该数的数值或仅大于该数的数值。用户输入与一个10位数,用户可以选择两种操作。 (1) 程序经过运行返回一个该10位数重组后刚刚好小于该数值的数。 (2) 程序经过运行返回一个该10位数重组后刚刚好大于该数值的数。

重点:(1)将该10位数转化为列表方便进行操作。 (2)寻找10位数中的一个反常数。在第一种操作中,从后向前按照从大到小的顺序,寻找出第一个违反该顺序的数字,并将该数与后边仅小于该数的数字交换,交换后,将交换前该数位置后的所有数字进行反转; 在第二种操作中,从后向前按照从小到大的顺序,寻找出第一个违反该顺序的数字,并将该数与后边仅大于该数的数字交换,交换后,将交换前该数位置后的所有数字进行反转。 (3)注意有些特殊的10位数没有刚刚好小于该数值的数或刚刚好大于该数值的数。

注:教师要求 (1) 只能用while循环,不能用for循环 (2) 不能调用库中的函数 (3) 只能用 variable = expression该种形式的赋值 (4) 只允许if…else和if…elif分支语句 (5) 不允许使用break和continue类似语句 (6) 尝试用I != 10 来控制循环条件而不是 i >10. (7) 尽量将程序分为多个可重复利用的函数模块。

项目4:Rotate_array 旋转7x7数组三个圆圈轨道的数字

用python语言来实现旋转一个7x7数组三个圆圈轨道的数字。 给定一个7x7数组, 例: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 10 11 12 13 14 15 16 0 9 8 7 6 5 4 2 4 6 8 10 9 8 4 8 0 9 5 7 3 7 6 8 2 1 0 6 用户可以通过选择输入n的值0、1、2来选择从最外层一圈到最内层一圈的一圈数字。然后,通过输入旋转位移数来实现对该圈数字的旋转,其中负数代表逆时针,正数代表顺时针,数值绝对值大小代表旋转位移数。

以n为0顺时针旋转1位为例: (1)首先,我们将(0,0)位置作为暂存点,旋转一位即顺时针将(0,0)后的每一个数字与(0,0)位置数字交换。 (2)由于我们每次只能对一行或一列的数字进行操作,所以我们选定4个拐角的特定位置作为每次操作起始点,即分别为(0,1)、(1,6)、(6,5)、(5,0), 依次对从左到右第1行,从上到下第7列,从右到左第7行,从下到上第1列中每一个数字与(0,0)位置数字进行交换操作。 旋转多圈即重复多次上述操作,逆时针旋转同理。

注:教师要求 (1) 只能用while循环,不能用for循环 (2) 不能调用库中的函数 (3) 只能用 variable = expression该种形式的赋值 (4) 只允许if…else和if…elif分支语句 (5) 不允许使用break和continue类似语句 (6) 尝试用I != 10 来控制循环条件而不是 i >10. (7) 尽量将程序分为多个可重复利用的函数模块。