20212212颜瑞淋 实验四 Python综合实践

20212212颜瑞淋 实验四《Python程序设计》实验报告

 #学号 20212212《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2122
姓名: 颜瑞淋
学号:20212212
实验教师:王志强
实验日期:2022年5月23日
必修/选修: 公选课

实验四

(一)实验内容

Python综合应用:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现一个俄罗斯方块小游戏。

(二)实验灵感来源

小时候玩的俄罗斯方块算得上是一个经典小游戏,希望可以通过自己的学习研究完成一个简易版的俄罗斯方块先游戏。

(三)实验过程

1.通过b站,知乎,CSDN博客等网站学习利用pygame制作python小游戏的方法

Python pygame是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性,下载安装它来完成我的游戏制作。

 图为已经下载好了pygame

2.按步骤开始编辑代码

 

 import模块pygame以及random包(随机库),以此来实现部分函数的使用

确定游戏的初始位置,得分,背景等;

设置初始press为False,即没有按压键盘;

输入存放俄罗斯方块形状的对应坐标:

"Z": [(-1, -1), (0, -1), (0, 0), (1, 0)],
"O": [(-1, -1), (0, -1), (-1, 0), (0, 0)],
"S": [(-1, 0), (0, 0), (0, -1), (1, -1)],
"T": [(-1, 0), (0, 0), (0, -1), (1, 0)],
"I": [(0, 1), (0, 0), (0, -1), (0, -2)],
"L": [(-1, 0), (0, 0), (-1, -1), (-1, -2)],
"J": [(-1, 0), (0, 0), (0, -1), (0, -2)];

[[0 for column in range(0, 10)] for row in range(0, 22)]设置游戏背景为0-9列,0-21行;

设置初始背景所有格子为0;

第一行格子为1,

即在背景的第一行处随机产生一个形状的俄罗斯方块;

 

定义一个函数move, 并用if语句来设置函数

draw.rect(画矩形)用RGB三原色来设置俄罗斯方块的颜色,设置为橙色,并设置方块的大小;

 当方块在0-19行,0-9列时,如果方块碰壁了,用RGB三原色来设置俄罗斯方块的颜色,设置为蓝色,并设置方块的大小;

重新设置初始位置,即改变俄罗斯方块的位置;

 

判断俄罗斯方块移动后是否会越界,如果越界,退出(break);

否则,清除原有初始位置的俄罗斯方块,新增俄罗斯方块的位置为[y_drop, x_move];

rotating_position = [(-column, row) for row, column in select_block]翻转方块(顺时针翻转90度);

判断翻转后的俄罗斯方块是否会越界,如果越界,退出(break);

否则,清除原有初始位置的俄罗斯方块,新增俄罗斯方块的位置为翻转后的位置;

如果某一行的背景格子均变成了1(即整行均有格子),则整行清除

设置窗口的大小,即游戏页面的大小

while True:即设置的press,有按压键盘,为True;
if event.type == pygame.QUIT:
if event.key == pygame.K_ESCAPE:
如果事件类型为QUIT或者按了Esc键,即退出;
elif event.key == pygame.K_LEFT:
                move(-1)
            elif event.key == pygame.K_RIGHT:
                move(1)
            elif event.key == pygame.K_UP:
                move(0)
如果按了左键,即执行函数 move(-1)的情况,判断是否越界并改变方块位置,
右键,即执行函数 move(1)的情况,判断是否越界并改变方块位置,
上键,即执行函数 move(0)的情况,即翻转;

 

 如果发生press的情况,times每次加10,当times超过50时,执行move(10)的情况,并将times重新变回0;

否则,times每次加1;

 如果gameover,则游戏退出,执行move(10)的情况;

pygame.time.Clock().tick(300)  # tick(300)修改数字可以修改游戏的整体速率;
pygame.display.update();#显示,如果没有则为黑屏;

3.完成全部代码

 完整代码

import pygame
import random

block_initial_position, score, times, gameover, press, all_block, background = (
    [20, 5],#初始位置
    [0],#得分
    0,
    [],
    False,
    [
        [[-1, -1], [0, -1], [0, 0], [1, 0]],
        [[-1, -1], [0, -1], [-1, 0], [0, 0]],
        [[-1, 0], [0, 0], [0, -1], [1, -1]],
        [[-1, 0], [0, 0], [0, -1], [1, 0]],
        [[0, 1], [0, 0], [0, -1], [0, -2]],
        [[-1, 0], [0, 0], [-1, -1], [-1, -2]],
        [[-1, 0], [0, 0], [0, -1], [0, -2]]
    ],
    [[0 for column in range(0, 10)] for row in range(0, 22)],#背景0-9列,0-21行
)
background[0], select_block = [1 for column in range(0, 10)], list(
    random.choice(all_block)
)


def move(n):
    if n == 100:
        for row, column in select_block:
            pygame.draw.rect(
                screen,
                (255, 165, 0),#颜色
                (
                    (column + block_initial_position[1]) * 40,
                    800 - (row + block_initial_position[0]) * 40,
                    38,
                    38,
                ),
            )
        for row in range(0, 20):
            for column in range(0, 10):
                if background[row][column]:
                    pygame.draw.rect(#蓝色
                        screen, (0, 0, 255), (column * 40,
                                              800 - row * 40, 38, 38)
                    )
    y_drop, x_move = block_initial_position
    if n == 1 or n == -1:
        x_move += n
        for row, column in select_block:
            if (
                (column + x_move) < 0
                or (column + x_move) > 9
                or background[row + y_drop][column + x_move]
            ):
                break
        else:
            block_initial_position.clear(), block_initial_position.extend(
                [y_drop, x_move]
            )
    if n == 0:
        rotating_position = [(-column, row) for row, column in select_block]
        for row, column in rotating_position:
            if (
                (column + x_move) < 0
                or (column + x_move) > 9
                or background[row + y_drop][column + x_move]
            ):
                break
        else:
            select_block.clear(), select_block.extend(rotating_position)
    if n == 10:
        y_drop -= 1
        for row, column in select_block:
            if background[row + y_drop][column + x_move] == 1:
                break
        else:
            block_initial_position.clear()
            block_initial_position.extend([y_drop, x_move])
            return
        for row, column in select_block:
            background[block_initial_position[0] + row][
                block_initial_position[1] + column
            ] = 1
        complete_row = []
        for row in range(1, 21):
            if 0 not in background[row]:
                complete_row.append(row)
        complete_row.sort(reverse=True)
        for row in complete_row:
            background.pop(row)
            background.append([0 for column in range(0, 10)])
        score[0] += len(complete_row)
        pygame.display.set_caption(
            "Tetris,Score:" + str(score[0]) + " Tonymot")
        select_block.clear(), select_block.extend(list(random.choice(all_block)))
        block_initial_position.clear(), block_initial_position.extend([20, 4])
        for row, column in select_block:
            if background[row + block_initial_position[0]][
                column + block_initial_position[1]
            ]:
                gameover.append(1)


pygame.init()
screen = pygame.display.set_mode(
    (400, 800)#窗口大小
)  # set_mode((400,800)) 修改数值可以修改窗口大小
while True:
    screen.fill((255, 255, 255))
    for event in pygame.event.get([pygame.QUIT, pygame.KEYDOWN, pygame.KEYUP]):
        if event.type == pygame.QUIT:
            quit()#退出,即X号
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                quit()#Esc符号
            elif event.key == pygame.K_LEFT:
                move(-1)
            elif event.key == pygame.K_RIGHT:
                move(1)
            elif event.key == pygame.K_UP:
                move(0)
            elif event.key == pygame.K_DOWN:
                press = True
        elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
            press = False
    if press:
        times += 10
    if times >= 50:
        move(10)
        times = 0
    else:
        times += 1
    if gameover:
        quit()
    move(100)
    pygame.time.Clock().tick(300)  # tick(300)修改数字可以修改游戏的整体速率
    pygame.display.update()#显示,如果没有则为黑屏

4.运行代码

 

 运行成果

5.购买云服务器得到自己的公网

 

 

5.上传源代码到ECS主机

利用winscp将代码文件上传到华为云服务器上(文件为A.py)

6.在putty上登录云服务器并运行代码

 

下载pip3,以便于pygame的下载

 

 下载pygame(出现错误,但再试一次就可以了)

 

 运行文件,但还是不行……(有点,但是还是要继续啊,认真搞清楚问题是啥,怎么解决!!)

 

根据错误,找到了解决方法

 下载xming,用于图形的显示

 

下载xterm

 

进入自己游戏代码的目录并打开xterm

进入xterm界面

 

7.成功显示游戏(视频发给课代表~)

 

 

(四)实验反思

实验过程中遇到的问题和解决过程

- 问题1:在运行代码时,生成的游戏仅可见一部分,上下都被挡掉了

- 问题1解决方案:可以在代码中的这部分改变窗口大小

pygame.init()
screen = pygame.display.set_mode(
    (400, 800)#窗口大小

但由于不同电脑上可见的窗口大小不同,就不做更改

 

- 问题2:在使用python3命令执行文件时,不能运行
- 问题2解决方案:未下载pip3,进行pip3的安装,并install pygame

 

- 问题3:运行文件后不能出现游戏页面
- 问题3解决方案:下载xming以及xterm,远程登录图形界面

 

(五)全课总结

这学期的python课对于我来说算是一个比较大的挑战,怎么说呢,做了四次实验,每次都折腾了很久,偶尔觉得(见以下表情包……)

甚至有时候好不容易搞定一个困难,又来一个……

但是!俗话说得好,世上无难事只怕有心人!

经过每次实验的蹉跎,啊不,历练,我越来越淡定了(*σ´∀`)σ

虽然这些实验过程艰难,但是在我问老师,问同学,问百度,问知乎,问CSDN,问Linux公社,问b站……的努力下,我成功完成这些实验,并且享受这种开始啥啥都不会,到最后虽然不太会,还是可以完成实验的开心中……

可以说这学期我学会了很多,从一个小小白,变成了一个小白,不能不说算是一个巨大成就(*σ´∀`)σ

我学学习了数列的应用,字符串,函数文件及目录操作,数据库,正则表达式,socket,爬虫等,虽然学艺不精,但是我还会继续学习的(*σ´∀`)σ

人生苦短,我用python。很开心自己选了python这门课,王志强老师亲切幽默,上课简单易懂,内容充实,还非常体谅我们这些大一小白白 。我在老师的指导下学到了很多,也在实验的历练下成长了很多,所以说,再来一次,我还选王志强老师的课(*σ´∀`)σ

 至于建议,就是希望老师讲得慢一点,有时候我前一步还没跟上,老师下一步就讲完了(灬ꈍ ꈍ灬),上课偶尔就兵荒马乱地(灬ꈍ ꈍ灬)
 

参考资料:https://www.jianshu.com/p/23ba123ee874

https://www.daehub.com/archives/9949.html#:~:text=%E5%85%B6%E4%B8%AD%20PuTTY%20%E6%98%AF%20SSH%20%E5%AE%A2%E6%88%B7%E7%AB%AF%EF%BC%8C%E8%80%8C,Xming%20%E5%88%99%E6%98%AF%20Windows%20%E5%B9%B3%E5%8F%B0%E7%9A%84%20X%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%82

https://www.freesion.com/article/73691086600/

https://www.linuxidc.com/Linux/2017-01/139241.htm

https://pan.baidu.com/s/1wMDA-8zqd8eiu6iGWGPqFQ?_at_=1653577595955

posted @ 2022-05-27 10:20  颜团团  阅读(100)  评论(0编辑  收藏  举报