之前做了一个基于python的tkinter的小球完全碰撞游戏:

python开发_tkinter_小球完全弹性碰撞游戏_源码下载

今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏:

游戏名称:
  小球完全弹性碰撞
游戏规则:
  1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
  2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
  3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
  4.玩家可以通过键盘的方向键:上,右键进行对小球加速
  5.玩家可以通过键盘的方向键:下,左键进行对小球减速
  6.玩家可以按键盘:f键实现全屏显示
  7.玩家可以按键盘:Esc键实现退出全屏操作
  8.窗口左下角显示小球个数,右下角显示作者邮箱

先看看图:

=======================================================

源码部分:

=======================================================

 #pygame draw

 import pygame
from pygame.locals import *
from sys import exit
from random import * '''
游戏名称:
小球完全弹性碰撞
游戏规则:
1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
4.玩家可以通过键盘的方向键:上,右键进行对小球加速
5.玩家可以通过键盘的方向键:下,左键进行对小球减速
6.玩家可以按键盘:f键实现全屏显示
7.玩家可以按键盘:Esc键实现退出全屏操作
8.窗口左下角显示小球个数,右下角显示作者邮箱 '''
__author__ = {'name' : 'Hongten',
'mail' : 'hongtenzone@foxmail.com',
'blog' : 'http://www.cnblogs.com/hongten',
'version' : '1.0'} pygame.init()
pygame.display.set_caption('Ball Game') SCREEN_WIDTH = 600
SCREEN_HEIGHT = 500
SPEED = 1
SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
SCREEN_DEFAULT_COLOR = (255, 255 ,255)
READY = 0 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
screen.fill(SCREEN_DEFAULT_COLOR)
bg = pygame.image.load('data\\image\\bg.jpg').convert()
font = pygame.font.Font('data\\font\\TORK____.ttf', 14) balls = []
BALL_R = 30
BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]] for i in range(len(BALL_COLORS)):
screen.fill(SCREEN_DEFAULT_COLOR)
b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
balls.append(b) while 1:
for event in pygame.event.get():
if event.type == QUIT:
exit()
elif event.type == KEYDOWN:
if event.key == K_UP:
SPEED += 0.1
elif event.key == K_DOWN:
SPEED -= 0.1
elif event.key == K_LEFT:
SPEED -= 0.1
elif event.key == K_RIGHT:
SPEED += 0.1
elif event.key == K_f:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
elif event.key == 27:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
elif event.type == MOUSEBUTTONDOWN:
pressed_array = pygame.mouse.get_pressed()
for index in range(len(pressed_array)):
if pressed_array[index]:
if index == 0:
c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
x, y = (BALL_R+1, BALL_R+1)
c_r = randint(10, 100)
c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
BALL_COLORS.append(c_color)
BALL_POINTS.append([x, y])
BALL_VELOCITY.append(c_v)
balls.append(c)
elif index == 2:
if len(balls) > 1:
balls.pop(0)
BALL_COLORS.pop(0)
BALL_POINTS.pop(0)
BALL_VELOCITY.pop(0) #print(balls)
for i in range(len(balls)):
screen.blit(bg, (-300, -100))
for n in range(len(balls)):
'''
if ((BALL_POINTS[i][0] - BALL_R) > 0 and (BALL_POINTS[i][0] - BALL_R) < BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] + BALL_R),int(BALL_POINTS[n][1])), BALL_R)
elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_WIDTH and (BALL_POINTS[i][1] + BALL_R) > SCREEN_WIDTH - BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] - BALL_R),int(BALL_POINTS[n][1])), BALL_R)
elif ((BALL_POINTS[i][1] - BALL_R) > 0 and (BALL_POINTS[i][1] - BALL_R) < BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] + BALL_R)), BALL_R)
elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_HEIGHT and (BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT - BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] - BALL_R)), BALL_R)
'''
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1] for j in range(len(balls)):
for k in range(len(balls)):
b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
b_r =(BALL_R*2)**2
if (round((b_x + b_y), 2) <= round(b_r, 2)):
temp_x = BALL_VELOCITY[j][0]
temp_y = BALL_VELOCITY[j][1]
BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
BALL_VELOCITY[k][0] = temp_x
BALL_VELOCITY[k][1] = temp_y BALL_POINTS[j][0] += SPEED * BALL_VELOCITY[j][0]
BALL_POINTS[j][1] += SPEED * BALL_VELOCITY[j][1] pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
game_info = 'Balls: ' + str(len(balls))
text = font.render(game_info, True, (255,255,255))
author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
screen.blit(text, (0, SCREEN_HEIGHT+5))
screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5)) pygame.display.update()

源码下载:http://files.cnblogs.com/hongten/pygame_pong_v1.0.zip

============================================

v1.1 Edit by Hongten

v1.1修改如下:
1.增加了背景音乐
2.增加小球的时候,会伴随音乐产生
3.窗口左下角显示小球个数,速度,以及最后一个小球的位置

============================================

 #pygame draw

 import pygame
from pygame.locals import *
from sys import exit
from random import * '''
游戏名称:
小球完全弹性碰撞
游戏规则:
1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
4.玩家可以通过键盘的方向键:上,右键进行对小球加速
5.玩家可以通过键盘的方向键:下,左键进行对小球减速
6.玩家可以按键盘:f键实现全屏显示
7.玩家可以按键盘:Esc键实现退出全屏操作
8.窗口左下角显示小球个数,右下角显示作者邮箱 v1.1修改如下:
1.增加了背景音乐
2.增加小球的时候,会伴随音乐产生
3.窗口左下角显示小球个数,速度,以及最后一个小球的位置 '''
__author__ = {'name' : 'Hongten',
'mail' : 'hongtenzone@foxmail.com',
'blog' : 'http://www.cnblogs.com/hongten',
'version' : '1.1'} if not pygame.font: print('Warning, fonts disabled')
if not pygame.mixer: print('Warning, sound disabled') pygame.init()
pygame.display.set_caption('Ball Game') SCREEN_WIDTH = 600
SCREEN_HEIGHT = 500
SPEED = 1
SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
SCREEN_DEFAULT_COLOR = (255, 255 ,255)
READY = 0 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
screen.fill(SCREEN_DEFAULT_COLOR)
bg = pygame.image.load('data\\image\\bg.jpg').convert()
font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
new_sound = pygame.mixer.Sound('data\\sound\\new.wav')
bg_sound = pygame.mixer.Sound('data\\sound\\bg.ogg')
bg_sound.set_volume(0.5)
bg_sound.play(-1)
new_sound.set_volume(1.0) balls = []
BALL_R = 30
BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]] for i in range(len(BALL_COLORS)):
screen.fill(SCREEN_DEFAULT_COLOR)
b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
balls.append(b) while 1:
for event in pygame.event.get():
if event.type == QUIT:
bg_sound.stop()
exit()
elif event.type == KEYDOWN:
if event.key == K_UP:
SPEED += 0.1
elif event.key == K_DOWN:
SPEED -= 0.1
elif event.key == K_LEFT:
SPEED -= 0.1
elif event.key == K_RIGHT:
SPEED += 0.1
elif event.key == K_f:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
elif event.key == 27:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
elif event.type == MOUSEBUTTONDOWN:
pressed_array = pygame.mouse.get_pressed()
for index in range(len(pressed_array)):
if pressed_array[index]:
if index == 0:
new_sound.play(-1)
c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
x, y = (BALL_R+1, BALL_R+1)
c_r = randint(10, 100)
c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
BALL_COLORS.append(c_color)
BALL_POINTS.append([x, y])
BALL_VELOCITY.append(c_v)
balls.append(c)
elif index == 2:
if len(balls) > 1:
balls.pop(0)
BALL_COLORS.pop(0)
BALL_POINTS.pop(0)
BALL_VELOCITY.pop(0)
elif event.type == MOUSEBUTTONUP:
new_sound.stop() #print(balls)
for i in range(len(balls)):
screen.blit(bg, (-300, -100))
for n in range(len(balls)):
'''
if ((BALL_POINTS[i][0] - BALL_R) > 0 and (BALL_POINTS[i][0] - BALL_R) < BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] + BALL_R),int(BALL_POINTS[n][1])), BALL_R)
elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_WIDTH and (BALL_POINTS[i][1] + BALL_R) > SCREEN_WIDTH - BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] - BALL_R),int(BALL_POINTS[n][1])), BALL_R)
elif ((BALL_POINTS[i][1] - BALL_R) > 0 and (BALL_POINTS[i][1] - BALL_R) < BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] + BALL_R)), BALL_R)
elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_HEIGHT and (BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT - BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] - BALL_R)), BALL_R)
'''
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1] for j in range(len(balls)):
for k in range(len(balls)):
b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
b_r =(BALL_R*2)**2
if (round((b_x + b_y), 2) <= round(b_r, 2)):
temp_x = BALL_VELOCITY[j][0]
temp_y = BALL_VELOCITY[j][1]
BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
BALL_VELOCITY[k][0] = temp_x
BALL_VELOCITY[k][1] = temp_y BALL_POINTS[j][0] += round(SPEED, 1) * BALL_VELOCITY[j][0]
BALL_POINTS[j][1] += round(SPEED, 1) * BALL_VELOCITY[j][1] pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
game_info = 'Balls: ' + str(len(balls)) + ' Speed: ' + str(round(SPEED, 2)) + ' LastBall: ' + str(round(BALL_POINTS[-1][0])) + ',' + str(round(BALL_POINTS[-1][1]))
text = font.render(game_info, True, (255,255,255))
author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
screen.blit(text, (0, SCREEN_HEIGHT+5))
screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5)) pygame.display.update()

源码下载:http://files.cnblogs.com/hongten/pygame_pong_v1.1.rar

==================================================

Edit By Hongten

v1.2修改如下:
1.修改键盘方向键:左,右键为调节音量(0, 10)
2.在状态栏添加音量状态信息:数字和图形显示

==================================================

 #pygame draw

 import pygame
from pygame.locals import *
from sys import exit
from random import * '''
游戏名称:
小球完全弹性碰撞
游戏规则:
1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
4.玩家可以通过键盘的方向键:上,右键进行对小球加速
5.玩家可以通过键盘的方向键:下,左键进行对小球减速
6.玩家可以按键盘:f键实现全屏显示
7.玩家可以按键盘:Esc键实现退出全屏操作
8.窗口左下角显示小球个数,右下角显示作者邮箱 v1.1修改如下:
1.增加了背景音乐
2.增加小球的时候,会伴随音乐产生
3.窗口左下角显示小球个数,速度,以及最后一个小球的位置 v1.2修改如下:
1.修改键盘方向键:左,右键为调节音量(0, 10)
2.在状态栏添加音量状态信息:数字和图形显示 '''
__author__ = {'name' : 'Hongten',
'mail' : 'hongtenzone@foxmail.com',
'blog' : 'http://www.cnblogs.com/hongten',
'version' : '1.2'} if not pygame.font: print('Warning, fonts disabled')
if not pygame.mixer: print('Warning, sound disabled') pygame.init()
pygame.display.set_caption('Ball Game') SCREEN_WIDTH = 600
SCREEN_HEIGHT = 500
SPEED = 1
VOLUME = 5
SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
SCREEN_DEFAULT_COLOR = (255, 255 ,255)
READY = 0 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
screen.fill(SCREEN_DEFAULT_COLOR)
bg = pygame.image.load('data\\image\\bg.jpg').convert()
font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
new_sound = pygame.mixer.Sound('data\\sound\\new.wav')
bg_sound = pygame.mixer.Sound('data\\sound\\bg.ogg')
bg_sound.set_volume(0.1 * VOLUME)
bg_sound.play(-1)
new_sound.set_volume(0.1 * VOLUME) balls = []
BALL_R = 30
BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]] VOLUME_POINTS = []
VOLUME_POINTS_START = []
VOLUME_RECT_COLORS = []
for p in range(170, 250, 7):
VOLUME_POINTS.append([SCREEN_WIDTH - p,SCREEN_HEIGHT + 20])
for ps in range(175, 250, 7):
VOLUME_POINTS_START.append([SCREEN_WIDTH - ps, SCREEN_HEIGHT])
VOLUME_RECT_COLORS.append((randint(0, 255), randint(0, 255), randint(0, 255))) print(VOLUME_POINTS[-10])
print(VOLUME_POINTS_START[-10]) for i in range(len(BALL_COLORS)):
screen.fill(SCREEN_DEFAULT_COLOR)
b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
balls.append(b) while 1:
for event in pygame.event.get():
if event.type == QUIT:
bg_sound.stop()
exit()
elif event.type == KEYDOWN:
if event.key == K_UP:
SPEED += 0.1
elif event.key == K_DOWN:
SPEED -= 0.1
elif event.key == K_LEFT:
if VOLUME > 0:
VOLUME -= 1
elif event.key == K_RIGHT:
if VOLUME <= 9:
VOLUME += 1
elif event.key == K_f:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
elif event.key == 27:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
elif event.type == MOUSEBUTTONDOWN:
pressed_array = pygame.mouse.get_pressed()
for index in range(len(pressed_array)):
if pressed_array[index]:
if index == 0:
new_sound.play(-1)
c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
x, y = (BALL_R+1, BALL_R+1)
c_r = randint(10, 100)
c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
BALL_COLORS.append(c_color)
BALL_POINTS.append([x, y])
BALL_VELOCITY.append(c_v)
balls.append(c)
elif index == 2:
if len(balls) > 1:
balls.pop(0)
BALL_COLORS.pop(0)
BALL_POINTS.pop(0)
BALL_VELOCITY.pop(0)
elif event.type == MOUSEBUTTONUP:
new_sound.stop() #print(balls)
for i in range(len(balls)):
screen.blit(bg, (-300, -100))
#screen.fill(SCREEN_DEFAULT_COLOR)
for n in range(len(balls)):
'''
if ((BALL_POINTS[i][0] - BALL_R) > 0 and (BALL_POINTS[i][0] - BALL_R) < BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] + BALL_R),int(BALL_POINTS[n][1])), BALL_R)
elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_WIDTH and (BALL_POINTS[i][1] + BALL_R) > SCREEN_WIDTH - BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] - BALL_R),int(BALL_POINTS[n][1])), BALL_R)
elif ((BALL_POINTS[i][1] - BALL_R) > 0 and (BALL_POINTS[i][1] - BALL_R) < BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] + BALL_R)), BALL_R)
elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_HEIGHT and (BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT - BALL_R):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] - BALL_R)), BALL_R)
'''
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1] for j in range(len(balls)):
for k in range(len(balls)):
b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
b_r =(BALL_R*2)**2
if (round((b_x + b_y), 2) <= round(b_r, 2)):
temp_x = BALL_VELOCITY[j][0]
temp_y = BALL_VELOCITY[j][1]
BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
BALL_VELOCITY[k][0] = temp_x
BALL_VELOCITY[k][1] = temp_y BALL_POINTS[j][0] += round(SPEED, 1) * BALL_VELOCITY[j][0]
BALL_POINTS[j][1] += round(SPEED, 1) * BALL_VELOCITY[j][1] pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
bg_sound.set_volume(0.1 * VOLUME)
new_sound.set_volume(0.1 * VOLUME)
pygame.draw.rect(screen,
(255, 255, 255),
Rect((VOLUME_POINTS_START[-1][0],
VOLUME_POINTS_START[-1][1]),
(VOLUME_POINTS[-10][0] - VOLUME_POINTS_START[-1][0],
20)))
for v in range(VOLUME+1):
if v > 0:
pygame.draw.rect(screen,
VOLUME_RECT_COLORS[v],
Rect((VOLUME_POINTS_START[-v][0],
VOLUME_POINTS_START[-v][1]),
(VOLUME_POINTS[-v][0] - VOLUME_POINTS_START[-v][0],
20))) game_info = 'Balls: ' + str(len(balls)) + ' Speed: ' + str(round(SPEED, 2)) + ' LastBall: ' + str(round(BALL_POINTS[-1][0])) + ',' + str(round(BALL_POINTS[-1][1]))
text = font.render(game_info, True, (255,255,255))
author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
volume_text = font.render('Volume: ' + str(VOLUME), True, (255, 255, 255))
screen.blit(text, (0, SCREEN_HEIGHT+5))
screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5))
screen.blit(volume_text, (SCREEN_WIDTH - 310, SCREEN_HEIGHT+5))
pygame.display.update()

源码下载:http://files.cnblogs.com/hongten/pygame_pong_v1.2.zip

 ================================================

v1.3 Edity by Hongten

Change Chinese to English

 ================================================

The View of the Game:

 #pygame draw

 import pygame
from pygame.locals import *
from sys import exit
from random import * '''
Game Name:
Ball Perfectly Elastic Collision(BPEC)
Rules or Description:
1.There are five balls whth different color have elastic collision
after the game loaded.
2.The player can click the window with the LEFT mouse button
and create the new ball,which with the different color,but
sometimes maybe like other balls.
3.The player can click teh window with RIGHT mouse button
and minus a few balls.
4.You can change all ball speed by pressing the UP and DOWN
the keyboard direction key.
5.Also you can change the background music by pressing the LEFT
and RIGHT the keyboard direction key(volume:0-10).
6.Maybe you want to full screen view,By pressing the F key
and ESC key switch.
7.Ball number,the speed,the volume,author E-mail is written
in the status bar at the bottom.
'''
__version__ = '1.3'
__author__ = {'name' : 'Hongten',
'mail' : 'hongtenzone@foxmail.com',
'blog' : 'http://www.cnblogs.com/hongten',
'version' : __version__} if not pygame.font: print('Warning, fonts disabled')
if not pygame.mixer: print('Warning, sound disabled') pygame.init()
pygame.display.set_caption('Ball Game') SCREEN_WIDTH = 600
SCREEN_HEIGHT = 500
SPEED = 1
VOLUME = 5
SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
SCREEN_DEFAULT_COLOR = (255, 255 ,255)
READY = 0 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
screen.fill(SCREEN_DEFAULT_COLOR)
bg = pygame.image.load('data\\image\\bg.jpg').convert()
font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
new_sound = pygame.mixer.Sound('data\\sound\\new.wav')
bg_sound = pygame.mixer.Sound('data\\sound\\bg.ogg')
bg_sound.set_volume(0.1 * VOLUME)
bg_sound.play(-1)
new_sound.set_volume(0.1 * VOLUME) balls = []
BALL_R = 30
BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]] VOLUME_POINTS = []
VOLUME_POINTS_START = []
VOLUME_RECT_COLORS = []
for p in range(170, 250, 7):
VOLUME_POINTS.append([SCREEN_WIDTH - p,SCREEN_HEIGHT + 20])
for ps in range(175, 250, 7):
VOLUME_POINTS_START.append([SCREEN_WIDTH - ps, SCREEN_HEIGHT])
VOLUME_RECT_COLORS.append((randint(0, 255), randint(0, 255), randint(0, 255))) for i in range(len(BALL_COLORS)):
screen.fill(SCREEN_DEFAULT_COLOR)
b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
balls.append(b) while 1:
for event in pygame.event.get():
if event.type == QUIT:
bg_sound.stop()
exit()
elif event.type == KEYDOWN:
if event.key == K_UP:
SPEED += 0.1
elif event.key == K_DOWN:
SPEED -= 0.1
elif event.key == K_LEFT:
if VOLUME > 0:
VOLUME -= 1
elif event.key == K_RIGHT:
if VOLUME <= 9:
VOLUME += 1
elif event.key == K_f:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
elif event.key == 27:
pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
elif event.type == MOUSEBUTTONDOWN:
pressed_array = pygame.mouse.get_pressed()
for index in range(len(pressed_array)):
if pressed_array[index]:
if index == 0:
new_sound.play(-1)
c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
x, y = (BALL_R+1, BALL_R+1)
c_r = randint(10, 100)
c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
BALL_COLORS.append(c_color)
BALL_POINTS.append([x, y])
BALL_VELOCITY.append(c_v)
balls.append(c)
elif index == 2:
if len(balls) > 1:
balls.pop(0)
BALL_COLORS.pop(0)
BALL_POINTS.pop(0)
BALL_VELOCITY.pop(0)
elif event.type == MOUSEBUTTONUP:
new_sound.stop() #print(balls)
for i in range(len(balls)):
screen.blit(bg, (-300, -100))
#screen.fill(SCREEN_DEFAULT_COLOR)
for n in range(len(balls)):
pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1] for j in range(len(balls)):
for k in range(len(balls)):
b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
b_r =(BALL_R*2)**2
if (round((b_x + b_y), 2) <= round(b_r, 2)):
temp_x = BALL_VELOCITY[j][0]
temp_y = BALL_VELOCITY[j][1]
BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
BALL_VELOCITY[k][0] = temp_x
BALL_VELOCITY[k][1] = temp_y BALL_POINTS[j][0] += round(SPEED, 1) * BALL_VELOCITY[j][0]
BALL_POINTS[j][1] += round(SPEED, 1) * BALL_VELOCITY[j][1] pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
bg_sound.set_volume(0.1 * VOLUME)
new_sound.set_volume(0.1 * VOLUME)
pygame.draw.rect(screen,
(255, 255, 255),
Rect((VOLUME_POINTS_START[-1][0],
VOLUME_POINTS_START[-1][1]),
(VOLUME_POINTS[-10][0] - VOLUME_POINTS_START[-1][0],
20)))
for v in range(VOLUME+1):
if v > 0:
pygame.draw.rect(screen,
VOLUME_RECT_COLORS[v],
Rect((VOLUME_POINTS_START[-v][0],
VOLUME_POINTS_START[-v][1]),
(VOLUME_POINTS[-v][0] - VOLUME_POINTS_START[-v][0],
20))) game_info = 'Balls: ' + str(len(balls)) + ' Speed: ' + str(round(SPEED, 2)) + ' LastBall: ' + str(round(BALL_POINTS[-1][0])) + ',' + str(round(BALL_POINTS[-1][1]))
text = font.render(game_info, True, (255,255,255))
author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
volume_text = font.render('Volume: ' + str(VOLUME), True, (255, 255, 255))
screen.blit(text, (0, SCREEN_HEIGHT+5))
screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5))
screen.blit(volume_text, (SCREEN_WIDTH - 310, SCREEN_HEIGHT+5))
pygame.display.update()

源码下载:http://files.cnblogs.com/hongten/pygame_pong_v1.3.zip

========================================================

More reading,and english is important.

I'm Hongten

大哥哥大姐姐,觉得有用打赏点哦!多多少少没关系,一分也是对我的支持和鼓励。谢谢。
Hongten博客排名在100名以内。粉丝过千。
Hongten出品,必是精品。

E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten

========================================================

pygame系列_小球完全弹性碰撞游戏_源码下载的更多相关文章

  1. pygame系列_小球完全弹性碰撞游戏

    之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同 ...

  2. python开发_tkinter_小球完全弹性碰撞游戏_源码下载

    完成这个小球的完全弹性碰撞游戏灵感来自于: 下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏: 游戏初始化状态: 最下面的游标和修改小球的移动速度 ====================== ...

  3. openlayers4 入门开发系列结合 echarts4 实现散点图(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  4. leaflet-webpack 入门开发系列三地图分屏对比(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  5. cesium 入门开发系列矢量瓦片加载展示(附源码下载)

    前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...

  6. [Java] SSH框架笔记_框架分析+环境搭建+实例源码下载

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...

  7. openlayers4 入门开发系列之聚合图篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  8. openlayers4 入门开发系列之迁徙图篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  9. openlayers4 入门开发系列之地图工具栏篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

随机推荐

  1. expect 交互 telnet 交互

    telnet 交互 #!/bin/bash Ip="10.0.1.53" a="\{\'method\'\:\'doLogin\'\,\'params\'\:\{\'uN ...

  2. npm 更换阿里镜像

    使用NPM(Node.js包管理工具)安装依赖时速度特别慢,只需要使用–registry参数指定镜像服务器地址, npm install your-need-model --registry=http ...

  3. Dream------Hbase--0.94版本和0.98/1.X版本api变动

    Dream------Hbase--0.94版本和0.98/1.X版本api变动 网上好多说getQualifier.getValue.getRow被..Array代替了,其实并不是的. 1. Int ...

  4. lucene入门查询索引——(三)

    1.用户接口(lucene不提供)

  5. 操作系统环境变量LANG和NLS_LANG的关系

    =Native Language Support本地语言支持 NLS ORACLE11g-ORA-12705: Cannot access NLS data files or invalid envi ...

  6. 前后端分离之mockjs基本介绍

    安装与使用 # 安装 npm install mockjs #使用 Mock var Mock = require('mockjs') var data = Mock.mock({ // 属性 lis ...

  7. public private protect

    public 公有  使用public意味着声明public之后的成员对每个人都是可用的 private 私有  除非必须公开底层实现细目,否则就应该将所有的域指定为private protect 继 ...

  8. OCR识别-python3.5版

    刚接触,啥子都不会,按着教程走 需求:识别图片中的文字信息环境:windows系统 开发语言:python3.5 使用工具类:1.pyocr 2.PIL 3.tesseract-ocr 步骤: 1.p ...

  9. kafka查看消费数据

    一.如何查看 在老版本中,使用kafka-run-class.sh 脚本进行查看.但是对于最新版本,kafka-run-class.sh 已经不能使用,必须使用另外一个脚本才行,它就是kafka-co ...

  10. SqlServer代理作业

    最近一直在学习SqlServer 作业方面的知识,总结一下. 一:作业存在的库. msdb  use msdb Msdb数据库是代理服务数据库,为其报警.任务调度和记录操作员的操作提供存储空间. 二: ...