天天看點

Py之pygame:有趣好玩——利用pygame庫實作一個移動底座彈球的小遊戲

輸出結果

Py之pygame:有趣好玩——利用pygame庫實作一個移動底座彈球的小遊戲

實作代碼

# -*- coding: utf-8 -*-

#Py之pygame:有趣好玩——利用pygame庫實作一個移動底座彈球的小遊戲

import pygame as pg

from pygame.locals import *    #将pygame所有常量導入,如後面的QUIT

from time import sleep

import sys

#設定基本螢幕參數

pg.init()                          #初始化,如果沒有的話字型會報錯等等

scr=pg.display.set_mode((600,550))   #設定螢幕大小

pg.display.set_caption(("移動底座彈球的小遊戲"))   #設定螢幕标題

pp=255, 255, 0          #red是一個元組,表示乒乓球橙色

green=0,255,0

white=255,255,255

dizuo=120, 63, 4       #底座顔色灰土色

pink=255, 0, 255

cs=225,121,21           #乒乓球顔色,橙色

#設計一下乒乓球的運動方式,乒乓球在螢幕内運動

x=120  #乒乓球的坐标設定為(x,y)

y=120

vx=3   #設定初速度vx,vy,當乒乓球到達螢幕邊緣的時候速度取反,也就是乒乓球到達左右兩邊緣的時候vx取反,上下邊緣的時候vy取反。

vy=3

a=200  #a代表乒乓闆的x坐标值,因為乒乓闆y坐标值是固定的

My_font=pg.font.Font(None,40)  #40是字的大小,設定字型,None表示沒有,代指pygame預設的字型,但是這樣的字型缺點是不能列印出中文。

zt1=pg.font.SysFont('華文楷體',24)  #楷體,a=pg.font.get_fonts()  #獲得系統自帶的字型

zt2=pg.font.SysFont('華文楷體',20)

zt21=pg.font.SysFont('幼圓',29)

def printtext(font,text,x,y,color): #設計一個函數,在遊戲螢幕上列印文本,代碼表示先把文本轉換成一個位圖然後列印在螢幕上,列印文本需要列印的具體坐标和文本顔色,字型等參數。

   img=font.render(text,True,color)   #轉換為位圖

   scr.blit(img,(x,y))

#設定得分,基礎記分量,為什麼設定基礎記分量?我想的是經過一段時間後乒乓球會加速,進而逐漸增加遊戲難度,當然,基礎記分量也要翻倍。

c=0   #c是加速器,如果接了10次,那麼加速

fs=0   #fs是分數,接到一次乒乓球就加分

k=1  #基礎加分量

#遊戲的主要代碼了,pygame采用幀和輪詢的方式,幀是指會不斷重新整理,也就是while True循環,輪詢是不斷的詢問使用者的輸入。

#在下面代碼中,會不斷擷取滑鼠具體坐标和QUIT事件是否發生。Scr.fill會用RGB值為(199,21,133)的顔色重新整理螢幕,

#以後畫圓寫字都在這基礎上,下一次循環後又重新整理。是以在螢幕中乒乓球和乒乓闆就會動态呈現出來。

while True:

   scr.fill((199,21,133))  #遊戲背景色

   background = pg.image.load('F:/File_Python/Resources/00102.jpg').convert()

   scr.blit(background, (0, 0))

   for eve in pg.event.get():

       if eve.type == QUIT:    #點選左上角的×

           sys.exit()         #如果無效,可以試試exit()函數

   mx,my=pg.mouse.get_pos()     #獲得滑鼠的x,y坐标

   a=mx   #滑鼠x坐标就是乒乓闆的坐标,是以移動滑鼠乒乓闆也移動

   #畫乒乓球和畫乒乓闆了,我們可以簡化為圓形和矩形

   pg.draw.circle(scr,pp,(x,y),40,0)

   pg.draw.rect(scr,dizuo,(a,530,100,20),0)

   #考慮乒乓球的運動,如果乒乓球碰到左右螢幕邊緣,vx取反,碰到上邊緣或者碰到乒乓闆的時候,vy取反,其餘情況表示乒乓闆沒有接觸到乒乓球,跳出循環,遊戲結束。

   x=x+vx

   y=y+vy

   if x>550 or x<40:

       vx=-vx

   if y<40:

       vy=-vy

   if y>510 and abs(a-x+50)<50:

       if vy>0:

           vy=-vy

       else:pass

       c=c+1     #每接到3次後乒乓球加速

       fs=fs+k    #加分

       if c>=3:

           c=0

           k=k+k  #乒乓球加速後記分量雙倍

           if vx>0:  #加速

               vx=vx+1

           else:

               vx=vx-1

   elif y>510 and abs(a-x+50)>50:

       break

   #在while循環最後,我寫一下得分,規則,還有重新整理,重新整理很重要!

   sleep(0.005)  #休眠一定時間,不然乒乓球速度依然很快

   printtext(zt21,"移動滑鼠控制底座左右移動",120,20,pink)

   printtext(zt2,"得分",550,12,green)

   printtext(zt2,str(fs),560,32,green)

   pg.display.update()

#在循環結束後就是前面乒乓闆沒有接觸到乒乓球後發生的情況,最後是遊戲結束的代碼,畢竟這遊戲靠看得分看成敗

scr.fill((28, 69, 135))   #遊戲結束後全屏改變顔色

zt3=pg.font.SysFont('華文楷體',60)

zt4=pg.font.SysFont('華文楷體',40)

printtext(zt3,"你好,遊戲結束",60,120,white)

printtext(zt4,'總得分: '+str(fs),120,400,white)

pg.display.update()