Python_Weekend_13 面向对象做三个分数、大球吃小球、五子棋
2018-03-14 23:45
537 查看
主要是练习的是面向对象的方法,通过三个例子进行
第一个是:计算分数的加减乘除
结果如下:
第二个程序:大球吃小球
这个的BUG是四个角落点击出现的 球会出现类似卡住抖动的效果,还需要改进
第三个程序是五子棋:
虽然做了三道题,但是感觉对面向对象还是理解的不好,可能是不太熟悉吧,还需多加练习相关习题
ps:不过做出来,看着效果,感觉好安逸,更加有兴趣继续专研了
第一个是:计算分数的加减乘除
from math import gcd class Fraction(object): def __init__(self, num, den): if den == 0: raise ValueError('分母不能为0') self._num = num self._den = den self.normalize() ## 如果分母为负数 则处理整个分数 self.simplify() ## 约分数 @property def num(self): return self._num @property def den(self): return self._den def add(self, other): return Fraction(self._num * other.den + self._den * other.num, self._den * other.den).simplify().normalize() def sub(self, other): return Fraction(self._num * other.den - self._den * other.num, self._den * other.den).simplify().normalize() def mul(self, other): return Fraction(self._num * other.num, self._den * other.den)\ .simplify().normalize() def div(self, other): return Fraction(self._num * other.den, self._den * other.num)\ .simplify().normalize() def __add__(self, other): ## 这是用内置加减乘法运算 return self.add(other) def __sub__(self, other): return self.sub(other) def __mul__(self, other): return self.mul(other) def __truediv__(self, other): return self.div(other) def simplify(self): if self._num != 0 and self._den != 1: factor = gcd(abs(self._num), abs(self._den)) if factor > 1: self._num //= factor self._den //= factor return self def normalize(self): if self._den < 0: self._num = -self._num self._den = -self._den return self def __str__(self): if self._num == 0: return '0' elif self._den == 1: return str(self._num) else: return '%d/%d' % (self._num, self._den) def main(): f1 = Fraction(3, -6) f2 = Fraction(3, 4) print(f1) print(f2) print(f1 + f2) print(f1 - f2) print(f1 * f2) print(f1 / f2) print((f1 - f2) * f2) if __name__ == '__main__': main()
结果如下:
-1/2 3/4 1/4 -5/4 -3/8 -2/3 -15/16
第二个程序:大球吃小球
from random import randint import pygame class Ball(object): def __init__(self, center, color, radius, speed): # 中心点 ,颜色,半径,速度 self._center = center self._color = color self._radius = radius self._speed = speed @property def center(self): return self._center @property def radius(self): return self._radius def move(self): ## 移动 x, y = self._center[0], self._center[1] sx, sy = self._speed[0], self._speed[1] self._center = x, y = x + sx, y + sy if x + self._radius >= 800 or x - self._radius <= 0: self._speed = -sx, sy if y + self._radius >= 600 or y - self._radius <= 0: self._speed = sx, -sy def draw(self, screen): pygame.draw.circle(screen, self._color, self._center, self._radius, 0) def main(): balls = [] pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption('大球吃小球') clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.MOUSEBUTTONDOWN \ and event.button == 1: color = random_color() radius = randint(10, 100) speed = randint(-10, 10), randint(-10, 10) ball = Ball(event.pos, color, radius, speed) balls.append(ball) refresh(screen, balls) clock.tick(24) for ball in balls: ball.move() pygame.quit() def refresh(screen, balls): bg_color = (242, 242, 242) screen.fill(bg_color) for ball in balls: ball.draw(screen) pygame.display.flip() def random_color(): red = randint(0, 255) green = randint(0, 255) blue = randint(0, 255) return red, green, blue if __name__ == '__main__': main()
这个的BUG是四个角落点击出现的 球会出现类似卡住抖动的效果,还需要改进
第三个程序是五子棋:
import pygame EMPTY = 0 BLACK = 1 WHITE = 2 black_color = [0,0,0] # 黑棋 white_color = [255, 255,255] #白棋 class RenjuBoard(object): def __init__(self): self._board = [[]] * 15 self.reset() # 棋盘状态 def reset(self): for row in range(len(self._board)): self._board[row] = [EMPTY] * 15 # 清空棋盘 #走棋 def move(self,row,col,is_black): if self._board[row][col] == EMPTY: self._board[row][col] = BLACK if is_black else WHITE return True return False # 画棋盘 # 传屏幕 def draw(self,screen): for index in range(1, 16): pygame.draw.line(screen, black_color, [40, 40 * index], [600, 40 * index], 2) # 划线 屏幕 起点位置 初始位置 结束位置 线段粗细 pygame.draw.line(screen, black_color, [40 * index, 40], [40 * index, 600], 2) pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 4) # 画矩形 左上角起点前两个 后两个宽高 pygame.draw.circle(screen, black_color, [320, 320], 5, 0) # 画圆 后面0表示填充 pygame.draw.circle(screen, black_color, [160, 160], 5, 0) pygame.draw.circle(screen, black_color, [480, 480], 5, 0) pygame.draw.circle(screen, black_color, [480, 160], 5, 0) pygame.draw.circle(screen, black_color, [160, 480], 5, 0) for row in range(len(self._board)): for col in range(len(self._board[row])): if self._board[row][col] != EMPTY: ccolor = black_color \ if self._board[row][col] == BLACK else white_color pos = [40 * (col + 1), 40 * (row + 1)] pygame.draw.circle(screen, ccolor, pos, 20, 0) def main(): board = RenjuBoard() is_black = True pygame.init() # 初始化 pygame.display.set_caption('五子棋') # 名字命名 screen = pygame.display.set_mode([640, 640]) # 桌面大小 screen.fill([255, 255, 0]) # 填充 board.draw(screen) # 执行画格子动作 pygame.display.flip() #更新显示到屏幕表面 running = True while running: for event in pygame.event.get(): ## 判断事件 if event.type == pygame.QUIT: ## 退出窗口 running = False # 运行结束 elif event.type == pygame.MOUSEBUTTONDOWN\ and event.button == 1: # 鼠标点击事件 x,y = event.pos # 事件发生坐标 row =round((y - 40)/40) col = round((x - 40) / 40) if board.move(row,col,is_black): is_black = not is_black # 检查如果不是白色 screen.fill([255,255,0]) # 填充 board.draw(screen) # 执行画格子动作 pygame.display.flip() #更新显示到屏幕表面 pygame.quit() # 退出 if __name__ == '__main__': main()
虽然做了三道题,但是感觉对面向对象还是理解的不好,可能是不太熟悉吧,还需多加练习相关习题
ps:不过做出来,看着效果,感觉好安逸,更加有兴趣继续专研了
相关文章推荐
- Python_Weekend_10 定义类, 面向对象
- python学习(13)——面向对象高级编程
- Python基础—13-面向对象及异常处理
- 转:Python之路,Day6 - 面向对象学习
- python Class:面向对象高级编程
- python Class:面向对象高级编程 __getattr__
- [Language]Python的面向对象
- Python面向对象特征总结
- Python 学习笔记 - 面向对象(单例模式和异常处理)
- python——面向对象基础
- Python面向对象和图形用户界面(二)---- GUI的基本框架 & 常用组件 & 布局管理
- Python面向对象高级编程——学习笔记
- python学习----------面向对象2
- 关于python面向对象中对对象有共同属性进行去重
- python自我学习1--class 面向对象变成
- java学习日记_13:面向对象之对象的内存示意图。
- python 面向对象开发例子
- python(六)面向对象学习--类
- python oop面向对象笔记
- python面向对象进阶