Breakout RaspberryPi
This instructable is video game of breakout on RaspberryPi.
It is easy to make this video game.
Let's make and fun!!
Materials
1. RaspberryPi (I used RasberryPi rev2)
※include keyboard,mause,monitor,SDcard
2. Tact switch × 4
3. Electrical resistor × 4
4. Some jumper wires
5. Breadboard
Making Controllor
Firstly,you will make a controllor of this video game.
There are 4 buttons to operate video game in this controllor.
Please prepare breadboard,tactswiches,electrical resistores, and some jumperwires.
This is a circuit diagram.
Programing
Next is programing of breakout.
1. Start up RaspberryPi and IDLE(python 2.7)
2. Copy and paste this code.
<p>import RPi.GPIO as GPIO<br>import pygame from pygame.locals import* from sys import exit import time</p><p>class blockC(object):</p><p> def __init__(self,name,image,pos):</p><p> self.name = name self.alive = True self.image =image self.speed = 0. self.location = pos</p><p> def render(self,surface):</p><p> if self.alive: x,y = self.location w,h = self.image.get_size() surface.blit(self.image,(x,y))</p><p> def hit(self): self.alive = False</p><p>pygame.init()</p><p>#Circle_picture radius=6 display = (radius*2,radius*2) color=(0,0,0) pos = (radius,radius)</p><p>screen=pygame.display.set_mode(display,0,32) screen.fill((255,255,255))</p><p>pygame.draw.circle(screen,color,pos,radius)</p><p>pygame.image.save(screen,"circle.bmp")</p><p>#board_picture height=6 length=80 color=(0,0,0)</p><p>screen=pygame.display.set_mode((length,height),0,32) screen.fill((color))</p><p>pygame.image.save(screen,"board.bmp")</p><p>#block_picture height=20 length=40 color=(0,0,0)</p><p>screen=pygame.display.set_mode((length,height),0,32) screen.fill((color))</p><p>pygame.image.save(screen,"block.bmp")</p><p>#picture board_image_filename ='board.bmp' circle_image_filename = 'circle.bmp' block_image_filename = 'block.bmp'</p><p>#GPIOsetup GPIO.setmode(GPIO.BCM) GPIO.setup(22, GPIO.IN) GPIO.setup(23, GPIO.IN) GPIO.setup(24, GPIO.IN) GPIO.setup(25, GPIO.IN)</p><p>#pygame,window,font,clock.etc window=pygame.display.set_mode((840,480)) pygame.display.set_caption("block_game") font = pygame.font.SysFont(None,80) font2 = pygame.font.SysFont(None,40)</p><p>board = pygame.image.load(board_image_filename).convert() circle= pygame.image.load(circle_image_filename).convert_alpha() block= pygame.image.load(block_image_filename).convert_alpha() end = font.render("GAME OVER",True,(0,0,255)) complete = font.render("Complete!!",True,(255,100,0)) start = font.render("Push the start button",True,(255,100,20)) point = font2.render("SCORE",True,(255,255,255)) again1 = font2.render("Push the restart button",True,(60,210,16)) again2 = font2.render("if you would like to play again.",True,(60,210,16))</p><p>clock = pygame.time.Clock()</p><p>#roop1 while 1: #board_init board_pos = 320.</p><p> #block_init blocks = {} block_pos_y = 30. i = 1 for num2 in range(1,6): block_pos_x = 45 for num in range(1,12): blocks[i] = blockC(i,block,(block_pos_x,block_pos_y)) i += 1 block_pos_x += 50 block_pos_y += 30 alive_blocks = len(blocks)</p><p> #start_init S = 1 score = 0</p><p> #cicle_init circle_pos_x,circle_pos_y = 0.,0. speed_x,speed_y = 0.,0.</p><p> #roop2 while alive_blocks >= 1: for event in pygame.event.get(): if event.type == QUIT: exit()</p><p> #board if GPIO.input(22): board_pos += 10. elif GPIO.input(23): board_pos -= 10. if board_pos > 560: board_pos = 560. elif board_pos < 0: board_pos = 0.</p><p> #circle time_passed = clock.tick(40) time_passed_seconds = time_passed / 1000.0 circle_pos_x += speed_x * time_passed_seconds circle_pos_y += speed_y * time_passed_seconds if circle_pos_x > 640 - circle.get_width(): speed_x = -speed_x circle_pos_x = 640 - circle.get_width() elif circle_pos_x < 0: speed_x = -speed_x circle_pos_x = 0. if circle_pos_y > 480 - circle.get_height(): break elif circle_pos_y < 0: speed_y = -speed_y circle_pos_y = 0.</p><p> #start if S: circle_pos_x,circle_pos_y = (board_pos+(board.get_width()/2)-5),430. speed_x,speed_y = 0.,0. if GPIO.input(24): S=0 speed_x,speed_y = 1.,-170. else: #refrect_circle_board if 440<=(circle_pos_y+circle.get_height())<=446: if (board_pos-circle.get_width()/2) <= circle_pos_x < (board_pos+16) or (board_pos+64) < circle_pos_x <= (board_pos+board.get_width()-circle.get_width()/2): speed_x = (speed_x/abs(speed_x))*193 speed_y = -200 elif (board_pos+16) <= circle_pos_x < (board_pos+32) or (board_pos+48) < circle_pos_x <= (board_pos+64): speed_x = (speed_x/abs(speed_x))*173 speed_y = -170 elif (board_pos+32) <= circle_pos_x <= (board_pos+48): speed_x = (speed_x/abs(speed_x))*133 speed_y = -170</p><p> #reflect_circle_block and delete offset = 3 for k in range(1,56): if blocks[k].alive: x,y = blocks[k].location if (x-offset) < (circle_pos_x+circle.get_width()) < (x+offset) and (circle_pos_y-block.get_height()-offset)</p><p> #display window.fill(pygame.Color(255,255,255)) pygame.draw.rect(window,(0,0,0),(640,0,200,480)) window.blit(point,(690,200)) score2 = font2.render("%i"%(score),True,(255,255,255)) window.blit(score2,(690,250)) window.blit(circle,(circle_pos_x,circle_pos_y)) window.blit(board,(board_pos,440)) if S: window.blit(start,(40,200)) for k in range(1,56): blocks[k].render(window) pygame.display.update()</p><p> #result while not GPIO.input(25): if alive_blocks >= 1: window.blit(end,(150,200)) else: window.blit(complete,(180,200)) window.blit(again1,(50,300)) window.blit(again2,(200,350)) pygame.display.update()</p>
Run and Fun!!
Please run that code.
How to play this video game:
Pin 22: Right button
Pin 23:Left button
Pin 24:Start button
Pin 25:Restart button
This is my website: lumenbolk.com
That's all. Thank you.