1. 程式人生 > 其它 >20211222《Python程式設計》實驗四 Python綜合實踐實驗報告

20211222《Python程式設計》實驗四 Python綜合實踐實驗報告

課程:《Python程式設計》

班級:2122

姓名: 周紹坤

學號:20211222

實驗教師:王志強

實驗日期:2022年5月31日

必修/選修: 公選課

1.實驗內容

   Python綜合應用:運用pygame嘗試編寫堆疊遊戲。

2. 實驗過程及結果

  1. 前期準備

     剛聽到大作業實驗要求的時候,我也很懵,詢問了曾經選過python課程的學長,問了問一起選這課的同學,最後決定製作堆疊遊戲。

  1. 實驗過程

在網上搜索了一些教學視訊與教學部落格,堆疊遊戲這款經典pytthon小遊戲的教程很多,對新手很友好,最後選擇跟視訊一起編寫程式碼並執行,其中也有一些小問題。

(1) 下載pygame

 第二步 在pycharm中再次下載

 (2)      編寫程式碼

import pygame
import sys
import random

pygame.init()

width = 400
height = 500
pygame.display.set_caption('Simple Stacking Game')
display = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()

background = (23, 32, 42)

white = (236, 240, 241)

color = [(31, 40, 120), (38, 49, 148), (46, 58, 176), (53, 67, 203), (60, 76, 231), (99, 112, 236), (138, 148, 241), (177, 183, 245), (216, 219, 250), (236, 237, 253),
(231, 249, 254), (207, 243, 252), (159, 231, 249), (111, 220, 247), (63, 208, 244), (15, 196, 241), (13, 172, 212), (11, 149, 183), (10, 125, 154), (8, 102, 125),
(9, 81, 126), (12, 100, 156), (14, 119, 185), (30, 111, 202), (16, 137, 214), (18, 156, 243), (65, 176, 245), (113, 196, 248), (160, 215, 250), (208, 235, 253), (231, 245, 254),
(232, 246, 243), (162, 217, 206), (162, 217, 206),
(115, 198, 182), (69, 179, 157), (22, 160, 133),
(19, 141, 117), (17, 122, 101), (14, 102, 85),
(11, 83, 69),
(21, 67, 96), (26, 82, 118), (31, 97, 141),
(36, 113, 163), (41, 128, 185), (84, 153, 199),
(127, 179, 213), (169, 204, 227), (212, 230, 241),
(234, 242, 248),
(230, 238, 251), (204, 221, 246), (153, 187, 237),
(112, 152, 229), (51, 118, 220), (0, 84, 211),
(0, 74, 186), (0, 64, 160), (0, 54, 135),
(0, 44, 110)
]

colorIndex = 0

brickH = 10
brickW = 100

score = 0
speed = 3


class Brick:
def __init__(self, x, y, color, speed):
self.x = x
self.y = y
self.w = brickW
self.h = brickH
self.color = color
self.speed = speed

def draw(self):
pygame.draw.rect(display, self.color, (self.x, self.y, self.w, self.h))

def move(self):
self.x += self.speed
if self.x > width:
self.speed *= -1
if self.x + self.w < 1:
self.speed *= -1


class Stack:
def __init__(self):
global colorIndex
self.stack = []
self.initSize = 25
for i in range(self.initSize):
newBrick = Brick(width / 2 - brickW / 2, height - (i + 1) * brickH, color[colorIndex], 0)
colorIndex += 1
self.stack.append(newBrick)

def show(self):
for i in range(self.initSize):
self.stack[i].draw()

def move(self):
for i in range(self.initSize):
self.stack[i].move()

def addNewBrick(self):
global colorIndex, speed

if colorIndex >= len(color):
colorIndex = 0

y = self.peek().y
if score > 50:
speed += 0
elif score % 5 == 0:
speed += 1

newBrick = Brick(width, y - brickH, color[colorIndex], speed)
colorIndex += 1
self.initSize += 1
self.stack.append(newBrick)

def peek(self):
return self.stack[self.initSize - 1]

def pushToStack(self):
global brickW, score
b = self.stack[self.initSize - 2]
b2 = self.stack[self.initSize - 1]
if b2.x <= b.x and not (b2.x + b2.w < b.x):
self.stack[self.initSize - 1].w = self.stack[self.initSize - 1].x + self.stack[self.initSize - 1].w - b.x
self.stack[self.initSize - 1].x = b.x
if self.stack[self.initSize - 1].w > b.w:
self.stack[self.initSize - 1].w = b.w
self.stack[self.initSize - 1].speed = 0
score += 1
elif b.x <= b2.x <= b.x + b.w:
self.stack[self.initSize - 1].w = b.x + b.w - b2.x
self.stack[self.initSize - 1].speed = 0
score += 1
else:
gameOver()
for i in range(self.initSize):
self.stack[i].y += brickH

brickW = self.stack[self.initSize - 1].w


def gameOver():
loop = True

font = pygame.font.SysFont("ARIAL", 60)
text = font.render("Game Over!", True, white)

textRect = text.get_rect()
textRect.center = (width / 2, height / 2 - 80)

while loop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
close()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
close()
if event.key == pygame.K_r:
gameLoop()
if event.type == pygame.MOUSEBUTTONDOWN:
gameLoop()
display.blit(text, textRect)

pygame.display.update()
clock.tick()


def showScore():
font = pygame.font.SysFont("ARIAL", 30)
text = font.render("Score: " + str(score), True, white)
display.blit(text, (10, 10))


def close():
pygame.quit()
sys.exit()


def gameLoop():
global brickW, brickH, score, colorIndex, speed
loop = True

brickH = 10
brickW = 100
colorIndex = 0
speed = 3

score = 0

stack = Stack()
stack.addNewBrick()

while loop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
close()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
close()
if event.key == pygame.K_r:
gameLoop()
if event.type == pygame.MOUSEBUTTONDOWN:
stack.pushToStack()
stack.addNewBrick()

display.fill(background)

stack.move()
stack.show()

showScore()

pygame.display.update()
clock.tick(60)


gameLoop()
以上是本次實驗的程式碼

(3) 連線雲伺服器 上傳程式碼

   關於這個操作,我完全把c語言的華為雲實驗方法應用過來了,但c語言與python的執行還是有差別,所以也查閱了很多資料

l  首先,開啟雲伺服器,在putty上登入

 l 上傳程式碼到ECS主機

 l 在putty上執行它!

 下面是遊戲成功執行圖片(視訊提交給課代表)

   這個海龜編輯器是之前下載了,自己用來畫畫愛心的。

3.實驗中遇到的困難


問題1.寫程式碼的時候會遇到很多困難的地方
解決:去CSDN上參考別人的程式碼,對比發現自己的程式碼問題在哪裡以及是否可以寫的更簡單。去b站參考一些視訊。
問題2:無法在華為雲伺服器上執行python程式
解決:這一部分真的花了好長好長的時間,從如何把python2的預設版本到改換成python3 ,如何下pygame應用,因為寫的是小遊戲需要視覺化,
又花了很久的時間去研究如何用xming在putty中將遊戲介面調出。其中遇到了很多很多困難,一度有過想放棄的念頭,但是在課代表和學長學姐的幫助下,以及自己不斷地搜搜搜,問問問,
終於實現了在華為雲伺服器上的成功執行!在此還是十分感謝課代表不離不棄的指導!!!

## 課堂總結

    

在大一下學期選擇了python選修課,其實是一個很大的挑戰,因為在此之前沒有接觸過程式設計,同時還要學習另一種語言c語言,所以壓力比較大。但是我還是有在認真聽課,雖然那些知識點對我來說難度很高。Python課總的來說深入淺出,而且內容非常豐富,講了很多別的老師沒有講的知識,對總體體系的搭建來說很有幫助。王老師講課風格也很輕鬆,要點清楚明瞭。在python課程的學習過程中,還熟悉了有關程式設計能力學習的其他方面,懂得了遇到問題是常態,不斷搜尋學習才是解決問題的關鍵,在日後的計算機能力學習中,一定會更加順利。有的時候不能理解其中的原理對於知識的理解還是有很大的困難的,知道了某一個語句可以實現一個功能,但是語句自身比較長十分複雜也不容易其自身的邏輯,就很難記憶,時間久瞭如果沒有比較系統的知識整理就可能不記得。就比如每一次通過cmd進行安裝的時候都是現用現找永遠不知道應該用哪條指令。但同時,python課大大提高了我的自我學習能力畢竟百度在手天下我有,學習了計算機之後最大的感慨大概就是查閱網路資料真的是問題解決的最佳途徑,通過不斷的查閱資料解決問題,我也掌握了更多的知識。

人生苦短,我用python!