用python写一个既有趣有可爱的弹球小游戏
这几天闲着无聊,就在家写着游戏玩一玩,发现一个这样有趣的小游戏,我通过pygame把它先做了出来,话不多少先上代码。
首先先导入包,导包是必不可少的一件事
# -*- coding:utf-8 -*-
import pygame,sys
from pygame.locals import *
import random
from random import randint
这里我使用了sys包主要是为了使用sys.exit(0)来控制程序退出,然后导入了random包,接着导入random包中的方法randint,这个随机取整数范围的方法也是必不可少的,在游戏中游戏的随机性是非常重要的,几乎占据了游戏的一大部分趣味性,是游戏开发中的重要组成部分。
接着我们载入所有的pygame包的内容
pygame.init()
并且设置一下屏幕的宽度和高度
SCREEN_SIZE = (640,480)
紧接着创建一个屏幕
screen = pygame.display.set_mode(SCREEN_SIZE,0,32)
这里对的“0”代表着是控制游戏是否全屏,如果把 “0” 改成FULLSCREEN那么游戏就全屏了,超级神奇对不对,我们这里做一个测试,所以改成0就ok。
再创建一个窗口的标题名称为game,此游戏主要是用来测试的
caption = pygame.display.set_caption('game')
在创建时钟锁,来控制游戏延迟
clock = pygame.time.Clock()
游戏填充背景为黑色,并刷新屏幕
screen.fill([0,0,0])
pygame.display.flip()
吧所有该赋初值的变量都赋初值
color=[[255,0,0],
[0,255,0],
[0,0,255],
[255,255,255]
]
pos_x=0
pos_y=0
vel_x=2
vel_y=1
colorflag=0
i=0
color变量是控制游戏对象的颜色变化的几种状态
pos_x,pos_y 是对象的坐标,游戏中对象必须都要有坐标才能移动
vel_x,vel_y是对象垂直变换的中间变量
colorflag 是控制颜色随机变化的变量
i 是辅助颜色控制的变量
接着游戏原理就是一个死循环whle(true)来控制的
while(true):
...
在…出写入代码就可以
现在死循环内写入消息轮播时间
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
为了检查是否有退出游戏的消息,有的话就调用sys.exit()方法退出程序
接着填充在填充游戏背景为黑色,防止发生颜色错乱
screen.fill([0,0,0])
之前对象的左边是左上角,因为pos_x和pos_y的值都是0,所以是坐上角,可能初学者都有点疑问为什么0,0就是左上角,而不是中间。
因为在计算机图形学中0,0(即x坐标0,y坐标0)都建立在窗口左上角,在计算机图形学表示屏幕框中却没有负数这个概念,这个概念和数学却不同。
如图:
如上面一张图就可以阐述计算机图形学中的坐标原理,上图可以看出,左上角坐标为x=0和y=0,屏幕中最小的值为0,越往右边移动值就越大,所以屏幕右下角的值是x,y。
在这里我在阐述一下,并不是坐标不能表示负数,表示负数当然是可以,只不过已经超出屏幕可以显示的范围了,屏幕正确的范围是>0且<屏幕的宽。(即你可以看到的内容)
再继续写代码,做完上述代码之后,我们的球就可以动了,但是还有一个最大的核心代码没有写,就是遇到墙反弹回来,这才是游戏的核心。
if pos_x > 550 or pos_x < 0:
vel_x = - vel_x
colorflag=1
if pos_y > 400 or pos_y < 0:
vel_y = - vel_y
colorflag=1
上面的代码控制vel_x和vel_y来实现遇到墙面就反向的算法控制对象移动轨迹。
最后加一点特效,如果碰到墙面,就让对象改变自己的颜色
if colorflag:
i+=1
if i==3:
i=0
colorflag=0
这样添加了游戏的生动性
再接着绘制游戏坐标
pos = pos_x,pos_y,100,100
pygame.draw.rect(screen,color[i],pos)
写完上述代码后,游戏变化的特别快,我么得让游戏慢起来,让人的眼睛能够捕捉游戏的美才好,最后添加两行代码:
clock.tick(200)
pygame.display.update()
到这里我们游戏就结束了。然后运行游戏,enter起来。
最后完整的代码如下:
# -*- coding:utf-8 -*-
import pygame,sys
from pygame.locals import *
import random
from random import randint
pygame.init()
SCREEN_SIZE = (640,480)
screen = pygame.display.set_mode(SCREEN_SIZE,0,32) #HWSURFACE | FULLSCREEN
caption = pygame.display.set_caption('game')
clock = pygame.time.Clock()
screen.fill([0,0,0])
pygame.display.flip()
color=[[255,0,0],
[0,255,0],
[0,0,255],
[255,255,255]
]
pos_x=0
pos_y=0
vel_x=2
vel_y=1
colorflag=0
i=0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill([0,0,0])
pos_x+=vel_x
pos_y+=vel_y
if pos_x > 550 or pos_x < 0:
vel_x = - vel_x
colorflag=1
if pos_y > 400 or pos_y < 0:
vel_y = - vel_y
colorflag=1
if colorflag:
i+=1
if i==3:
i=0
colorflag=0
pos = pos_x,pos_y,100,100
pygame.draw.rect(screen,color[i],pos)
clock.tick(200)
pygame.display.update()