2023年4月

截图 2023-06-17 14-56-56.png

snake game(贪吃蛇)

分解snake game游戏,利用现有的知识构建完整的程序
变量
循环
贪吃蛇游戏的基本逻辑:蛇移动、碰撞处理、蛇身体增长

导入外部库

# 面向函数的编程范式,不涉及class,对象等
import pygame
import random

定义一些变量,保存游戏面板大小与颜色等

# 定义一些颜色变量
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE  = (0, 0, 255)

# 游戏屏幕大小
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600

# 游戏面板行列,以及每个格子大小
BOARD_ROWS = 20
BOARD_COLS = 20
GRID_SIZE = 30

初始化pygame

# 初始化pygame,调用pygame方法之前必须初始化
pygame.init()

# 新建一个显示屏幕变量
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])

# 设置窗口标题栏
pygame.display.set_caption("Snake Game")

定义snake和food变量

# 定义snake和food变量
snake = [(3, 0), (2, 0), (1, 0)]
direction = "RIGHT"
food_position = (random.randint(0, BOARD_COLS - 1), random.randint(0, BOARD_ROWS - 1))

定义函数 移动snake和生成food

# move_snake函数,以及生成food的函数
def move_snake():
    global snake
    head = snake[0]
    if direction == "RIGHT":
        new_head = (head[0] + 1, head[1])
    elif direction == "LEFT":
        new_head = (head[0] - 1, head[1])
    elif direction == "UP":
        new_head = (head[0], head[1] - 1)
    elif direction == "DOWN":
        new_head = (head[0], head[1] + 1)
    snake.insert(0, new_head)
    snake.pop()

def generate_food():
    global food_position
    food_position = (random.randint(0, BOARD_COLS - 1), random.randint(0, BOARD_ROWS - 1))

定义函数-绘制游戏面板,snake以及food

# Define the function for drawing the board
def draw_board():
    for row in range(BOARD_ROWS):
        for col in range(BOARD_COLS):
            x = col * GRID_SIZE
            y = row * GRID_SIZE
            pygame.draw.rect(screen, BLUE, [x, y, GRID_SIZE, GRID_SIZE], 1)

# Define the function for drawing the snake
def draw_snake():
    for cell in snake:
        x = cell[0] * GRID_SIZE
        y = cell[1] * GRID_SIZE
        pygame.draw.rect(screen, GREEN, [x, y, GRID_SIZE, GRID_SIZE])

# Define the function for drawing the food
def draw_food():
    x = food_position[0] * GRID_SIZE
    y = food_position[1] * GRID_SIZE
    pygame.draw.rect(screen, WHITE, [x, y, GRID_SIZE, GRID_SIZE])

定义游戏clock,决定了游戏刷新频率

# Set the clock for the game
clock = pygame.time.Clock()

游戏退出标志,True退出游戏

# Set the game loop flag
done = False

游戏的主循环,处理event,更新游戏状态:food,snake等,重新绘制food,snake,board等

# Start the game loop
while not done:
    # Handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT and direction != "LEFT":
                direction = "RIGHT"
            elif event.key == pygame.K_LEFT and direction != "RIGHT":
                direction = "LEFT"
            elif event.key == pygame.K_UP and direction != "DOWN":
                direction = "UP"
            elif event.key == pygame.K_DOWN and direction != "UP":
                direction = "DOWN"
            elif event.key == pygame.K_ESCAPE:
                done = True
    
    # Move the Snake
    move_snake()
    
    # Check if the Snake collides
    # Check if the Snake collides with the Food
    if snake[0] == food_position:
        generate_food()
        snake.append(snake[-1])

    # Check if the Snake collides with the wall
    if snake[0][0] < 0 or snake[0][0] >= BOARD_COLS or snake[0][31] < 0 or snake[0][32] >= BOARD_ROWS:
        done = True

    # Check if the Snake collides with its own body
    for i in range(1, len(snake)):
        if snake[0] == snake[i]:
            done = True

    # Clear the screen
    screen.fill(BLACK)

    # Draw the board, Snake, and Food
    draw_board()
    draw_snake()
    draw_food()

    # Update the screen
    pygame.display.flip()

    # Set the frame rate of the game
    clock.tick(5)

退出游戏,关闭pygame

pygame.quit()

RaspberryPi配置ftp HomeStash文件同步

raspberry pi配置成一个家用的小型文件同步服务器,配合手机应用HomeStash使用

手机上的图片、视频可以方便备份到服务器上,节约手机空间,也免得花费不少银子使用iCloud:)
HomeStash花了几十块rmb
对于iphone手机应用开发不熟悉,android我准备自己写一个

参考

step 1 更新系统package

sudo apt update
sudo apt full-upgrade

step 2 安装ftp软件

sudo apt install vsftpd

step 3 编辑配置文件

sudo vim /etc/vsftpd.conf

write_enable=YES
local_umask=022
chroot_local_user=YES
anonymous_enable=YES => anonymous_enable=NO

user_sub_token=$USER
local_root=/home/$USER/FTP
allow_writeable_chroot=YES




=>这个可以随便选择其他可以访问的目录,比如我/media/pi/backup/FTP

step 4 创建实际的FTP目录

ftp根目录不能写,所以建立子目录
mkdir -p /home/$USER/FTP /[subdirectory_name]=>根据实际修改

mkdir -p  /media/pi/backup/FTP/homestash

step 5 修改权限

chmod a-w /home/[user]/FTP / =>使用实际user替换

step 6 重启 sftpd daemon

sudo service vsftpd restart

FTP服务器测试

使用filezilla,这个比较简单,下载安装Filezilla

sudo apt install filezilla
在家里局域网,透过ip,username,password访问

HomeStash使用

主要步骤:

  • 配置ftp链接
  • 选择ftp服务器上的目录 ,用来存储移动设备上传的图片、文件等
  • 选择设备上需要同步的目录 启动/暂停同步
看pihone上主要是图片,相册,需要补充一些使用截图

参加 AWS DeepRacer 社区竞赛

注意
要加入 AWS DeepRacer 社区竞赛,您首先需要收到竞赛组织者提供的竞赛链接。

当您收到参加 AWS DeepRacer 竞赛的邀请时,请查看这是现场比赛还是经典竞赛。

经典赛事

经典竞赛是不需要实时交互的异步赛事。您的邀请链接使您可以向竞赛提交模型并查看排行榜。在比赛开幕和闭幕日期内,你可以随时提交无限量模型,以在排行榜上取得最佳成绩。比赛开始后,提交的模型即可在排行榜页面上查看经典比赛的结果和视频。所有经典比赛均为私人赛事。

比赛直播

LIVE 竞赛是实时赛车赛事,你可以与其他赛车手轮流聚在一起,争夺排行榜上最快的时间。您可以输入多个模型,但只会使用您在提交窗口关闭之前提交的最后一个模型。在比赛中,你可以选择尝试交互式速度控制,它会暂时覆盖模型的速度参数,让你有机会进行战略性的实时调整。直播比赛可以在受邀的赛车手之间私下直播,也可以公开直播供任何人观看。

如果您的邀请中未指定比赛形式,请查看您的竞赛卡。LIVE 竞赛说 “LIVE”,然后告诉你同步赛事的日期和时间。经典比赛为你提供了异步比赛的日期范围。
live-and-classic-race-cards.png

作为竞赛参与者加入 AWS DeepRacer 社区竞赛

如果您是新手AWS并收到加入 AWS DeepRacer 社区竞赛的邀请,请按照 “以新用户身份加入” 中的步骤操作。如果您受邀参加活跃的社区竞赛,并且之前参加过 AWS DeepRacer 竞赛,请按照以下步骤加入经典竞赛或参加适合您的比赛形式的直播竞赛。

以新用户身份加入
1. 选择您从比赛组织者那里收到的链接。如果您尚未在 AWS DeepRacer 控制台中登录您的账户,系统将提示您登录。
2. 登录 AWS DeepRacer 控制台后,该链接将带您进入竞赛页面。比赛页面显示比赛详情、排行榜和您的赛车手信息。选择 “进入竞赛”。
enter-community-race-classic.png
3. 在 “进入竞赛” 页面的 “选择模型” 下,选择经过训练的模型,然后选择 “进入竞赛”。
choose-a-model-enter-classic-race.png
4. 如果您的模型成功根据竞赛标准进行了评估,请观看该赛事的排行榜,看看您的模型与其他参赛者相比排名如何。
5. (可选)选择 “观看” 以查看车辆性能视频,或选择 “下载评估日志” 以详细查看产生的输出。deepracer-community-race-success-classic.png
6. 再次选择 “竞赛” 进入其他模型。在比赛开幕和闭幕日期内,你可以随时提交无限量模型,以在排行榜上取得最佳成绩。
参加现场竞赛
1. 选择您从比赛组织者那里收到的链接。如果您尚未在 AWS DeepRacer 控制台中登录您的账户,系统将提示您登录。
2. 登录 AWS DeepRacer 控制台后,该链接将带您进入竞赛页面。竞赛页面显示比赛详情和排行榜。选择 “进入竞赛”。
enter-community-race-live.png
3. 在 “进入竞赛” 页面的 “选择模型” 下,选择经过训练的模型,然后选择 “进入竞赛”
choose-a-model-enter-race.png
4. 如果您的模型成功根据竞赛标准进行了评估,请观看该赛事的排行榜,看看您的模型与其他参赛者相比排名如何。
5. (可选)对于直播比赛,选择日历将直播赛事添加到您的日历中。
6. 再次选择 “竞赛” 进入其他模型。您可以输入多个模型,但只会使用您在提交窗口关闭之前提交的最后一个模型。

加入 AWS DeepRacer 联赛虚拟巡回赛

在这一部分,了解如何使用 AWS DeepRacer Console 将经过训练的模型提交虚拟巡回赛。

  1. 进入 AWS DeepRacer 联赛虚拟巡回赛
  2. 登录 AWS DeepRacer 控制台。
  3. 在主导航窗格中,选择 AWSVilling Circuin。
  4. 在 “AWS虚拟赛道” 页面的 “公开竞赛” 部分下,选择 “进入竞赛”。
  5. 如果这是您第一次参加 AWS Leag ue DeepRacer 赛车活动,请在 AWS League DeepRacer
    赛车手名称下的 Racer 名称中设置您的别名。
  6. 在选择模型下,从模型列表中选择要使用的模型。确保您的模型已经过处理轨道形状的训练。
  7. 如果这是您首次参加 AWS DeepRacer League
    赛事,请根据联赛要求选择您的居住国。选择居住国并提交第一个模型后,该模型将在赛车赛季中锁定,并将在颁发奖品时进行验证。然后,通过选中复选框接受条款和条件。
  8. 选择 “参加竞赛” 以完成提交。每场比赛的提交配额为50。
  9. 提交模型后,AWS DeepRacer 控制台开始评估。这一过程耗时最多 10 分钟。
  10. 在比赛页面上,查看比赛详情。
    在比赛页面上,记下您的参赛者姓名下的提交状态。
    在竞赛页面上,查看排行榜上的排名列表,以了解您的模型与其他模型的比较情况。
    如果你的模型在连续三次试用中都没有完成赛道,那么它就不会出现在排行榜的排名列表中。你的排行榜排名反映了你提交的最佳成绩。您还将获得国家和地区赛季积分榜,以衡量您在所在国家和地区的其他赛车手中的排名。
    提交模型后,尝试通过完善奖励函数和迭代模型来提高其性能。您也可以使用不同的算法或动作空间训练新模型。学习、调整并再次比赛,以增加获得奖励的机会。