diff --git a/chess_floor_ethan.py b/chess_floor_ethan.py new file mode 100644 index 0000000000000000000000000000000000000000..1256f7feca764213dee67e4dbd623e4da2e344f2 --- /dev/null +++ b/chess_floor_ethan.py @@ -0,0 +1,27 @@ +import turtle as t +t.setup(500, 500) +t.speed('fastest') +def block(size, filled): + if filled == True: + t.begin_fill() + for c in range(4): + t.forward(size) + t.right(90) + if filled == True: + t.end_fill() + +size = 10 +num = 8 +filled = True +for c in range(1, num*num+1): + block(size, filled) + if c%num == 0: + t.sety(t.ycor()-size) + t.setx(0) + else: + t.forward(size) + if filled == True: + filled = False + else: + filled = True +t.done() \ No newline at end of file diff --git a/graph_anson.py b/graph_anson.py new file mode 100644 index 0000000000000000000000000000000000000000..157ed55962cb52288c02e73dc70b83870f5da83a --- /dev/null +++ b/graph_anson.py @@ -0,0 +1,38 @@ +import turtle +a=turtle.Turtle() +a.speed('slowest') +a.hideturtle() +a.right(90) +for i in range(4): + a.forward(100) + a.left(90) +a.left(45) +a.penup() +a.forward(70) +a.pendown() +a.right(45) +for i in range(4): + a.forward(100) + a.left(90) +a.right(135) +a.forward(70) +a.right(135) +a.forward(100) +a.right(45) +a.forward(70) +a.right(45) +a.forward(100) +a.right(135) +a.forward(70) +a.left(45) +a.forward(100) +a.left(135) +a.forward(70) +a.penup() +a.left(135) +a.forward(300) +a.left(90) +a.forward(380) +a.write('This is a cube,if you look at it in a different way,you might found something special!',font=('Cambrian',17,'bold')) + +turtle.done() diff --git a/graph_charlie.py b/graph_charlie.py new file mode 100644 index 0000000000000000000000000000000000000000..d6733a1e96720c96cdb74302c79a50e5da8ed723 --- /dev/null +++ b/graph_charlie.py @@ -0,0 +1,33 @@ +# Coded by Charlie + +import turtle +from time import sleep as wait + +t = turtle.Pen() +stage = turtle.Screen() + + +def draw_polygon(sides, size, color): + t.begin_fill() + t.fillcolor(color) + for counter in range(sides): + t.forward(size) + t.left(360 / sides) + t.end_fill() + + +draw_polygon(70, 10, 'DODGER BLUE') +t.penup() +t.goto(0, 100) +t.write('is it a circle??????', font=('Times', 20)) +wait(2) +t.goto(0, -100) +t.write('NO, IT\'S NOT', font=('Arial', 30)) +wait(1) +t.sety(-150) +t.write('It is a polygon with 70 sides', font=('Times', 20)) +t.sety(-175) +t.write('with 10 step a side.', font=('Times', 17)) + + +stage.mainloop() diff --git a/h.py b/h.py new file mode 100644 index 0000000000000000000000000000000000000000..f700f8212465c2d9c440b7a2befd06a2b9b0bf7d --- /dev/null +++ b/h.py @@ -0,0 +1,18 @@ +import turtle as t +t.fillcolor("black") +for couter in range(4): + t.forward(100) + t.right(90) + +t.begin_fill() +for couter in range(2): + t.forward(50) + t.right(90) + t.end_fill() + +t.begin_fill() +t.right(180) +for couter in range(3): + t.forward(50) + t.right(90) + t.end_fill() \ No newline at end of file diff --git a/queens_charlie.py b/queens_charlie.py new file mode 100644 index 0000000000000000000000000000000000000000..b3e61a69a4dc9ce59d6a12db39f7450060eab55f --- /dev/null +++ b/queens_charlie.py @@ -0,0 +1,43 @@ +import turtle + + +stage = turtle.Screen() +t = turtle.Turtle() +stage.setup(1000, 800) + + +def draw_square(color, size=75): + t.begin_fill() + t.fillcolor(color) + for i in range(4): + t.forward(size) + t.left(90) + t.end_fill() + + +def draw_mosaic(size): + draw_square('white') + t.left(180) + draw_square('white') + t.seth(90) + draw_square('black') + t.seth(270) + t.forward(size) + t.left(90) + draw_square('black') + t.hideturtle() + + def plate(sides): + lines = [1, 7, 0, 2, 5, 3, 6, 4] + q1 = turtle.Turtle() + q2 = turtle.Turtle() + q3 = turtle.Turtle() + q4 = turtle.Turtle() + q5 = turtle.Turtle() + q6 = turtle.Turtle() + q7 = turtle.Turtle() + q8 = turtle.Turtle() + + +draw_mosaic(75) +stage.mainloop() diff --git a/square_anson.py b/square_anson.py new file mode 100644 index 0000000000000000000000000000000000000000..f287b82785cc83bc92e30ee5609671dec2e8c9ff --- /dev/null +++ b/square_anson.py @@ -0,0 +1,24 @@ +import turtle +a=turtle.Turtle('turtle') +a.fillcolor('black') +a.speed('fastest') +a.hideturtle() +for i in range(4): + a.forward(200) + a.right(90) +a.begin_fill() +for i in range(4): + a.forward(100) + a.right(90) +a.end_fill() +a.forward(100) +a.right(90) +a.forward(100) +a.begin_fill() +for i in range(4): + a.forward(100) + a.left(90) +a.end_fill() + + +turtle.done() diff --git a/square_charlie.py b/square_charlie.py new file mode 100644 index 0000000000000000000000000000000000000000..d017e64b45581d8382db50848abc84c78976c6a4 --- /dev/null +++ b/square_charlie.py @@ -0,0 +1,32 @@ +import turtle + + +stage = turtle.Screen() +t = turtle.Turtle() +stage.setup(1000, 800) + + +def draw_square(color, size=100): + t.begin_fill() + t.fillcolor(color) + for i in range(4): + t.forward(size) + t.left(90) + t.end_fill() + + +def draw_mosaic(): + draw_square('white') + t.left(180) + draw_square('white') + t.seth(90) + draw_square('black') + t.seth(270) + t.forward(100) + t.left(90) + draw_square('black') + t.hideturtle() + + +draw_mosaic() +stage.mainloop() diff --git a/story.txt b/story.txt new file mode 100644 index 0000000000000000000000000000000000000000..200328edaea33bce0952d93530c4aaf1b675cdbe --- /dev/null +++ b/story.txt @@ -0,0 +1,3 @@ +[W] 我睁开眼, 发现自己站在一个巨大的鼻孔里. +[Judy] 突然,鼻孔的主人打了一个喷嚏。 +[z.X]i were fired out of a very yuck nose \ No newline at end of file diff --git a/week12/The_noobs_brain b/week12/The_noobs_brain new file mode 100644 index 0000000000000000000000000000000000000000..53fd8607624ef622f4413e567dc3238aff44c76e --- /dev/null +++ b/week12/The_noobs_brain @@ -0,0 +1,5 @@ +'france': 'paris', +'china': "beijing", +"uni.king.": 'london', +'usa': 'nyk' +'egypt': 'cario' diff --git a/week12/eack.py b/week12/eack.py new file mode 100644 index 0000000000000000000000000000000000000000..10c754f5ade9675337279d35b1665e42b3648fe2 --- /dev/null +++ b/week12/eack.py @@ -0,0 +1,29 @@ +from tkinter import Tk, simpledialog, messagebox + + + +the_noobs_brain = {'france': 'paris', 'china': "beijing", "uni.king.": 'london', 'usa': 'nyk'} +def read_from_file(): + with open("The_noobs_brain") as file: + for line in file: + line = line.rstrip('/n') + coutry, city = line.split('/') + the_noobs_brain[coutry] = city + +def write_to_file(country_name, city_name): + read_from_file() + + +while True: + query_country = simpledialog.askstring('Country', 'type the name of the country:') + + + if query_country in the_noobs_brain: + result = the_noobs_brain[query_country] + + +print('welcome to ask the noob') +root = Tk +root.withdraw + +the_noobs_brain = {'france': 'paris', 'china': "beijing", "uni.king.": 'london', 'usa': 'nyk'} diff --git a/week12/golden_spiral.py b/week12/golden_spiral.py index f03c021a7a89a932ecfe1710efead3f8f86d4c9b..6c38c1f15944a2c469e342fa7faaefe4bb253d8d 100644 --- a/week12/golden_spiral.py +++ b/week12/golden_spiral.py @@ -1,5 +1,7 @@ -import turtle +import turtle, time + +turtle.bgcolor('white') # TODO: 创建 Fibonacci 数列 fib = [1, 1] for i in range(2, 20): @@ -9,7 +11,6 @@ for i in range(2, 20): stage = turtle.Screen() stage.setup(1200, 800) stage.colormode(255) -stage.bgcolor('light gray') t = turtle.Turtle('triangle') t.speed(0) @@ -31,4 +32,57 @@ for i in range(0, len(fib)): t.circle(radius, 90) t.end_fill() -stage.mainloop() \ No newline at end of file + +time.sleep(5) +t.clear() + +stage = turtle.Screen() +t = turtle.Turtle() +t.speed(10) +def draw_fish(r, color1, color2): + t.fillcolor(color1) + t.begin_fill() + + t.circle(r, extent=180) + t.circle(2*r, extent=180) + + # TODO: 倒着画一个半径为r的半圆 + # extent的值为正时,海龟逆时针画圆;而extent的值为负时,海龟顺时针画圆 + t.circle(r, extent=-180) + + t.end_fill() + + # TODO: 向上移动r*2/3的距离,然后面向右 + # 方法一:不使用坐标 - forward(), left() / right(), penup() / pendown() + t.penup() + t.right(90) + t.forward(r*2/3) + t.right(90) + t.pendown() + + # 方法二:引入坐标概念 - setpos(), setheading() + # 略 + + # TODO: 画一个半径为r/3的圆,填成白色 + t.fillcolor(color2) + t.begin_fill() + t.circle(r/3) + t.end_fill() + + # TODO: 向下移动r*2/3的距离,然后面向左 + t.penup() + t.right(90) + t.forward(r*2/3) + t.right(90) + t.pendown() + +draw_fish(100, 'black', 'white') +draw_fish(100, 'white', 'black') + +# TODO: 结束程序 +stage.mainloop() + +t.clear() +time.sleep(2) + +t.write('thanks for the show considers two stuff!') \ No newline at end of file diff --git a/week12/j.py b/week12/j.py new file mode 100644 index 0000000000000000000000000000000000000000..62662dfdee1f834299d233424749e811c8ddfeed --- /dev/null +++ b/week12/j.py @@ -0,0 +1,27 @@ +import turtle as t +t.setup(500, 500) +t.speed(0) +def block(size, filled): + if filled == True: + t.begin_fill() + for c in range(4): + t.forward(size) + t.right(90) + if filled == True: + t.end_fill() + +size = 10 +num = 24 +filled = True +for c in range(1, num*num+1): + block(size, filled) + if c%num == 0: + t.sety(t.ycor()-size) + t.setx(0) + else: + t.forward(size) + if filled == True: + filled = False + else: + filled = True +t.done() \ No newline at end of file diff --git a/week12/l.py b/week12/l.py new file mode 100644 index 0000000000000000000000000000000000000000..aaaa426c22bc55a0fffeec3d1ae0902d26d81ff1 --- /dev/null +++ b/week12/l.py @@ -0,0 +1,391 @@ +from turtle import Turtle +import turtle +from time import time, sleep +from random import randint +import glob + +GROUND_GIF_HEIGHT = 112 +BIRD_GIF_WIDTH = 36 +BIRD_GIF_HEIGHT = 24 +TUBE_GIF_WIDTH = 52 +TUBE_GIF_HEIGHT = 320 + +HORIZON_LINE = -200 + GROUND_GIF_HEIGHT/2 + BIRD_GIF_HEIGHT/2 +TUBE_DIST = 230 +BG_WIDTH = 286 +SPEED_X = 100 + +class Bird(Turtle): + BIRD_GIFS = ["bird0.gif", "bird1.gif", "bird2.gif"] + def __init__(self): + super().__init__('bird0.gif') + self.penup() + self.ready() + + def ready(self): + self.setpos(0, 0) + self.current_shape_id = 0 + self.hit_t, self.hit_y = 0, 0 + + def rect(self): + return [self.xcor()-BIRD_GIF_WIDTH/2, self.ycor()+BIRD_GIF_HEIGHT/2, + self.xcor()+BIRD_GIF_WIDTH/2, self.ycor()-BIRD_GIF_HEIGHT/2] + + def flap(self, t): + y = self.compute_y(t) + if y > HORIZON_LINE: + self.sety(y) + else: + self.sety(HORIZON_LINE) + self.current_shape_id = (self.current_shape_id + 1) % len(self.BIRD_GIFS) + self.shape(self.BIRD_GIFS[self.current_shape_id]) + + def hit(self, t): + self.hit_y = self.compute_y(t) + self.hit_t = t + + def compute_y(self, t): + return self.hit_y - 100 * (t - self.hit_t) * (t - self.hit_t - 1) + + +class Label(Turtle): + def __init__(self, x, y, number=0, text='', size=14, color="white"): + super().__init__('blank') + self.penup() + self.setpos(x, y) + self.color(color) + + self.message = text + self.font = ['Comic Sans MS', size, 'bold'] + self.number = number + + def __int__(self): + return self.number + + def set_number(self, other): + self.number = other + self.display() + + def count_down(self): + self.pencolor('yellow') + for i in range(3, 0, -1): + self.number = i + self.display() + sleep(1) + self.pencolor('white') + self.set_number(0) + + def display(self): + self.clear() + text = self.message + if '%' in text: + text = text % self.number + super().write(text, align='center', font=self.font) + + +class Terrain(Turtle): + def __init__(self): + super().__init__('ground.gif') + self.penup() + self.setpos(0, -200) + + +class TubePair(): + def __init__(self, x=0, y=10000): + self.x, self.y = x, y + self.tube_upper = turtle.Turtle('tube1.gif') + self.tube_lower = turtle.Turtle('tube2.gif') + + self.tube_upper.penup() + self.tube_lower.penup() + + self.goto(self.x, self.y) + + def goto(self, x, y): + self.x, self.y = x, y + self.tube_upper.goto(self.x, 250 + self.y) + self.tube_lower.goto(self.x, -150 + self.y) + + def setx(self, x): + self.goto(x, self.y) + + def sety(self, y): + self.goto(self.x, y) + + def bump(self, rect): + if self.y > 1000: + return False + # tube pictures are in size of 52 * 320 + if rect[2] >= self.x - TUBE_GIF_WIDTH/2 and \ + rect[0] <= self.x + TUBE_GIF_WIDTH/2: + # bird overlapped with the tube + return self.tube_lower.ycor() + TUBE_GIF_HEIGHT/2 >= rect[3] or \ + self.tube_upper.ycor() - TUBE_GIF_HEIGHT/2 <= rect[1] + + return False + + def ycor(self): + return self.x + + +# turtle.Screen is a single instance class that cannot be inherited +class Stage: + def __init__(self, screen): + self._stage = screen + self.curtain_call() + + def onupdate(self, timer=None): + self._stage.update() + self._stage.ontimer(timer, int(1000/SPEED_X)) + + def curtain_call(self): + self._stage.bgpic('bg2.gif') + + def reset(self): + self._stage.bgpic('bg1.gif') + + +class Game: + def __init__(self, screen): + # configure game settings + + self.state = "end" + self.score = Label(0, 130, text='%s', size=80) + self.best = Label(90, 180, text='BEST: %s') + self.prompt = Label(0, -215, text='Press Space to start...') + + self.stage = Stage(screen) + + self.bird = Bird() + self.tubes = [TubePair() for i in range(3)] + self.grounds = [Terrain() for i in range(3)] + + self.prompt.display() + self.stage.onupdate() + + def start(self): + self.state = 'alive' + self.best.clear() + + for i in range(3): + self.tubes[i].goto((i-1)*TUBE_DIST, 10000) + self.stage.onupdate() + + self.prompt.clear() + self.score.count_down() + self.start_time = time() + + self.bird.ready() + self.stage.reset() + + self.tube_base = 0 + self.tubes[2].sety(randint(-100,50)) + + self.refresh() + + def fly(self): + if self.state == 'end': + # start_game(game) + self.start() + return + + try: + self.bird.hit(self.tick()) + except: + pass + + def tick(self): + return time() - self.start_time + + def is_game_over(self): + if self.bird.ycor() <= HORIZON_LINE: + self.state = "dead" + return True + + # check if the bird bumps onto any tube + for tube in self.tubes: + if tube.bump(self.bird.rect()): + self.state = 'dead' + return True + return False + + def clean_up_screen(self): + # refresh best score + self.best.set_number(max(int(self.best), int(self.score))) + # change backdrop + self.stage.curtain_call() + self.prompt.display() + sleep(1) + self.state = 'end' + + def redraw(self): + t = self.tick() + x = int(t * SPEED_X) + + # flap the bing wings + self.bird.flap(t) + + # move the tubes + tube_base = -(x % TUBE_DIST) + # test whether a point gained + if self.tube_base < tube_base: + if self.tubes[2].ycor() < 1000: + self.score.set_number(int(self.score) + 1) + tube = self.tubes.pop(0) + tube.sety(randint(-100, 50)) + self.tubes.append(tube) + self.tube_base = tube_base + + for i in range(3): + self.tubes[i].setx(tube_base + (i - 1) * TUBE_DIST) + + # move the grounds + bg_base = - (x % BG_WIDTH) + for i in range(3): + self.grounds[i].setx(bg_base + BG_WIDTH * (i - 1)) + + # update the screen + self.stage.onupdate(self.refresh) + + def refresh(self): + if self.is_game_over(): + self.clean_up_screen() + else: + self.redraw() + + +stage = turtle.Screen() +stage.screensize(216, 500) +stage.setup(288, 512) +stage.tracer(False, 0) +for f in glob.glob("*.gif"): + stage.addshape(f) + +game = Game(stage) + +stage.onkey(game.fly, "space") +stage.listen() +stage.mainloop() + +class CurvesTurtle(Pen): + # example derived from + # Turtle Geometry: The Computer as a Medium for Exploring Mathematics + # by Harold Abelson and Andrea diSessa + # p. 96-98 + def hilbert(self, size, level, parity): + if level == 0: + return + # rotate and draw first subcurve with opposite parity to big curve + self.left(parity * 90) + self.hilbert(size, level - 1, -parity) + # interface to and draw second subcurve with same parity as big curve + self.forward(size) + self.right(parity * 90) + self.hilbert(size, level - 1, parity) + # third subcurve + self.forward(size) + self.hilbert(size, level - 1, parity) + # fourth subcurve + self.right(parity * 90) + self.forward(size) + self.hilbert(size, level - 1, -parity) + # a final turn is needed to make the turtle + # end up facing outward from the large square + self.left(parity * 90) + + # Visual Modeling with Logo: A Structural Approach to Seeing + # by James Clayson + # Koch curve, after Helge von Koch who introduced this geometric figure in 1904 + # p. 146 + def fractalgon(self, n, rad, lev, dir): + import math + + # if dir = 1 turn outward + # if dir = -1 turn inward + edge = 2 * rad * math.sin(math.pi / n) + self.pu() + self.fd(rad) + self.pd() + self.rt(180 - (90 * (n - 2) / n)) + for i in range(n): + self.fractal(edge, lev, dir) + self.rt(360 / n) + self.lt(180 - (90 * (n - 2) / n)) + self.pu() + self.bk(rad) + self.pd() + + # p. 146 + def fractal(self, dist, depth, dir): + if depth < 1: + self.fd(dist) + return + self.fractal(dist / 3, depth - 1, dir) + self.lt(60 * dir) + self.fractal(dist / 3, depth - 1, dir) + self.rt(120 * dir) + self.fractal(dist / 3, depth - 1, dir) + self.lt(60 * dir) + self.fractal(dist / 3, depth - 1, dir) + +def main(): + ft = CurvesTurtle() + + ft.reset() + ft.speed(0) + ft.ht() + ft.getscreen().tracer(1,0) + ft.pu() + + size = 6 + ft.setpos(-33*size, -32*size) + ft.pd() + + ta=clock() + ft.fillcolor("red") + ft.begin_fill() + ft.fd(size) + + ft.hilbert(size, 6, 1) + + # frame + ft.fd(size) + for i in range(3): + ft.lt(90) + ft.fd(size*(64+i%2)) + ft.pu() + for i in range(2): + ft.fd(size) + ft.rt(90) + ft.pd() + for i in range(4): + ft.fd(size*(66+i%2)) + ft.rt(90) + ft.end_fill() + tb=clock() + res = "Hilbert: %.2fsec. " % (tb-ta) + + sleep(3) + + ft.reset() + ft.speed(0) + ft.ht() + ft.getscreen().tracer(1,0) + + ta=clock() + ft.color("black", "blue") + ft.begin_fill() + ft.fractalgon(3, 250, 4, 1) + ft.end_fill() + ft.begin_fill() + ft.color("red") + ft.fractalgon(3, 200, 4, -1) + ft.end_fill() + tb=clock() + res += "Koch: %.2fsec." % (tb-ta) + return res + +if __name__ == '__main__': + msg = main() + print(msg) + mainloop() diff --git a/week12/v.py b/week12/v.py new file mode 100644 index 0000000000000000000000000000000000000000..3a6f9eaeb00f651a626f2aba4f104e7310304329 --- /dev/null +++ b/week12/v.py @@ -0,0 +1,70 @@ +import turtle +turtle.Screen() +turtle.speed(0) +turtle.bgcolor('cyan') +turtle.pencolor("blue") +o = 78 +turtle.write('i am a yeti') +turtle.begin_fill() +turtle.fillcolor("blue") +for couter in range(30): + turtle.begin_fill() + turtle.forward(12) + turtle.right(40) + turtle.circle(o) + turtle.end_fill() + +turtle.clear() + + +# TODO: 初始化舞台和海龟 +import turtle +stage = turtle.Screen() +t = turtle.Turtle() +t.speed(10) +def draw_fish(r, color1, color2): + # TODO: 设置海龟的填充色 + t.fillcolor(color1) + t.begin_fill() + + # TODO: 画一个半径为r的半圆 + t.circle(r, extent=180) + + # TODO: 画一个半t.circle(r, extent=180)径为2*r的半圆 + t.circle(2*r, extent=180) + + # TODO: 倒着画一个半径为r的半圆 + # extent的值为正时,海龟逆时针画圆;而extent的值为负时,海龟顺时针画圆 + t.circle(r, extent=-180) + + t.end_fill() + + # TODO: 向上移动r*2/3的距离,然后面向右 + # 方法一:不使用坐标 - forward(), left() / right(), penup() / pendown() + t.penup() + t.right(90) + t.forward(r*2/3) + t.right(90) + t.pendown() + + # 方法二:引入坐标概念 - setpos(), setheading() + # 略 + + # TODO: 画一个半径为r/3的圆,填成白色 + t.fillcolor(color2) + t.begin_fill() + t.circle(r/3) + t.end_fill() + + # TODO: 向下移动r*2/3的距离,然后面向左 + t.penup() + t.right(90) + t.forward(r*2/3) + t.right(90) + t.pendown() + +draw_fish(100, 'black', 'white') +draw_fish(100, 'white', 'black') + +# TODO: 结束程序 +stage.mainloop() \ No newline at end of file diff --git a/week13/week13_demo.py b/week13/week13_demo.py index 6e63488ce4f151b0b6f1794c7931a2f8177cc811..88d4e16bacd0314dca688d2ca22e1327809cbcad 100644 --- a/week13/week13_demo.py +++ b/week13/week13_demo.py @@ -1,25 +1,268 @@ -# 知识点:Fork+Pull工作流 -# -# Demo 13.1 -# ========== -# -# 这是个Demo任务,目的是演示Fork+Pull工作流。 -# -# ** 任务描述 ** -# -# 新建一个蓝底白字的窗口,在屏幕中心显示"DEMO"。 -# -# ** 提交 ** -# 1. 添加remote仓库Moleqode/practice,起名为upstream。 -# 2. 以Pull Request的方式提交到 upstream: exercise 分支。 - +from turtle import Turtle import turtle +from time import time, sleep +from random import randint +import glob + +GROUND_GIF_HEIGHT = 112 +BIRD_GIF_WIDTH = 36 +BIRD_GIF_HEIGHT = 24 +TUBE_GIF_WIDTH = 52 +TUBE_GIF_HEIGHT = 320 + +HORIZON_LINE = -200 + GROUND_GIF_HEIGHT/2 + BIRD_GIF_HEIGHT/2 +TUBE_DIST = 230 +BG_WIDTH = 286 +SPEED_X = 100 + +class Bird(Turtle): + BIRD_GIFS = ["bird0.gif", "bird1.gif", "bird2.gif"] + def __init__(self): + super().__init__('bird0.gif') + self.penup() + self.ready() + + def ready(self): + self.setpos(0, 0) + self.current_shape_id = 0 + self.hit_t, self.hit_y = 0, 0 + + def rect(self): + return [self.xcor()-BIRD_GIF_WIDTH/2, self.ycor()+BIRD_GIF_HEIGHT/2, + self.xcor()+BIRD_GIF_WIDTH/2, self.ycor()-BIRD_GIF_HEIGHT/2] + + def flap(self, t): + y = self.compute_y(t) + if y > HORIZON_LINE: + self.sety(y) + else: + self.sety(HORIZON_LINE) + self.current_shape_id = (self.current_shape_id + 1) % len(self.BIRD_GIFS) + self.shape(self.BIRD_GIFS[self.current_shape_id]) + + def hit(self, t): + self.hit_y = self.compute_y(t) + self.hit_t = t + + def compute_y(self, t): + return self.hit_y - 100 * (t - self.hit_t) * (t - self.hit_t - 1) + + +class Label(Turtle): + def __init__(self, x, y, number=0, text='', size=14, color="white"): + super().__init__('blank') + self.penup() + self.setpos(x, y) + self.color(color) + + self.message = text + self.font = ['Comic Sans MS', size, 'bold'] + self.number = number + + def __int__(self): + return self.number + + def set_number(self, other): + self.number = other + self.display() + + def count_down(self): + self.pencolor('yellow') + for i in range(3, 0, -1): + self.number = i + self.display() + sleep(1) + self.pencolor('white') + self.set_number(0) + + def display(self): + self.clear() + text = self.message + if '%' in text: + text = text % self.number + super().write(text, align='center', font=self.font) + + +class Terrain(Turtle): + def __init__(self): + super().__init__('ground.gif') + self.penup() + self.setpos(0, -200) + + +class TubePair(): + def __init__(self, x=0, y=10000): + self.x, self.y = x, y + self.tube_upper = turtle.Turtle('tube1.gif') + self.tube_lower = turtle.Turtle('tube2.gif') + + self.tube_upper.penup() + self.tube_lower.penup() + + self.goto(self.x, self.y) + + def goto(self, x, y): + self.x, self.y = x, y + self.tube_upper.goto(self.x, 250 + self.y) + self.tube_lower.goto(self.x, -150 + self.y) + + def setx(self, x): + self.goto(x, self.y) + + def sety(self, y): + self.goto(self.x, y) + + def bump(self, rect): + if self.y > 1000: + return False + # tube pictures are in size of 52 * 320 + if rect[2] >= self.x - TUBE_GIF_WIDTH/2 and \ + rect[0] <= self.x + TUBE_GIF_WIDTH/2: + # bird overlapped with the tube + return self.tube_lower.ycor() + TUBE_GIF_HEIGHT/2 >= rect[3] or \ + self.tube_upper.ycor() - TUBE_GIF_HEIGHT/2 <= rect[1] + + return False + + def ycor(self): + return self.x + + +# turtle.Screen is a single instance class that cannot be inherited +class Stage: + def __init__(self, screen): + self._stage = screen + self.curtain_call() + + def onupdate(self, timer=None): + self._stage.update() + self._stage.ontimer(timer, int(1000/SPEED_X)) + + def curtain_call(self): + self._stage.bgpic('bg2.gif') + + def reset(self): + self._stage.bgpic('bg1.gif') + + +class Game: + def __init__(self, screen): + # configure game settings + + self.state = "end" + self.score = Label(0, 130, text='%s', size=80) + self.best = Label(90, 180, text='BEST: %s') + self.prompt = Label(0, -215, text='Press Space to start...') + + self.stage = Stage(screen) + + self.bird = Bird() + self.tubes = [TubePair() for i in range(3)] + self.grounds = [Terrain() for i in range(3)] + + self.prompt.display() + self.stage.onupdate() + + def start(self): + self.state = 'alive' + self.best.clear() + + for i in range(3): + self.tubes[i].goto((i-1)*TUBE_DIST, 10000) + self.stage.onupdate() + + self.prompt.clear() + self.score.count_down() + self.start_time = time() + + self.bird.ready() + self.stage.reset() + + self.tube_base = 0 + self.tubes[2].sety(randint(-100,50)) + + self.refresh() + + def fly(self): + if self.state == 'end': + # start_game(game) + self.start() + return + + try: + self.bird.hit(self.tick()) + except: + pass + + def tick(self): + return time() - self.start_time + + def is_game_over(self): + if self.bird.ycor() <= HORIZON_LINE: + self.state = "dead" + return True + + # check if the bird bumps onto any tube + for tube in self.tubes: + if tube.bump(self.bird.rect()): + self.state = 'dead' + return True + return False + + def clean_up_screen(self): + # refresh best score + self.best.set_number(max(int(self.best), int(self.score))) + # change backdrop + self.stage.curtain_call() + self.prompt.display() + sleep(1) + self.state = 'end' + + def redraw(self): + t = self.tick() + x = int(t * SPEED_X) + + # flap the bing wings + self.bird.flap(t) + + # move the tubes + tube_base = -(x % TUBE_DIST) + # test whether a point gained + if self.tube_base < tube_base: + if self.tubes[2].ycor() < 1000: + self.score.set_number(int(self.score) + 1) + tube = self.tubes.pop(0) + tube.sety(randint(-100, 50)) + self.tubes.append(tube) + self.tube_base = tube_base + + for i in range(3): + self.tubes[i].setx(tube_base + (i - 1) * TUBE_DIST) + + # move the grounds + bg_base = - (x % BG_WIDTH) + for i in range(3): + self.grounds[i].setx(bg_base + BG_WIDTH * (i - 1)) + + # update the screen + self.stage.onupdate(self.refresh) + + def refresh(self): + if self.is_game_over(): + self.clean_up_screen() + else: + self.redraw() + -t = turtle.Turtle('blank') stage = turtle.Screen() +stage.screensize(216, 500) +stage.setup(288, 512) +stage.tracer(False, 0) +for f in glob.glob("*.gif"): + stage.addshape(f) -stage.bgcolor('navy') -t.pencolor('white') -t.write('DEMO', align='center', font=('Cambria', 100, 'bold')) +game = Game(stage) +stage.onkey(game.fly, "space") +stage.listen() stage.mainloop() \ No newline at end of file diff --git a/week15/ex15_1 rainbow.py b/week15/ex15_1 rainbow.py index e3cce403f94270273e6d576514fd499595520224..13195aa9363000056cbb9dadbf2bf12d897c674f 100644 --- a/week15/ex15_1 rainbow.py +++ b/week15/ex15_1 rainbow.py @@ -1,17 +1,24 @@ -rainbow = [red, orange, yellow, green, blue, vilet] -for i in range(7): - print(rainbow[i]) - print('My favorite color is', rainbow[0]) +import turtle +import time -import turtle as t -import sleep from time -x = input('Input x coordinate: ') -y = input('Input y coordinate: ') -goto(x, y) -penup() -write("I'll give you some color see see. heiheihei~~~", 'center') -goto(-200,200) -write("Ready...Go!", font=50) -for i in range(7): - sleep(1) - bgcolor(rainbow[i]) \ No newline at end of file +try: + z = turtle.Turtle + screen = z.set_up(800, 500) + rainbow = ['red', 'orange', 'yellow', 'green', 'blue', 'violet'] +except Exception: + for i in range(5): + print(rainbow[i]) + print('My favorite color is', rainbow[0]) + x = input('Input x coordinate: ') + y = input('Input y coordinate: ') + z.goto(x, y) + z.pendown() + z.write("I'll give you some color see see. heiheihei~~~") + z.goto(-200, 200) + z.write("Ready...Go!", font=('Times')) + for i in range(7): + time.sleep(1) + z.bgcolor(rainbow[i]) + + +turtle.done() \ No newline at end of file