ベイビーバンバンコマンド


ドラマ『3人のパパ』

昔見た『Three Men and a Baby』(1987)
と似てますが、次回予告を見る限り似てるのは1話だけっぽいです。赤ちゃんかわいいですねえ。

babyに関するコマンドがないかなあと思いaptで探してみました。

takk@deb8:~$ apt-cache search baby
dvdrip-queue - queue up dvd::rip projects
bambam - keyboard mashing and doodling game for babies
dictconv - convert a dictionary file type in another dictionary file type
guitarix - Rock guitar amplifier for Jack
ospics - Some images of operating system logos/mascots
goldendict - 機能豊富な辞書検索プログラム
takk@deb8:~$ 

こんなコマンドが見つかりました。
bambam – keyboard mashing and doodling game for babies
さっそくインストールして起動。

takk@deb8:~$ sudo apt-get install bambam

(snip)

takk@deb8:~$ bambam


ん〜。何でしょう。

でも、きっと、自分が赤ちゃんなら面白いゲームに違いありません。
ゲームは赤ちゃん向けでも、ソースは大人向けです。ソースを見てみます。

takk@deb8:~$ cd bambam-0.5+dfsg/
takk@deb8:~/bambam-0.5+dfsg$ ls
COPYING  README  bambam.6  bambam.py  data  debian  docs  extrasounds  icon.gif
takk@deb8:~/bambam-0.5+dfsg$ wc -l bambam.py
227 bambam.py
takk@deb8:~/bambam-0.5+dfsg$ 

ソースの量も少ないので、全文見てみます。

takk@deb8:~/bambam-0.5+dfsg$ cat -n bambam.py
     1	#!/usr/bin/env python
     2	#Copyright (C) 2007-2008 Don Brown 2010 Spike Burch <spikeb@gmail.com>
     3	#    This program is free software: you can redistribute it and/or modify
     4	#    it under the terms of the GNU General Public License as published by
     5	#    the Free Software Foundation, either version 3 of the License, or
     6	#    (at your option) any later version.
     7	#
     8	#    This program is distributed in the hope that it will be useful,
     9	#    but WITHOUT ANY WARRANTY; without even the implied warranty of
    10	#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11	#    GNU General Public License for more details.
    12	#
    13	#    You should have received a copy of the GNU General Public License
    14	#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15	
    16	import pygame, sys,os, random, string, glob
    17	import argparse
    18	import fnmatch
    19	from pygame.locals import * 
    20	
    21	# draw filled circle at mouse position
    22	def draw_dot():
    23	    r = 30
    24	    mousex, mousey = pygame.mouse.get_pos()
    25	    
    26	    dot = pygame.Surface((2 * r, 2 * r))
    27	    pygame.draw.circle(dot, get_color(), (r, r), r, 0)
    28	    dot.set_colorkey(0, pygame.RLEACCEL)
    29	    
    30	    screen.blit(dot, (mousex - r, mousey - r))
    31	
    32	
    33	# Return bright color varying over time
    34	def get_color():
    35	    col = Color('white');
    36	    
    37	    hue = pygame.time.get_ticks() / 50 % 360
    38	    col.hsva = (hue, 100, 100, 50)
    39	    
    40	    return Color(col.r, col.g, col.b)
    41	
    42	
    43	# Load image/, handling setting of the transparency color key
    44	def load_image(fullname, colorkey = None):
    45	    try:
    46	        image = pygame.image.load(fullname)
    47	    except pygame.error, message:
    48	        print "Cannot load image:", fullname
    49	        raise SystemExit, message
    50	    image = image.convert()
    51	    if colorkey is not None:
    52	        if colorkey is -1:
    53	            colorkey = image.get_at((0, 0))
    54	        image.set_colorkey(colorkey, RLEACCEL)
    55	    return image
    56	
    57	
    58	# Load sound file in data/
    59	def load_sound(name):
    60	    class NoneSound:
    61	        def play(self): pass
    62	    if not pygame.mixer:
    63	        return NoneSound()
    64	    try:
    65	        sound = pygame.mixer.Sound(name)
    66	    except pygame.error, message:
    67	        print "Cannot load sound:", name
    68	        raise SystemExit, message
    69	    return sound
    70	
    71	
    72	# Loads a list of sounds
    73	def load_sounds(lst):
    74	    result = []
    75	    global args
    76	    for name in lst:
    77	        if True in [fnmatch.fnmatch(name, p) for p in args.sound_blacklist]:
    78	            print "Skipping blacklisted sound:", name
    79	        else:
    80	            result.append(load_sound(name))
    81	    return result
    82	
    83	
    84	# Processes events
    85	def input(events, quit_pos):
    86	    global sequence, mouse_down, sound_muted
    87	    for event in events: 
    88	        if event.type == QUIT: 
    89	            sys.exit(0)
    90	        
    91	        # handle keydown event     
    92	        elif event.type == KEYDOWN:
    93	            # check for words like quit
    94	            if event.type == KEYDOWN:
    95	                if is_alpha(event.key):
    96	                    sequence += chr(event.key)
    97	                    if sequence.find('quit') > -1:
    98	                        sys.exit(0)
    99	                    elif sequence.find('unmute') > -1:
   100	                        sound_muted = False
   101	                        #pygame.mixer.unpause()
   102	                        sequence = ''
   103	                    elif sequence.find('mute') > -1:
   104	                        sound_muted = True
   105	                        pygame.mixer.fadeout(1000)
   106	                        sequence = ''
   107	            
   108	            # Clear the background 10% of the time
   109	            if random.randint(0, 10) == 1:
   110	                screen.blit(background, (0, 0))
   111	                pygame.display.flip()
   112	            
   113	            # play random sound
   114	            if not sound_muted:
   115	               sounds[random.randint(0, len(sounds) - 1)].play()
   116	            
   117	            # show images 
   118	            if is_alpha(event.key):
   119	                print_letter(event.key)
   120	            else:
   121	                print_image()
   122	            pygame.display.flip()
   123	            
   124	        # mouse motion
   125	        elif event.type == MOUSEMOTION :
   126	            if mouse_down:
   127	                draw_dot()
   128	                pygame.display.flip()
   129	        
   130	        # mouse button down
   131	        elif event.type == MOUSEBUTTONDOWN:
   132	            draw_dot()
   133	            mouse_down = True
   134	            pygame.display.flip()
   135	
   136	        # mouse button up
   137	        elif event.type == MOUSEBUTTONUP:
   138	            mouse_down = False
   139	        
   140	    return quit_pos
   141	
   142	
   143	# Prints an image at a random location
   144	def print_image():
   145	    #global swidth, sheigh
   146	    img = images[random.randint(0, len(images) - 1)]
   147	    w = random.randint(0, swidth  - img.get_width())
   148	    h = random.randint(0, sheight - img.get_height())
   149	    screen.blit(img, (w, h))
   150	
   151	# Is the key that was pressed alphanumeric
   152	def is_alpha(key):
   153	    return key < 255 and (chr(key) in string.letters or chr(key) in string.digits)
   154	
   155	# Prints a letter at a random location
   156	def print_letter(key):
   157	    global args
   158	    font = pygame.font.Font(None, 256)
   159	    if args.uppercase:
   160	        char = chr(key).upper()
   161	    else:
   162	        char = chr(key)
   163	    text = font.render(char, 1, colors[random.randint(0, len(colors) - 1)])
   164	    textpos = text.get_rect()
   165	    center = (textpos.width / 2, textpos.height / 2)
   166	    w = random.randint(0 + center[0], swidth - center[0])
   167	    h = random.randint(0 + center[1], sheight - center[1])
   168	    textpos.centerx = w
   169	    textpos.centery = h
   170	    screen.blit(text, textpos) 
   171	
   172	# Main application
   173	#
   174	parser = argparse.ArgumentParser(description='A keyboard mashing game for babies.')
   175	parser.add_argument('-u', '--uppercase', action='store_true', help='Whether to show UPPER-CASE letters.')
   176	parser.add_argument('--sound_blacklist', action='append', default=[], help='List of sound filename patterns to never play.')
   177	args = parser.parse_args()
   178	
   179	if not pygame.font: print 'Warning, fonts disabled'
   180	if not pygame.mixer: print 'Warning, sound disabled'
   181	 
   182	pygame.init()
   183	
   184	# figure out the install base to use with image and sound loading
   185	progInstallBase = '/usr/share/bambam' 
   186	
   187	# swith to full screen at current screen resolution 
   188	window = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
   189	
   190	# determine display resolution
   191	displayinfo = pygame.display.Info()
   192	swidth = displayinfo.current_w
   193	sheight = displayinfo.current_h
   194	
   195	pygame.display.set_caption('Bam Bam') 
   196	screen = pygame.display.get_surface() 
   197	
   198	background = pygame.Surface(screen.get_size())
   199	background = background.convert()
   200	background.fill((250, 250, 250))
   201	sequence = ""
   202	screen.blit(background, (0, 0))
   203	pygame.display.flip()
   204	
   205	mouse_down = False
   206	sound_muted = False
   207	
   208	def glob_data(pattern):
   209	    return glob.glob(os.path.join(progInstallBase, 'data', pattern))
   210	
   211	sounds = load_sounds(glob_data('*.wav'))
   212	
   213	colors = ((  0,   0, 255), (255,   0,   0), (255, 255,   0), 
   214	          (255,   0, 128), (  0,   0, 128), (  0, 255,   0), 
   215	          (255, 128,   0), (255,   0, 255), (  0, 255, 255)
   216	)
   217	
   218	images = [load_image(glob_data('chimp.bmp')[0], -1)]
   219	images.extend([load_image(name) for name in glob_data('*.gif')])
   220	
   221	quit_pos = 0
   222	
   223	clock = pygame.time.Clock()
   224	
   225	while True:
   226	    clock.tick(60)
   227	    quit_pos = input(pygame.event.get(), quit_pos)

pygame使っているんですね。
dataディレクトリに格納したgifファイルを使うので、自分で作った画像も使えるようです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA