1. 程式人生 > 其它 >20213410林瀚誠實驗四python綜合實踐實驗報告

20213410林瀚誠實驗四python綜合實踐實驗報告

課程:《python程式設計》

班級:2134

姓名:林瀚誠

學號:20213410

實驗教師:王志強

實驗日期:2021年5月25日

一.實驗內容:

用python編寫一個小時候玩的小鳥在柱子間飛行的遊戲

二.實驗過程及結果:

程式碼:

from turtle import *
from time import time, sleep
from random import randint
from subprocess import Popen
import sys
import glob


screensize(216, 500)
setup(288, 512)
tracer(False, 0)
hideturtle()
for f in glob.glob("*.gif"):
addshape(f)

font_name = "Comic Sans MS"
speed_x = 100
ground_line = -200 + 56 + 12
tube_dist = 230
bg_width = 286


def TextTurtle(x, y, color):
t = Turtle()
t.hideturtle()
t.up()
t.goto(x, y)
t.speed(0)
t.color(color)
return t


def GIFTurtle(fname):
t = Turtle(fname + ".gif")
t.speed(0)
t.up()
return t

score_txt = TextTurtle(0, 130, "white")
best_txt = TextTurtle(90, 180, "white")
pycon_apac_txt = TextTurtle(0, -270, "white")
bgpic("bg1.gif")
tubes = [(GIFTurtle("tube1"), GIFTurtle("tube2")) for i in range(3)]
grounds = [GIFTurtle("ground") for i in range(3)]
bird = GIFTurtle("bird1")

PYCON_APAC_AD = """\
More Fun at
PyCon APAC 2014/TW
"""

class Game:
state = "end"
score = best = 0
game = Game()


def start_game(game):
game.best = max(game.score, game.best)
game.tubes_y = [10000] * 3
game.hit_t, game.hit_y = 0, 0
game.state = "alive"
game.tube_base = 0
game.score = 0
game.start_time = time()
pycon_apac_txt.clear()
update_game(game)


def compute_y(t, game):
return game.hit_y - 100 * (t - game.hit_t) * (t - game.hit_t - 1)


def update_game(game):
if game.state == "dead":
play_sound("clickclick")
pycon_apac_txt.write(
PYCON_APAC_AD,
align="center",
font=(font_name, 24, "bold")
)
sleep(2)
game.state = "end"
return
t = time() - game.start_time
bird_y = compute_y(t, game)
if bird_y <= ground_line:
bird_y = ground_line
game.state = "dead"
x = int(t * speed_x)
tube_base = -(x % tube_dist) - 40
if game.tube_base < tube_base:
if game.tubes_y[2] < 1000:
game.score += 1
play_sound("bip")
game.tubes_y = game.tubes_y[1:] + [randint(-100, 50)]
game.tube_base = tube_base
for i in range(3):
tubes[i][0].goto(
tube_base + tube_dist * (i - 1), 250 + game.tubes_y[i])
tubes[i][1].goto(
tube_base + tube_dist * (i - 1), -150 + game.tubes_y[i])
if game.tubes_y[2] < 1000:
tube_left = tube_base + tube_dist - 28
tube_right = tube_base + tube_dist + 28
tube_upper = game.tubes_y[2] + 250 - 160
tube_lower = game.tubes_y[2] - 150 + 160
center = Vec2D(0, bird_y - 2)
lvec = Vec2D(tube_left, tube_upper) - center
rvec = Vec2D(tube_right, tube_upper) - center
if (tube_left < 18 and tube_right > -18) and bird_y - 12 <= tube_lower:
game.state = "dead"
if (tube_left <= 8 and tube_right >= -8) and bird_y + 12 >= tube_upper:
game.state = "dead"
if abs(lvec) < 14 or abs(rvec) < 14:
game.state = "dead"
bg_base = -(x % bg_width)
for i in range(3):
grounds[i].goto(bg_base + bg_width * (i - 1), -200)
bird.shape("bird%d.gif" % abs(int(t * 4) % 4 - 1))
bird.goto(0, bird_y)
score_txt.clear()
score_txt.write(
"%s" % (game.score), align="center", font=(font_name, 80, "bold"))
if game.best:
best_txt.clear()
best_txt.write(
"BEST: %d" % (game.best), align="center", font=(font_name, 14, "bold"))
update()
ontimer(lambda: update_game(game), 10)


def fly(game=game):
if game.state == "end":
start_game(game)
return
t = time() - game.start_time
bird_y = compute_y(t, game)
if bird_y > ground_line:
game.hit_t, game.hit_y = t, bird_y
play_sound("tack", 20)

onkey(fly, "space")
listen()
mainloop()
sys.exit(1)

程式碼的執行結果:

 使用華為雲彈性伺服器

 三.實驗問題

1,第一次用python寫遊戲,在網上知道要安裝pygame模組,但有時還是會彈出型別“game”沒有預期的特性

解決方法:好像每新建一個新的python檔案都要在那個檔案安裝pygame

2.插入鳥和水管的圖片時反覆出現問題

解決方法:參考網上的方法

3.從網上學習怎麼定義遊戲介面,座標,顏色以及所需要的各種各樣的庫等等

學習了很多新的函式和互動方式

四.實驗感悟

這次的實驗比之前要難很多很多,因此提前好幾天就開始做了,但時間還是很緊張。第一次做這麼大的程式感覺有點力不從心,就在寫程式之前花了很多時間看關於用python寫遊戲的資料,別人寫的程式碼和遇到的問題。在寫的過程中也參考了別人的程式碼,還有翻書查資料等等 。即使寫好了程式碼,到成功執行也要花好長時間修改,遇到了各式各樣的問題。但看到遊戲能順利執行,我才發現程式語言有多麼神奇,原來各個平臺上的那些遊戲就是由看起來枯燥的程式語言所寫的。我感到自己寫遊戲也許比玩別人製作的遊戲更加有意思,可以由自己來主導遊戲的規則,創造自己的遊戲。

五.結課感悟

因為高中同學有擅長python的,用python做了很多有意思的東西,所以我對python很感興趣就選修了王老師的課程,在一開始上python課時,因為之前都沒有接觸過程式語言,同時學習c語言和python兩門語言讓我感到力不從心,甚至感覺自己太早選修了python,但在這一學期的課以來,我感到自己學到了很多,深深感到了python相對於其他語言的便利性,同時也接觸了碼雲,git,CSDN的python技能樹等等,還寫了python技能樹的測評,也促進了我在c語言方面的學習,也降低了自己拖延症的問題,大大開拓了自己的眼界。王老師上課也很有親和力,平易近人,課堂氛圍也很好,上課沒有太大的壓力。不過感覺由於不同系不同年級的python基礎不太一樣,我個人沒有程式設計基礎聽起來還是比較吃力,時常有趕不上的情況,能稍微降低一點速度就好了。總之,很高興能夠選擇了python選修課,增進了自己對程式語言的理解,鍛鍊了自己的思維水平,特別是提高了自己動手實踐能力和獨立思考能力。希望python課能越上越好!