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

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

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

先看看图:

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

源码部分:

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

  1 #pygame draw
2
3 import pygame
4 from pygame.locals import *
5 from sys import exit
6 from random import *
7
8 '''
9 游戏名称:
10 小球完全弹性碰撞
11 游戏规则:
12 1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
13 2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
14 3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
15 4.玩家可以通过键盘的方向键:上,右键进行对小球加速
16 5.玩家可以通过键盘的方向键:下,左键进行对小球减速
17 6.玩家可以按键盘:f键实现全屏显示
18 7.玩家可以按键盘:Esc键实现退出全屏操作
19 8.窗口左下角显示小球个数,右下角显示作者邮箱
20
21 '''
22 __author__ = {'name' : 'Hongten',
23 'mail' : 'hongtenzone@foxmail.com',
24 'blog' : 'http://www.cnblogs.com/hongten',
25 'version' : '1.0'}
26
27 pygame.init()
28 pygame.display.set_caption('Ball Game')
29
30 SCREEN_WIDTH = 600
31 SCREEN_HEIGHT = 500
32 SPEED = 1
33 SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
34 SCREEN_DEFAULT_COLOR = (255, 255 ,255)
35 READY = 0
36
37 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
38 screen.fill(SCREEN_DEFAULT_COLOR)
39 bg = pygame.image.load('data\\image\\bg.jpg').convert()
40 font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
41
42 balls = []
43 BALL_R = 30
44 BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
45 BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
46 BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]]
47
48 for i in range(len(BALL_COLORS)):
49 screen.fill(SCREEN_DEFAULT_COLOR)
50 b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
51 balls.append(b)
52
53 while 1:
54 for event in pygame.event.get():
55 if event.type == QUIT:
56 exit()
57 elif event.type == KEYDOWN:
58 if event.key == K_UP:
59 SPEED += 0.1
60 elif event.key == K_DOWN:
61 SPEED -= 0.1
62 elif event.key == K_LEFT:
63 SPEED -= 0.1
64 elif event.key == K_RIGHT:
65 SPEED += 0.1
66 elif event.key == K_f:
67 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
68 elif event.key == 27:
69 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
70 elif event.type == MOUSEBUTTONDOWN:
71 pressed_array = pygame.mouse.get_pressed()
72 for index in range(len(pressed_array)):
73 if pressed_array[index]:
74 if index == 0:
75 c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
76 x, y = (BALL_R+1, BALL_R+1)
77 c_r = randint(10, 100)
78 c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
79 c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
80 BALL_COLORS.append(c_color)
81 BALL_POINTS.append([x, y])
82 BALL_VELOCITY.append(c_v)
83 balls.append(c)
84 elif index == 2:
85 if len(balls) > 1:
86 balls.pop(0)
87 BALL_COLORS.pop(0)
88 BALL_POINTS.pop(0)
89 BALL_VELOCITY.pop(0)
90
91 #print(balls)
92 for i in range(len(balls)):
93 screen.blit(bg, (-300, -100))
94 for n in range(len(balls)):
95 '''
96 if ((BALL_POINTS[i][0] - BALL_R) > 0 and (BALL_POINTS[i][0] - BALL_R) < BALL_R):
97 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] + BALL_R),int(BALL_POINTS[n][1])), BALL_R)
98 elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_WIDTH and (BALL_POINTS[i][1] + BALL_R) > SCREEN_WIDTH - BALL_R):
99 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] - BALL_R),int(BALL_POINTS[n][1])), BALL_R)
100 elif ((BALL_POINTS[i][1] - BALL_R) > 0 and (BALL_POINTS[i][1] - BALL_R) < BALL_R):
101 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] + BALL_R)), BALL_R)
102 elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_HEIGHT and (BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT - BALL_R):
103 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] - BALL_R)), BALL_R)
104 '''
105 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
106 if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
107 BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
108 if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
109 BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1]
110
111 for j in range(len(balls)):
112 for k in range(len(balls)):
113 b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
114 b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
115 b_r =(BALL_R*2)**2
116 if (round((b_x + b_y), 2) <= round(b_r, 2)):
117 temp_x = BALL_VELOCITY[j][0]
118 temp_y = BALL_VELOCITY[j][1]
119 BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
120 BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
121 BALL_VELOCITY[k][0] = temp_x
122 BALL_VELOCITY[k][1] = temp_y
123
124 BALL_POINTS[j][0] += SPEED * BALL_VELOCITY[j][0]
125 BALL_POINTS[j][1] += SPEED * BALL_VELOCITY[j][1]
126
127 pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
128 game_info = 'Balls: ' + str(len(balls))
129 text = font.render(game_info, True, (255,255,255))
130 author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
131 screen.blit(text, (0, SCREEN_HEIGHT+5))
132 screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5))
133
134 pygame.display.update()

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

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

v1.1 Edit by Hongten

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

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

  1 #pygame draw
2
3 import pygame
4 from pygame.locals import *
5 from sys import exit
6 from random import *
7
8 '''
9 游戏名称:
10 小球完全弹性碰撞
11 游戏规则:
12 1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
13 2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
14 3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
15 4.玩家可以通过键盘的方向键:上,右键进行对小球加速
16 5.玩家可以通过键盘的方向键:下,左键进行对小球减速
17 6.玩家可以按键盘:f键实现全屏显示
18 7.玩家可以按键盘:Esc键实现退出全屏操作
19 8.窗口左下角显示小球个数,右下角显示作者邮箱
20
21 v1.1修改如下:
22 1.增加了背景音乐
23 2.增加小球的时候,会伴随音乐产生
24 3.窗口左下角显示小球个数,速度,以及最后一个小球的位置
25
26 '''
27 __author__ = {'name' : 'Hongten',
28 'mail' : 'hongtenzone@foxmail.com',
29 'blog' : 'http://www.cnblogs.com/hongten',
30 'version' : '1.1'}
31
32 if not pygame.font: print('Warning, fonts disabled')
33 if not pygame.mixer: print('Warning, sound disabled')
34
35 pygame.init()
36 pygame.display.set_caption('Ball Game')
37
38 SCREEN_WIDTH = 600
39 SCREEN_HEIGHT = 500
40 SPEED = 1
41 SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
42 SCREEN_DEFAULT_COLOR = (255, 255 ,255)
43 READY = 0
44
45 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
46 screen.fill(SCREEN_DEFAULT_COLOR)
47 bg = pygame.image.load('data\\image\\bg.jpg').convert()
48 font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
49 new_sound = pygame.mixer.Sound('data\\sound\\new.wav')
50 bg_sound = pygame.mixer.Sound('data\\sound\\bg.ogg')
51 bg_sound.set_volume(0.5)
52 bg_sound.play(-1)
53 new_sound.set_volume(1.0)
54
55
56 balls = []
57 BALL_R = 30
58 BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
59 BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
60 BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]]
61
62 for i in range(len(BALL_COLORS)):
63 screen.fill(SCREEN_DEFAULT_COLOR)
64 b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
65 balls.append(b)
66
67 while 1:
68 for event in pygame.event.get():
69 if event.type == QUIT:
70 bg_sound.stop()
71 exit()
72 elif event.type == KEYDOWN:
73 if event.key == K_UP:
74 SPEED += 0.1
75 elif event.key == K_DOWN:
76 SPEED -= 0.1
77 elif event.key == K_LEFT:
78 SPEED -= 0.1
79 elif event.key == K_RIGHT:
80 SPEED += 0.1
81 elif event.key == K_f:
82 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
83 elif event.key == 27:
84 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
85 elif event.type == MOUSEBUTTONDOWN:
86 pressed_array = pygame.mouse.get_pressed()
87 for index in range(len(pressed_array)):
88 if pressed_array[index]:
89 if index == 0:
90 new_sound.play(-1)
91 c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
92 x, y = (BALL_R+1, BALL_R+1)
93 c_r = randint(10, 100)
94 c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
95 c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
96 BALL_COLORS.append(c_color)
97 BALL_POINTS.append([x, y])
98 BALL_VELOCITY.append(c_v)
99 balls.append(c)
100 elif index == 2:
101 if len(balls) > 1:
102 balls.pop(0)
103 BALL_COLORS.pop(0)
104 BALL_POINTS.pop(0)
105 BALL_VELOCITY.pop(0)
106 elif event.type == MOUSEBUTTONUP:
107 new_sound.stop()
108
109 #print(balls)
110 for i in range(len(balls)):
111 screen.blit(bg, (-300, -100))
112 for n in range(len(balls)):
113 '''
114 if ((BALL_POINTS[i][0] - BALL_R) > 0 and (BALL_POINTS[i][0] - BALL_R) < BALL_R):
115 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] + BALL_R),int(BALL_POINTS[n][1])), BALL_R)
116 elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_WIDTH and (BALL_POINTS[i][1] + BALL_R) > SCREEN_WIDTH - BALL_R):
117 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] - BALL_R),int(BALL_POINTS[n][1])), BALL_R)
118 elif ((BALL_POINTS[i][1] - BALL_R) > 0 and (BALL_POINTS[i][1] - BALL_R) < BALL_R):
119 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] + BALL_R)), BALL_R)
120 elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_HEIGHT and (BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT - BALL_R):
121 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] - BALL_R)), BALL_R)
122 '''
123 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
124 if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
125 BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
126 if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
127 BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1]
128
129 for j in range(len(balls)):
130 for k in range(len(balls)):
131 b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
132 b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
133 b_r =(BALL_R*2)**2
134 if (round((b_x + b_y), 2) <= round(b_r, 2)):
135 temp_x = BALL_VELOCITY[j][0]
136 temp_y = BALL_VELOCITY[j][1]
137 BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
138 BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
139 BALL_VELOCITY[k][0] = temp_x
140 BALL_VELOCITY[k][1] = temp_y
141
142 BALL_POINTS[j][0] += round(SPEED, 1) * BALL_VELOCITY[j][0]
143 BALL_POINTS[j][1] += round(SPEED, 1) * BALL_VELOCITY[j][1]
144
145 pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
146 game_info = 'Balls: ' + str(len(balls)) + ' Speed: ' + str(round(SPEED, 2)) + ' LastBall: ' + str(round(BALL_POINTS[-1][0])) + ',' + str(round(BALL_POINTS[-1][1]))
147 text = font.render(game_info, True, (255,255,255))
148 author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
149 screen.blit(text, (0, SCREEN_HEIGHT+5))
150 screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5))
151
152 pygame.display.update()

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

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

Edit By Hongten

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

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

  1 #pygame draw
2
3 import pygame
4 from pygame.locals import *
5 from sys import exit
6 from random import *
7
8 '''
9 游戏名称:
10 小球完全弹性碰撞
11 游戏规则:
12 1.游戏初始化的时候,有5个不同颜色的小球进行碰撞
13 2.玩家可以通过在窗口中单击鼠标左键进行增加小球个数
14 3.玩家可以通过在窗口中单击鼠标右键进行删减小球个数
15 4.玩家可以通过键盘的方向键:上,右键进行对小球加速
16 5.玩家可以通过键盘的方向键:下,左键进行对小球减速
17 6.玩家可以按键盘:f键实现全屏显示
18 7.玩家可以按键盘:Esc键实现退出全屏操作
19 8.窗口左下角显示小球个数,右下角显示作者邮箱
20
21 v1.1修改如下:
22 1.增加了背景音乐
23 2.增加小球的时候,会伴随音乐产生
24 3.窗口左下角显示小球个数,速度,以及最后一个小球的位置
25
26 v1.2修改如下:
27 1.修改键盘方向键:左,右键为调节音量(0, 10)
28 2.在状态栏添加音量状态信息:数字和图形显示
29
30 '''
31 __author__ = {'name' : 'Hongten',
32 'mail' : 'hongtenzone@foxmail.com',
33 'blog' : 'http://www.cnblogs.com/hongten',
34 'version' : '1.2'}
35
36 if not pygame.font: print('Warning, fonts disabled')
37 if not pygame.mixer: print('Warning, sound disabled')
38
39 pygame.init()
40 pygame.display.set_caption('Ball Game')
41
42 SCREEN_WIDTH = 600
43 SCREEN_HEIGHT = 500
44 SPEED = 1
45 VOLUME = 5
46 SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
47 SCREEN_DEFAULT_COLOR = (255, 255 ,255)
48 READY = 0
49
50 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
51 screen.fill(SCREEN_DEFAULT_COLOR)
52 bg = pygame.image.load('data\\image\\bg.jpg').convert()
53 font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
54 new_sound = pygame.mixer.Sound('data\\sound\\new.wav')
55 bg_sound = pygame.mixer.Sound('data\\sound\\bg.ogg')
56 bg_sound.set_volume(0.1 * VOLUME)
57 bg_sound.play(-1)
58 new_sound.set_volume(0.1 * VOLUME)
59
60
61 balls = []
62 BALL_R = 30
63 BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
64 BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
65 BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]]
66
67 VOLUME_POINTS = []
68 VOLUME_POINTS_START = []
69 VOLUME_RECT_COLORS = []
70 for p in range(170, 250, 7):
71 VOLUME_POINTS.append([SCREEN_WIDTH - p,SCREEN_HEIGHT + 20])
72 for ps in range(175, 250, 7):
73 VOLUME_POINTS_START.append([SCREEN_WIDTH - ps, SCREEN_HEIGHT])
74 VOLUME_RECT_COLORS.append((randint(0, 255), randint(0, 255), randint(0, 255)))
75
76
77 print(VOLUME_POINTS[-10])
78 print(VOLUME_POINTS_START[-10])
79
80 for i in range(len(BALL_COLORS)):
81 screen.fill(SCREEN_DEFAULT_COLOR)
82 b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
83 balls.append(b)
84
85 while 1:
86 for event in pygame.event.get():
87 if event.type == QUIT:
88 bg_sound.stop()
89 exit()
90 elif event.type == KEYDOWN:
91 if event.key == K_UP:
92 SPEED += 0.1
93 elif event.key == K_DOWN:
94 SPEED -= 0.1
95 elif event.key == K_LEFT:
96 if VOLUME > 0:
97 VOLUME -= 1
98 elif event.key == K_RIGHT:
99 if VOLUME <= 9:
100 VOLUME += 1
101 elif event.key == K_f:
102 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
103 elif event.key == 27:
104 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
105 elif event.type == MOUSEBUTTONDOWN:
106 pressed_array = pygame.mouse.get_pressed()
107 for index in range(len(pressed_array)):
108 if pressed_array[index]:
109 if index == 0:
110 new_sound.play(-1)
111 c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
112 x, y = (BALL_R+1, BALL_R+1)
113 c_r = randint(10, 100)
114 c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
115 c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
116 BALL_COLORS.append(c_color)
117 BALL_POINTS.append([x, y])
118 BALL_VELOCITY.append(c_v)
119 balls.append(c)
120 elif index == 2:
121 if len(balls) > 1:
122 balls.pop(0)
123 BALL_COLORS.pop(0)
124 BALL_POINTS.pop(0)
125 BALL_VELOCITY.pop(0)
126 elif event.type == MOUSEBUTTONUP:
127 new_sound.stop()
128
129 #print(balls)
130 for i in range(len(balls)):
131 screen.blit(bg, (-300, -100))
132 #screen.fill(SCREEN_DEFAULT_COLOR)
133 for n in range(len(balls)):
134 '''
135 if ((BALL_POINTS[i][0] - BALL_R) > 0 and (BALL_POINTS[i][0] - BALL_R) < BALL_R):
136 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] + BALL_R),int(BALL_POINTS[n][1])), BALL_R)
137 elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_WIDTH and (BALL_POINTS[i][1] + BALL_R) > SCREEN_WIDTH - BALL_R):
138 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0] - BALL_R),int(BALL_POINTS[n][1])), BALL_R)
139 elif ((BALL_POINTS[i][1] - BALL_R) > 0 and (BALL_POINTS[i][1] - BALL_R) < BALL_R):
140 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] + BALL_R)), BALL_R)
141 elif ((BALL_POINTS[i][1] + BALL_R) < SCREEN_HEIGHT and (BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT - BALL_R):
142 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1] - BALL_R)), BALL_R)
143 '''
144 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
145 if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
146 BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
147 if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
148 BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1]
149
150 for j in range(len(balls)):
151 for k in range(len(balls)):
152 b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
153 b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
154 b_r =(BALL_R*2)**2
155 if (round((b_x + b_y), 2) <= round(b_r, 2)):
156 temp_x = BALL_VELOCITY[j][0]
157 temp_y = BALL_VELOCITY[j][1]
158 BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
159 BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
160 BALL_VELOCITY[k][0] = temp_x
161 BALL_VELOCITY[k][1] = temp_y
162
163 BALL_POINTS[j][0] += round(SPEED, 1) * BALL_VELOCITY[j][0]
164 BALL_POINTS[j][1] += round(SPEED, 1) * BALL_VELOCITY[j][1]
165
166 pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
167 bg_sound.set_volume(0.1 * VOLUME)
168 new_sound.set_volume(0.1 * VOLUME)
169 pygame.draw.rect(screen,
170 (255, 255, 255),
171 Rect((VOLUME_POINTS_START[-1][0],
172 VOLUME_POINTS_START[-1][1]),
173 (VOLUME_POINTS[-10][0] - VOLUME_POINTS_START[-1][0],
174 20)))
175 for v in range(VOLUME+1):
176 if v > 0:
177 pygame.draw.rect(screen,
178 VOLUME_RECT_COLORS[v],
179 Rect((VOLUME_POINTS_START[-v][0],
180 VOLUME_POINTS_START[-v][1]),
181 (VOLUME_POINTS[-v][0] - VOLUME_POINTS_START[-v][0],
182 20)))
183
184 game_info = 'Balls: ' + str(len(balls)) + ' Speed: ' + str(round(SPEED, 2)) + ' LastBall: ' + str(round(BALL_POINTS[-1][0])) + ',' + str(round(BALL_POINTS[-1][1]))
185 text = font.render(game_info, True, (255,255,255))
186 author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
187 volume_text = font.render('Volume: ' + str(VOLUME), True, (255, 255, 255))
188 screen.blit(text, (0, SCREEN_HEIGHT+5))
189 screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5))
190 screen.blit(volume_text, (SCREEN_WIDTH - 310, SCREEN_HEIGHT+5))
191 pygame.display.update()

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

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

v1.3 Edity by Hongten

Change Chinese to English

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

The View of the Game:

  1 #pygame draw
2
3 import pygame
4 from pygame.locals import *
5 from sys import exit
6 from random import *
7
8 '''
9 Game Name:
10 Ball Perfectly Elastic Collision(BPEC)
11 Rules or Description:
12 1.There are five balls whth different color have elastic collision
13 after the game loaded.
14 2.The player can click the window with the LEFT mouse button
15 and create the new ball,which with the different color,but
16 sometimes maybe like other balls.
17 3.The player can click teh window with RIGHT mouse button
18 and minus a few balls.
19 4.You can change all ball speed by pressing the UP and DOWN
20 the keyboard direction key.
21 5.Also you can change the background music by pressing the LEFT
22 and RIGHT the keyboard direction key(volume:0-10).
23 6.Maybe you want to full screen view,By pressing the F key
24 and ESC key switch.
25 7.Ball number,the speed,the volume,author E-mail is written
26 in the status bar at the bottom.
27 '''
28 __version__ = '1.3'
29 __author__ = {'name' : 'Hongten',
30 'mail' : 'hongtenzone@foxmail.com',
31 'blog' : 'http://www.cnblogs.com/hongten',
32 'version' : __version__}
33
34 if not pygame.font: print('Warning, fonts disabled')
35 if not pygame.mixer: print('Warning, sound disabled')
36
37 pygame.init()
38 pygame.display.set_caption('Ball Game')
39
40 SCREEN_WIDTH = 600
41 SCREEN_HEIGHT = 500
42 SPEED = 1
43 VOLUME = 5
44 SCREEN_DEFAULT_SIZE = (SCREEN_WIDTH, SCREEN_HEIGHT + 20)
45 SCREEN_DEFAULT_COLOR = (255, 255 ,255)
46 READY = 0
47
48 screen = pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
49 screen.fill(SCREEN_DEFAULT_COLOR)
50 bg = pygame.image.load('data\\image\\bg.jpg').convert()
51 font = pygame.font.Font('data\\font\\TORK____.ttf', 14)
52 new_sound = pygame.mixer.Sound('data\\sound\\new.wav')
53 bg_sound = pygame.mixer.Sound('data\\sound\\bg.ogg')
54 bg_sound.set_volume(0.1 * VOLUME)
55 bg_sound.play(-1)
56 new_sound.set_volume(0.1 * VOLUME)
57
58
59 balls = []
60 BALL_R = 30
61 BALL_COLORS = [(255,165,0),(255,0,0),(135,206,235),(178,34,34),(34,139,34)]
62 BALL_POINTS = [[40, 40],[40, 300],[400, 200],[150, 150],[80, 400]]
63 BALL_VELOCITY = [[1.5, 1.2],[1.4, -1.3],[-1.5, -1.1],[-1.2, 1.5],[1.3, 1.1]]
64
65 VOLUME_POINTS = []
66 VOLUME_POINTS_START = []
67 VOLUME_RECT_COLORS = []
68 for p in range(170, 250, 7):
69 VOLUME_POINTS.append([SCREEN_WIDTH - p,SCREEN_HEIGHT + 20])
70 for ps in range(175, 250, 7):
71 VOLUME_POINTS_START.append([SCREEN_WIDTH - ps, SCREEN_HEIGHT])
72 VOLUME_RECT_COLORS.append((randint(0, 255), randint(0, 255), randint(0, 255)))
73
74 for i in range(len(BALL_COLORS)):
75 screen.fill(SCREEN_DEFAULT_COLOR)
76 b = pygame.draw.circle(screen, BALL_COLORS[i], (int(BALL_POINTS[i][0]),int(BALL_POINTS[i][1])), BALL_R)
77 balls.append(b)
78
79 while 1:
80 for event in pygame.event.get():
81 if event.type == QUIT:
82 bg_sound.stop()
83 exit()
84 elif event.type == KEYDOWN:
85 if event.key == K_UP:
86 SPEED += 0.1
87 elif event.key == K_DOWN:
88 SPEED -= 0.1
89 elif event.key == K_LEFT:
90 if VOLUME > 0:
91 VOLUME -= 1
92 elif event.key == K_RIGHT:
93 if VOLUME <= 9:
94 VOLUME += 1
95 elif event.key == K_f:
96 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, FULLSCREEN, 32)
97 elif event.key == 27:
98 pygame.display.set_mode(SCREEN_DEFAULT_SIZE, 0, 32)
99 elif event.type == MOUSEBUTTONDOWN:
100 pressed_array = pygame.mouse.get_pressed()
101 for index in range(len(pressed_array)):
102 if pressed_array[index]:
103 if index == 0:
104 new_sound.play(-1)
105 c_color = (randint(0, 255), randint(0, 255), randint(0, 255))
106 x, y = (BALL_R+1, BALL_R+1)
107 c_r = randint(10, 100)
108 c_v = [randint(11, 19)* 0.1, randint(11, 19) * 0.1]
109 c = pygame.draw.circle(screen, c_color, (x, y), BALL_R)
110 BALL_COLORS.append(c_color)
111 BALL_POINTS.append([x, y])
112 BALL_VELOCITY.append(c_v)
113 balls.append(c)
114 elif index == 2:
115 if len(balls) > 1:
116 balls.pop(0)
117 BALL_COLORS.pop(0)
118 BALL_POINTS.pop(0)
119 BALL_VELOCITY.pop(0)
120 elif event.type == MOUSEBUTTONUP:
121 new_sound.stop()
122
123 #print(balls)
124 for i in range(len(balls)):
125 screen.blit(bg, (-300, -100))
126 #screen.fill(SCREEN_DEFAULT_COLOR)
127 for n in range(len(balls)):
128 pygame.draw.circle(screen, BALL_COLORS[n], (int(BALL_POINTS[n][0]),int(BALL_POINTS[n][1])), BALL_R)
129 if ((((BALL_POINTS[i][0] - BALL_R) < 0) or ((BALL_POINTS[i][0] + BALL_R) > SCREEN_WIDTH))):
130 BALL_VELOCITY[i][0] = -1 * BALL_VELOCITY[i][0]
131 if ((((BALL_POINTS[i][1] - BALL_R) < 0) or ((BALL_POINTS[i][1] + BALL_R) > SCREEN_HEIGHT))):
132 BALL_VELOCITY[i][1] = -1 * BALL_VELOCITY[i][1]
133
134 for j in range(len(balls)):
135 for k in range(len(balls)):
136 b_x = (BALL_POINTS[j][0] - BALL_POINTS[k][0])**2
137 b_y = (BALL_POINTS[j][1] - BALL_POINTS[k][1])**2
138 b_r =(BALL_R*2)**2
139 if (round((b_x + b_y), 2) <= round(b_r, 2)):
140 temp_x = BALL_VELOCITY[j][0]
141 temp_y = BALL_VELOCITY[j][1]
142 BALL_VELOCITY[j][0] = BALL_VELOCITY[k][0]
143 BALL_VELOCITY[j][1] = BALL_VELOCITY[k][1]
144 BALL_VELOCITY[k][0] = temp_x
145 BALL_VELOCITY[k][1] = temp_y
146
147 BALL_POINTS[j][0] += round(SPEED, 1) * BALL_VELOCITY[j][0]
148 BALL_POINTS[j][1] += round(SPEED, 1) * BALL_VELOCITY[j][1]
149
150 pygame.draw.line(screen, (165,42,42),(0, SCREEN_HEIGHT), (SCREEN_WIDTH,SCREEN_HEIGHT))
151 bg_sound.set_volume(0.1 * VOLUME)
152 new_sound.set_volume(0.1 * VOLUME)
153 pygame.draw.rect(screen,
154 (255, 255, 255),
155 Rect((VOLUME_POINTS_START[-1][0],
156 VOLUME_POINTS_START[-1][1]),
157 (VOLUME_POINTS[-10][0] - VOLUME_POINTS_START[-1][0],
158 20)))
159 for v in range(VOLUME+1):
160 if v > 0:
161 pygame.draw.rect(screen,
162 VOLUME_RECT_COLORS[v],
163 Rect((VOLUME_POINTS_START[-v][0],
164 VOLUME_POINTS_START[-v][1]),
165 (VOLUME_POINTS[-v][0] - VOLUME_POINTS_START[-v][0],
166 20)))
167
168 game_info = 'Balls: ' + str(len(balls)) + ' Speed: ' + str(round(SPEED, 2)) + ' LastBall: ' + str(round(BALL_POINTS[-1][0])) + ',' + str(round(BALL_POINTS[-1][1]))
169 text = font.render(game_info, True, (255,255,255))
170 author_info = font.render('hongtenzone@foxmail.com', True, (255,255,255))
171 volume_text = font.render('Volume: ' + str(VOLUME), True, (255, 255, 255))
172 screen.blit(text, (0, SCREEN_HEIGHT+5))
173 screen.blit(author_info, (SCREEN_WIDTH - 160, SCREEN_HEIGHT+5))
174 screen.blit(volume_text, (SCREEN_WIDTH - 310, SCREEN_HEIGHT+5))
175 pygame.display.update()

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

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

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

    之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...

  2. pygame系列_箭刺Elephant游戏

    这个游戏原名为:Chimp,我们可以到: http://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html 获取到源码和详细的源码讲解 下面是我对游戏 ...

  3. pygame系列_箭刺Elephant游戏_源码下载

    这个游戏原名为:Chimp,我们可以到: http://www.pygame.org/docs/tut/chimp/ChimpLineByLine.html 获取到源码和详细的源码讲解 下面是我对游戏 ...

  4. pygame系列_原创百度随心听音乐播放器_完整版

    程序名:PyMusic 解释:pygame+music 之前发布了自己写的小程序:百度随心听音乐播放器的一些效果图 你可以去到这里再次看看效果: pygame系列_百度随心听_完美的UI设计 这个程序 ...

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

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

  6. python开发_tkinter_小球完全弹性碰撞游戏

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

  7. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  8. pygame系列_游戏窗口显示策略

    在这篇blog中,我将给出一个demo演示: 当我们按下键盘的‘f’键的时候,演示的窗口会切换到全屏显示和默认显示两种显示模式 并且在后台我们可以看到相关的信息输出: 上面给出了一个简单的例子,当然在 ...

  9. pygame系列_弹力球

    这是pygame写的弹力球 运行效果: ======================================================== 代码部分: ================= ...

随机推荐

  1. Linux版EPUB阅读器

    Linux版EPUB阅读器 如果说用平板电脑看书尚属主流的话,那么在电脑上读书就非常少见了.专注阅读16世纪的书是非常困难的了,没人希望后台蹦出QQ聊天窗口.但是如果你非要在电脑上打开电子书的话,那么 ...

  2. hdu 4714 Tree2cycle dp

    用树形dp做的,dp[t][i]表示t及其孩子入度都已经小于等于2并且t这个节点的入度等于i的最优解. 那么转移什么的自己想想就能明白了. 关键在于这个题目会暴栈,所以我用了一次bfs搜索出节点的顺序 ...

  3. [置顶] Codeforces 70D 动态凸包 (极角排序 or 水平序)

    题目链接:http://codeforces.com/problemset/problem/70/D 本题关键:在log(n)的复杂度内判断点在凸包 或 把点插入凸包 判断:平衡树log(n)内选出点 ...

  4. iOS:获取图片Alpha图片

    -(void)createImages { // Load the alpha image, which is just the same Ship.png image used in the cli ...

  5. 汉字转拼音再转ASCII

    汉字能够转成拼音.能够在转成ASCII码,然后就能够转成十六进制数,再就能够转成0和1组成的二进制帧了! 比方说: 我爱你 -> wo ai ni -> 119 111 32 97 105 ...

  6. App 运营 推广相关

    基本要素 1.定位和产品 2.取个好名字,一目了然+下载冲动 3.设计一个好图标,有感性和直观的认识 4.做好产品的说明.关键字,截图(前1-2行是重点) 5.做市场的排名(相关因素如下)   (1) ...

  7. rsync Backups for Windows

    Transfer your Windows Backups to an rsync server over SSH rsync.net provides cloud storage for offsi ...

  8. H面试程序(4):翻转句子中单词的顺序 .

    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“stude ...

  9. Core Animation之框架简介(一)

    Core Animation之框架简介(一) 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明 ...

  10. Delphi主窗口任务栏菜单的问题(转发WM_SYSCOMMAND到Application)

    Delphi的VCL框架在创建应用时TApplication是一个自动创建的隐藏窗口,其它创建的窗口是自动以该窗口为窗口,这就导致创始的主窗口在任务栏的系统菜单只有三项,只要在主窗口的Create事件 ...