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!

 

 

posted @ 2022-05-31 20:46  周绍坤  阅读(283)  评论(0编辑  收藏  举报