1
+ import os , sys
2
+ import pygame
3
+ from pygame .locals import *
4
+
5
+ if not pygame .font : print ('Warning, fonts disabled' )
6
+ if not pygame .mixer : print ('Warning, sound disabled' )
7
+
8
+ def load_image (name , colorkey = None ):
9
+ fullname = os .path .join ('chimp_data' , name )
10
+ try :
11
+ image = pygame .image .load (fullname )
12
+ except pygame .error as message :
13
+ print ('Cannot load image:' , name )
14
+ raise SystemExit (message )
15
+ image = image .convert ()
16
+ if colorkey is not None :
17
+ if colorkey is - 1 :
18
+ colorkey = image .get_at ((0 , 0 ))
19
+ image .set_colorkey (colorkey , RLEACCEL )
20
+ return image , image .get_rect ()
21
+
22
+ def load_sound (name ):
23
+ class NoneSound :
24
+ def play (self ): pass
25
+ if not pygame .mixer :
26
+ return NoneSound ()
27
+ fullname = os .path .join ('chimp_data' , name )
28
+ print (fullname )
29
+ try :
30
+ sound = pygame .mixer .Sound (fullname )
31
+ except pygame .error as message :
32
+ print ('Cannot load sound:' , fullname )
33
+ raise SystemExit (message )
34
+ return sound
35
+
36
+ class Fist (pygame .sprite .Sprite ):
37
+ """moves a clenched fist on the screen, following the mouse"""
38
+ def __init__ (self ):
39
+ pygame .sprite .Sprite .__init__ (self ) # call Sprite initializer
40
+ self .image , self .rect = load_image ('fist.bmp' , - 1 )
41
+ self .punching = 0
42
+
43
+ def update (self ):
44
+ """move the fist based on the mouse position"""
45
+ pos = pygame .mouse .get_pos ()
46
+ self .rect .midtop = pos
47
+ if self .punching :
48
+ self .rect .move_ip (5 , 10 )
49
+
50
+ def punch (self , target ):
51
+ """returns true if the fist collides with the target"""
52
+ if not self .punching :
53
+ self .punching = 1
54
+ hitbox = self .rect .inflate (- 5 , - 5 )
55
+ return hitbox .colliderect (target .rect )
56
+
57
+ def unpunch (self ):
58
+ """called to pull the fist back"""
59
+ self .punching = 0
60
+
61
+ class Chimp (pygame .sprite .Sprite ):
62
+ """moves a monkey critter across the screen. it can spin the
63
+ monkey when it is punched."""
64
+ def __init__ (self ):
65
+ pygame .sprite .Sprite .__init__ (self ) # call Sprite intializer
66
+ self .image , self .rect = load_image ('chimp.bmp' , - 1 )
67
+ screen = pygame .display .get_surface ()
68
+ self .area = screen .get_rect ()
69
+ self .rect .topleft = 60 , 10
70
+ self .move = 5
71
+ self .dizzy = 0
72
+
73
+ def update (self ):
74
+ """walk or spin, depending on the monkeys state"""
75
+ if self .dizzy :
76
+ self ._spin ()
77
+ else :
78
+ self ._walk ()
79
+ pass
80
+
81
+ def _walk (self ):
82
+ """move the monkey across the screen, and turn at the ends"""
83
+ newpos = self .rect .move ((self .move , 0 ))
84
+ if not self .area .contains (newpos ):
85
+ self .move = - self .move
86
+ newpos = self .rect .move ((self .move , 0 ))
87
+ self .image = pygame .transform .flip (self .image , 1 , 0 )
88
+ self .rect = newpos
89
+
90
+ def _spin (self ):
91
+ """spin the monkey image"""
92
+ center = self .rect .center
93
+ self .dizzy += 12
94
+ if self .dizzy >= 360 :
95
+ self .dizzy = 0
96
+ self .image = self .original
97
+ else :
98
+ rotate = pygame .transform .rotate
99
+ self .image = rotate (self .original , self .dizzy )
100
+ self .rect = self .image .get_rect (center = center )
101
+
102
+ def punched (self ):
103
+ """this will cause the monkey to start spinning"""
104
+ if not self .dizzy :
105
+ self .dizzy = 1
106
+ self .original = self .image
107
+
108
+ def main ():
109
+ pygame .init ()
110
+ screen = pygame .display .set_mode ((468 , 90 ))
111
+ pygame .display .set_caption ('Monkey Fever' )
112
+ pygame .mouse .set_visible (0 )
113
+
114
+ background = pygame .Surface (screen .get_size ())
115
+ background = background .convert ()
116
+ background .fill ((250 , 250 , 250 ))
117
+
118
+ if pygame .font :
119
+ font = pygame .font .SysFont ('SimHei' ,24 )
120
+
121
+ whiff_sound = load_sound ('whiff.wav' )
122
+ punch_sound = load_sound ('punch.wav' )
123
+ chimp = Chimp ()
124
+ fist = Fist ()
125
+ allsprites = pygame .sprite .Group ((fist , chimp ))
126
+ clock = pygame .time .Clock ()
127
+ punchcount = 0
128
+ hitcount = 0
129
+
130
+ while 1 :
131
+ clock .tick (60 )
132
+ for event in pygame .event .get ():
133
+ if event .type == QUIT :
134
+ return
135
+ elif event .type == KEYDOWN and event .key == K_ESCAPE :
136
+ return
137
+ elif event .type == MOUSEBUTTONDOWN :
138
+ punchcount += 1
139
+ if fist .punch (chimp ):
140
+ punch_sound .play () # punch
141
+ chimp .punched ()
142
+ hitcount += 1
143
+ else :
144
+ whiff_sound .play () # miss
145
+ pass
146
+ elif event .type == MOUSEBUTTONUP :
147
+ fist .unpunch ()
148
+ bg = background .copy ()
149
+ if punchcount > 0 :
150
+ msg = "打中次数: %d 击中率: %d%s" % (hitcount , round ((hitcount / punchcount )* 100 ), "%" )
151
+ else :
152
+ msg = "挥舞拳头吧!"
153
+ text = font .render (msg , 1 , (10 , 10 , 10 ))
154
+ textpos = text .get_rect (centerx = background .get_width ()/ 2 )
155
+ bg .blit (text , textpos )
156
+
157
+ allsprites .update ()
158
+ screen .blit (bg , (0 , 0 ))
159
+ allsprites .draw (screen )
160
+ pygame .display .flip ()
161
+
162
+ if __name__ == "__main__" :
163
+ main ()
0 commit comments