python小游戏——兔鼠大战

python小游戏——兔鼠大战

一.准备环境:更改设置pip 国内镜像

在使用pycharm来制作小游戏写代码的时候需要编译环境,使用pip镜像源,由于pip管理工具安装库文件时,默认使用国外的源文件,因此在国内的下载速度会比较慢,可能只有50KB/s。幸好,国内的一些顶级科研机构已经给我们准备好了各种镜像,下载速度可达2MB/s。所以需要更改设置成pip国内镜像。

国内源:

新版ubuntu要求使用https源,要注意。

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:http://pypi.hustunique.com/

山东理工大学:http://pypi.sdutlinux.org/

豆瓣:http://pypi.douban.com/simple/

1. 临时使用

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple

例如:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider,这样就会从清华这边的镜像去安装pyspider库。

2.默认使用

  windows系统使用cmd(命令指示符)快速设置
  1. pip install pip -U # 升级pip到最新版本
  2. pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

注:在命令指示符里依次敲以上代码,以上例子都是用的清华大学的镜像

二.进行代码的编写

# -*-conding: utf-8  -*-
#如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码。
#如果是python3及其以上的版本就可以不写第一行注释。
# 1 - Import library
import pygame        #import语句:在模块模块定义好后,我们可以使用 import 语句来引入模块
from pygame.locals import *# from 语句从模块中导入一个指定的部分到当前命名空间中
import math
import random


# 2 - Initialize the game          #initialize (隐藏摘要) 预置(初始状态bai), 初始化这个游戏
keys = [False, False, False, False]
playerpos = [100, 100]
acc = [0, 0]
arrows = []
badtimer = 100
badtimer1 = 0
badguys = [[640, 100]]
healthvalue = 194
pygame.init()
width, height = 640, 480    #设置页面宽高
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("兔鼠大战")


pygame.mixer.init()


# 3 - Load images      下载图片
player = pygame.image.load("resources/images/dude.png")
grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")
arrow = pygame.image.load("resources/images/bullet.png")
badguyimg1 = pygame.image.load("resources/images/badguy.png")
gameover = pygame.image.load("resources/images/gameover.png")
youwin = pygame.image.load("resources/images/youwin.png")
healthbar = pygame.image.load("resources/images/healthbar.png")
health = pygame.image.load("resources/images/health.png")
badguyimg = badguyimg1
# 3.1 - Load audio   下载音乐
hit = pygame.mixer.Sound("resources/audio/explode.wav")
enemy = pygame.mixer.Sound("resources/audio/enemy.wav")
shoot = pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1, 0.0)
pygame.mixer.music.set_volume(0.25)
# 4 - keep looping through   保持一个圈通过
running = 1
exitcode = 0
while running:
    badtimer -= 1
    # 5 - clear the screen before drawing it again  再次绘制之前清除屏幕
    screen.fill(0)
    # 6 - draw the screen elements    绘制屏幕元素


    for x in range(width // grass.get_width() + 1):
        for y in range(height // grass.get_height() + 1):
            screen.blit(grass, (x * 100, y * 100))
    screen.blit(castle, (0, 30))
    screen.blit(castle, (0, 135))
    screen.blit(castle, (0, 240))
    screen.blit(castle, (0, 345))
    # screen.blit(player, (100,100))
    # screen.blit(player, playerpos)
    position = pygame.mouse.get_pos()
    angle = math.atan2(position[1] - (playerpos[1] + 32), position[0] - (playerpos[0] + 26))
    playerrot = pygame.transform.rotate(player, 360 - angle * 57.29)
    playerpos1 = (playerpos[0] - playerrot.get_rect().width / 2, playerpos[1] - playerrot.get_rect().height / 2)
    screen.blit(playerrot, playerpos1)
    # 6.2 - Draw arrows
    for bullet in arrows:
        index = 0
        velx = math.cos(bullet[0]) * 10
        vely = math.sin(bullet[0]) * 10
        bullet[1] += velx
        bullet[2] += vely
        if bullet[1] < -64 or bullet[1] > 640 or bullet[2] < -64 or bullet[2] > 480:
            arrows.pop(index)
        index += 1
        for projectile in arrows:
            arrow1 = pygame.transform.rotate(arrow, 360 - projectile[0] * 57.29)
            screen.blit(arrow1, (projectile[1], projectile[2]))
    # 6.3 - Draw badgers绘制老鼠
    if badtimer == 0:
        badguys.append([640, random.randint(50, 430)])
        badtimer = 100 - (badtimer1 * 2)
        if badtimer1 >= 35:
            badtimer1 = 35
        else:
            badtimer1 += 5
    index = 0
    for badguy in badguys:
        # 6.3.1 - Attack castle  攻击伤害


        badrect = pygame.Rect(badguyimg.get_rect())
        badrect.top = badguy[1]
        badrect.left = badguy[0]
        if badrect.left < 64:
            hit.play()
            healthvalue -= random.randint(5, 20)
            badguys.pop(index)
        # 6.3.2 - Check for collisions   检查是否有碰撞


        index1 = 0
        for bullet in arrows:
            bullrect = pygame.Rect(arrow.get_rect())
            bullrect.left = bullet[1]
            bullrect.top = bullet[2]
            if badrect.colliderect(bullrect):
                enemy.play()
                acc[0] += 1
                badguys.pop(index)
                arrows.pop(index1)
            index1 += 1
        # 6.3.3 - Next bad guy 下一个老鼠
        if badguy[0] < -64:
            badguys.pop(index)
        badguy[0] -= 7
        index += 1
    for badguy in badguys:
        screen.blit(badguyimg, badguy)
    # 6.4 - Draw clock  绘制计时器


    font = pygame.font.Font(None, 24)
    survivedtext = font.render(
        str((90000 - pygame.time.get_ticks()) / 60000) + ":" + str((90000 - pygame.time.get_ticks()) / 1000 % 60).zfill(
            2), True, (0, 0, 0))
    textRect = survivedtext.get_rect()
    textRect.topright = [635, 5]
    screen.blit(survivedtext, textRect)


    # 6.5 - Draw health bar  绘制生命条
    screen.blit(healthbar, (5, 5))
    for health1 in range(healthvalue):
        screen.blit(health, (health1 + 8, 8))
    # 7 - update the screen   更新屏幕
    pygame.display.flip()
    # 8 - loop through the events  循环处理事件
    for event in pygame.event.get():
        # check if the event is the X button  检查游戏是否失败`在这里插入代码片`
        if event.type == pygame.QUIT:
            # if it is quit the game   如果是,请退出游戏
            pygame.quit()
            exit(0)
        if event.type == pygame.KEYDOWN:   #设置移动的按键,个人认为设置成上下左右键方便操作,鼠标左键单击发动攻击。
            if event.key == K_UP:          # k_w
                keys[0] = True
            elif event.key == K_LEFT:      # k_a
                keys[1] = True
            elif event.key == K_DOWN:      # k_s
                keys[2] = True
            elif event.key == K_RIGHT:     # k_d
                keys[ 3 ] = True         #以上设置按键也可以设置成w,a,s,d  #后是对应的代码,如用这个下面也需要更换成相同的
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:   #这里跟上面的设置键需要设置成相同的
                keys[0] = False
            elif event.key == pygame.K_LEFT:
                keys[1] = False
            elif event.key == pygame.K_DOWN:
                keys[2] = False
            elif event.key == pygame.K_RIGHT:
                keys[3] = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            shoot.play()
            position = pygame.mouse.get_pos()
            acc[1] += 1
            arrows.append(
                [math.atan2(position[1] - (playerpos1[1] + 32), position[0] - (playerpos1[0] + 26)), playerpos1[0] + 32,
                 playerpos1[1] + 32])
    # 9 - Move player  移动时播放的音频
    if keys[0]:
        playerpos[1] -= 5
    elif keys[2]:
        playerpos[1] += 5
    if keys[1]:
        playerpos[0] -= 5
    elif keys[3]:
        playerpos[0] += 5
    # 10 - Win/Lose check  检查是否赢得/输掉游戏
    if pygame.time.get_ticks() >= 90000:
        running = 0
        exitcode = 1
    if healthvalue <= 0:
        running = 0
        exitcode = 0
    if acc[1] != 0:
        accuracy = acc[0] * 1.0 / acc[1] * 100
    else:
        accuracy = 0
# 11 - Win/lose display  赢得/输掉游戏  不再继续游戏
if exitcode == 0:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: " + str(accuracy) + "%", True, (255, 0, 0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery + 24
    screen.blit(gameover, (0, 0))
    screen.blit(text, textRect)
else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: " + str(accuracy) + "%", True, (0, 255, 0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery + 24
    screen.blit(youwin, (0, 0))
    screen.blit(text, textRect)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()


成果显示如下

在这里插入图片描述

以上代码有参考其他博主的,相关素材及其音效也是通过公众号:Python代码大全获得。

具体资源的及其参考网址如下:
https://blog.csdn.net/weixin_42756970/article/details/106475154

新手小白制作,如有问题请各位大佬多多指教!阿里嘎多!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值