20231219 范云炅 2023-2024-2 《Python程序设计》实验四实验报告

20231219范云炅 2024-05-29 21:43:46

课程:《Python程序设计》
班级: 2312
姓名: 范云炅
学号:20231219
实验教师:王志强
实验日期:2023年5月26日
必修/选修: 公选课

1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全、计算器、信息收集与处理等。
我的实验内容:贪吃蛇

  1. 实验过程及结果

  2. 调用函数库

    import sys
    import random
    import pygame
    
  3. 游戏代码:
    定义了一个蛇

    class Snake(object):
      def __init__(self):
          self.direction = pygame.K_RIGHT
          self.body = []
          for x in range(5):
              self.addnode()
    

    通过代码实现蛇的运动以及死亡判断(如果撞到自己或者撞墙)

      def addnode(self):
              left, top = (0,0)
              if self.body:
                  left, top = (self.body[0].left,self.body[0].top)
              node = pygame.Rect(left,top,25,25)
              if self.direction == pygame.K_LEFT:
                  node.left -= 25
              elif self.direction == pygame.K_RIGHT:
                  node.left += 25
              elif self.direction == pygame.K_UP:
                  node.top -= 25
              elif self.direction == pygame.K_DOWN:
                  node.top += 25
              self.body.insert(0,node)
          #删除
      def delnode(self):
              self.body.pop()
          #死亡判断
      def isdead(self):
              #撞墙
              if self.body[0].x not in range(SCREEN_X):
                  return True
              if self.body[0].y not in range(SCREEN_Y):
                  return True
              #撞自己
              if self.body[0] in self.body[1:]:
                  return True
              return False
          #移动
      def move(self):
              self.addnode()
              self.delnode()
          #改变方向
      def changedirection(self,curkey):
              LR = [pygame.K_LEFT,pygame.K_RIGHT]
              UD = [pygame.K_UP,pygame.K_DOWN]
              if curkey in LR + UD:
                  if(curkey in LR) and (self.direction in LR):
                      return
                  if(curkey in UD) and (self.direction in UD):
                      return
                  self.direction = curkey
    

    定义了一个随机出现的食物

    class Food:
      def __init__(self):
          self.rect = pygame.Rect(-25,0,25,25)
    
      def remove(self):
          self.rect.x = -25
    
      def set(self):
          if self.rect.x == -25:
              allpos = []
              for pos in range(25,SCREEN_X -25,25):
                  allpos.append(pos)
              self.rect.left= random.choice(allpos)
              self.rect.top = random.choice(allpos)
              print(self.rect)
    

    设置字体大小,颜色

    def show_text(screen,pos,text,color,font_bold = False,font_size = 60,font_italic = False):
    
      cur_font = pygame.font.SysFont("宋体",font_size)
    
      cur_font.set_bold(font_bold)
    
      cur_font.set_italic(font_italic)
    
      text_fmt = cur_font.render(text,1,color)
    
      screen.blit(text_fmt, pos)
    

    进行分数显示以及死亡展示和处理食物
    ```

      if not isdead:
          snake.move()
      for rect in snake.body:
              pygame.draw.rect(screen,(20,220,39),rect,0)
    
    #显示死亡文字
    isdead = snake.isdead()

    if isdead:
        show_text(screen,(100,200),'you dead!!',(227,29,18),False,100)
        show_text(screen,(150,200),'press space to try again',(0,0,27),False,30)


    #处理食物
    if food.rect == snake.body[0]:
        scores += 50
        food.remove()
        snake.addnode()

    food.set()
    pygame.draw.rect(screen,(136,0,24),food.rect,0)

    #显示分数文字
    show_text(screen,(50,500),'Scores:' + str(scores),(223,223,223))

    pygame.display.update()   #更新

    clock.tick(10)
3.完整代码

import sys
import random
import pygame

#全局定义
SCREEN_X = 800
SCREEN_Y = 800
#蛇
class Snake(object):
def init(self):
self.direction = pygame.K_RIGHT
self.body = []
for x in range(5):
self.addnode()
def addnode(self):
left, top = (0,0)
if self.body:
left, top = (self.body[0].left,self.body[0].top)
node = pygame.Rect(left,top,25,25)
if self.direction == pygame.K_LEFT:
node.left -= 25
elif self.direction == pygame.K_RIGHT:
node.left += 25
elif self.direction == pygame.K_UP:
node.top -= 25
elif self.direction == pygame.K_DOWN:
node.top += 25
self.body.insert(0,node)

    #删除
def delnode(self):
        self.body.pop()
    #死亡判断
def isdead(self):
        #撞墙
        if self.body[0].x not in range(SCREEN_X):
            return True
        if self.body[0].y not in range(SCREEN_Y):
            return True
        #撞自己
        if self.body[0] in self.body[1:]:
            return True
        return False

    #移动
def move(self):
        self.addnode()
        self.delnode()

    #改变方向
def changedirection(self,curkey):
        LR = [pygame.K_LEFT,pygame.K_RIGHT]
        UD = [pygame.K_UP,pygame.K_DOWN]
        if curkey in LR + UD:
            if(curkey in LR) and (self.direction in LR):
                return
            if(curkey in UD) and (self.direction in UD):
                return
            self.direction = curkey

class Food:
def init(self):
self.rect = pygame.Rect(-25,0,25,25)

def remove(self):
    self.rect.x = -25

def set(self):
    if self.rect.x == -25:
        allpos = []
        for pos in range(25,SCREEN_X -25,25):
            allpos.append(pos)
        self.rect.left= random.choice(allpos)
        self.rect.top = random.choice(allpos)
        print(self.rect)

def show_text(screen,pos,text,color,font_bold = False,font_size = 60,font_italic = False):

cur_font = pygame.font.SysFont("宋体",font_size)

cur_font.set_bold(font_bold)

cur_font.set_italic(font_italic)

text_fmt = cur_font.render(text,1,color)

screen.blit(text_fmt, pos)

def main():
pygame.init()
screen_size = (SCREEN_X, SCREEN_Y)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('贪吃猪猪')
clock = pygame.time.Clock()
scores = 0
isdead = False

snake = Snake()
food = Food()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            snake.changedirection(event.key)
            if event.key == pygame.K_SPACE and isdead:
                return main()


    screen.fill((255,255,255))

    if not isdead:
        snake.move()
    for rect in snake.body:
            pygame.draw.rect(screen,(20,220,39),rect,0)


    #显示死亡文字
    isdead = snake.isdead()

    if isdead:
        show_text(screen,(100,200),'you dead!!',(227,29,18),False,100)
        show_text(screen,(150,200),'press space to try again',(0,0,27),False,30)


    #处理食物
    if food.rect == snake.body[0]:
        scores += 50
        food.remove()
        snake.addnode()

    food.set()
    pygame.draw.rect(screen,(136,0,24),food.rect,0)

    #显示分数文字
    show_text(screen,(50,500),'Scores:' + str(scores),(223,223,223))

    pygame.display.update()   #更新

    clock.tick(10)

main()

```
介绍视频


过程中遇到的问题和解决过程
1.问题:在一开始时不知道如何去制作游戏界面?

解答:通过观看视频,查找教程,了解到可以通过调用PYGAME来做游戏界面

2.问题:开始不了解怎么控制蛇的移动?

解答:可以用键盘输入数据继而接受信号,达到效果。

3.问题:不知道如何设置游戏字体与颜色?

解答:通过观看视频调用函数进而实现

4.问题:不知道如何进行难度升级?

解答:通过进行分数的判断从而改变蛇的移动速度

5.课程总结及感想
1.从一开始的基础语句,紧接着就学习了流程控制语句,包括if、elif、else和for语句,while等等。然后就是序列,有列表、元组、集合、字典,还讲解它们之间的区别,每种之间修改的在答题与细节上的差别,同时有无改变元数据之间的关系。后来就学了字符串以及正则表达式,还学了函数。然后就学习了面向对象,了解到PYTHON是一个使用面向对象思想的环境。了解类和属性,虽然现在还有点不太懂。后面还学了模块、异常处理及程序调试。学习了SOCKET(IP+端口),实现了对话。最后学习了爬虫与反爬虫技术。

2.在学习了python这门课后,相较于之前的c语言来说感到真的简单且好用,PYTHON用于做一些游戏与程序的思想与C语言的差别不同,同时也感觉到使用PYTHON带来的方便与简捷。PYthon 的很多库使用起来可以节约很多的时间,但是同时也不能过于依赖库函数,要形成编程的逻辑思想与代码实现,代码要落地实践,要真的学懂,而不是做一个人工爬虫。

3.人生苦短,我用python!!

...全文
32 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧