Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- filename:gpio_rpi_python_truth.py
- Tell the Truth! game code
- written by Trevor Olsson & Matthew Wells
- © GPIO Support Services LTD MMXVII
- more info at www.gpio.co.uk/truth
- """
- from gpiozero import LED
- from time import sleep
- import random
- import pygame
- import time
- import sys
- import random
- import vlc
- import os
- pygame.init()
- pygame.font.init()
- font = pygame.font.SysFont("monospace",15)
- #font_large = pygame.font.SysFont("monospace",)
- displayInfo = pygame.display.Info()
- screen = pygame.display.set_mode((displayInfo.current_w,displayInfo.current_h),pygame.FULLSCREEN)
- #screen = pygame.display.set_mode((displayInfo.current_w,displayInfo.current_h))
- display_width,display_height = screen.get_size()
- font_large = pygame.font.SysFont("monospace",displayInfo.current_h/10)
- black = (0,0,0)
- white = (255,255,255)
- red = (255,0,0)
- green = (0,255,0)
- blue = (0,0,255)
- crashed = False
- OP_old = 0
- OP1 = LED(17) # A=0,B=0 in Truth Table
- OP2 = LED(18) # A=0,B=1 in Truth Table
- OP3 = LED(27) # A=1,B=0 in Truth Table
- OP4 = LED(22) # A=1,B=1 in Truth Table
- OP5 = LED(23)
- OP6 = LED(24)
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- # tables used to ensure Gibberish is not a real gate
- ANDg = [0,0,0,1]
- ORg = [0,1,1,1]
- NANDg = [1,1,1,0]
- NORg = [1,0,0,0]
- XORg = [0,1,1,0]
- XNORg = [1,0,0,1]
- # tables used to turn on lights
- AND = [OP4] # Lights required for AND list
- OR = [OP2, OP3, OP4] # Lights required for OR list
- NAND = [OP1, OP2, OP3] # Lights required for NAND list
- NOR = [OP1] # Lights required for NOR list
- XOR = [OP2,OP3]
- XNOR = [OP1,OP4]
- ALL= [OP1, OP2, OP3, OP4, OP5, OP6] # All lights list - used to turn all off
- score=0
- chances=10 # number of goes
- def getFinalScore(a,b,c):
- score = 0
- if b == 1:
- score = a/c+4
- if b == 2:
- score = a/c+2
- if b == 3:
- scpre = a/c+4
- scoreDisplay(score)
- writeScore(score)
- def writeScore(score):
- fHandler = open("Scores.txt", "r")
- fData = fHandler.readlines()
- fHandler.close()
- fHandler = open("Scores.txt", "w")
- fData.append(str(score)+"\n")
- fHandler.writelines(fData)
- fHandler.close()
- def quitF():
- pygame.quit()
- sys.exit()
- def AND_on():
- for light in AND:
- light.on()
- def OR_on():
- for light in OR:
- light.on()
- def NAND_on():
- for light in NAND:
- light.on()
- def NOR_on():
- for light in NOR:
- light.on()
- def XNOR_on():
- for light in XNOR:
- light.on()
- def XOR_on():
- for light in XOR:
- light.on()
- def Gibberish_on():
- tmp = True
- while tmp:
- attempt = [random.randrange(0,1),random.randrange(0,1),random.randrange(0,1),random.randrange(0,1)]
- if attempt != ANDg and attempt != ORg and attempt != NANDg and attempt != NORg and attempt != XNORg and attempt != XORg:
- tmp = False
- if attempt[0] == 1:
- OP1.on()
- if attempt[1] == 1:
- OP2.on()
- if attempt[2] == 1:
- OP3.on()
- if attempt[3] == 1:
- OP4.on()
- def ALL_off():
- for light in ALL:
- light.off()
- def ALL_on():
- for light in ALL:
- light.on()
- def lightsDefault():
- ALL_off()
- OP5.on()
- OP6.off()
- def correctFlash(gate):
- player = play('correct.mp3')
- running = True
- while running:
- randomLight = random.randint(1,6)
- randomStatus = random.randint(1,2)
- if randomLight == 1:
- if randomStatus == 1:
- OP1.on()
- elif randomStatus == 2:
- OP1.off()
- elif randomLight == 2:
- if randomStatus == 1:
- OP2.on()
- elif randomStatus == 2:
- OP2.off()
- elif randomLight == 3:
- if randomStatus == 1:
- OP3.on()
- elif randomStatus == 2:
- OP3.off()
- elif randomLight == 4:
- if randomStatus == 1:
- OP4.on()
- elif randomStatus == 2:
- OP4.off()
- elif randomLight == 5:
- if randomStatus == 1:
- OP5.on()
- elif randomStatus == 2:
- OP5.off()
- elif randomLight == 6:
- if randomStatus == 1:
- OP6.on()
- elif randomStatus == 2:
- OP6.off()
- #strText = "Correct!!"
- #text = font_large.render(strText, 1, black)
- text2 = font_large.render(gate, 1, black)
- screen.fill(green)
- #screen.blit(text, (display_width/2-len(strText), display_height/2))
- screen.blit(text2,(display_width/2-len(gate),display_height/2))
- playing = set([1,2,3,4])
- state = player.get_state()
- pygame.display.update()
- pygame.event.clear()
- if state not in playing:
- running = False
- sleep(.1)
- ALL_off()
- def wrongFlash():
- player = play('wrong.mp3')
- running = True
- while running:
- for i in range(1,3):
- ALL_on()
- sleep(0.1)
- ALL_off()
- sleep(0.1)
- strText = "Incorrect!!"
- text = font_large.render(strText, 1, black)
- screen.fill(red)
- screen.blit(text, (display_width/2-len(strText), display_height/2))
- playing = set([1,2,3,4])
- state = player.get_state()
- pygame.display.update()
- pygame.event.clear()
- if state not in playing:
- running = False
- def correct(gate):
- correctFlash(gate)
- def wrong():
- wrongFlash()
- def waitF(wait):
- i = 0
- broken = 0
- global INA
- global INB
- global INC
- global IND
- startTime = time.time()
- while broken == 0:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- crashed = True
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE:
- quitF()
- if event.key == pygame.K_LEFT:
- #print('left')
- INA = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_RIGHT:
- #print('right')
- INB = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_UP:
- #print('up')
- INC = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_DOWN:
- #print('down')
- IND = 1
- pygame.event.clear()
- broken = 1
- timeSinceStart = time.time()-startTime
- timeRemaining = wait - timeSinceStart
- strText = "Time Remaining: " +format(timeRemaining,'.2f')+"S"
- strText1 = "Tries Remaining: "+str(chances)
- text = font_large.render(strText, 1, black)
- text1= font_large.render(strText1, 1, black)
- screen.fill(white)
- screen.blit(text, (0 , display_height/2))
- screen.blit(text1, (0 , display_height/2-64))
- pygame.display.update()
- #has time passed yet?
- if time.time()-startTime >= wait:
- broken = 1
- def waitF2(wait):
- i = 0
- broken = 0
- global INA
- global INB
- global INC
- global IND
- global INE
- global INF
- startTime = time.time()
- while broken == 0:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- crashed = True
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE:
- quitF()
- if event.key == pygame.K_LEFT:
- #print('left')
- INA = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_RIGHT:
- #print('right')
- INB = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_UP:
- #print('up')
- INC = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_DOWN:
- #print('down')
- IND = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_SPACE:
- INE = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_w:
- INF = 1
- pygame.event.clear()
- broken = 1
- timeSinceStart = time.time()-startTime
- timeRemaining = wait - timeSinceStart
- strText = "Time Remaining: " +format(timeRemaining,'.2f')+"S"
- strText1 = "Tries Remaining: "+str(chances)
- text = font_large.render(strText, 1, black)
- text1= font_large.render(strText1, 1, black)
- screen.fill(white)
- screen.blit(text, (0 , display_height/2))
- screen.blit(text1, (0 , display_height/2-64))
- pygame.display.update()
- #has time passed yet?
- if time.time()-startTime >= wait:
- broken = 1
- def waitF3(wait):
- i = 0
- broken = 0
- global INA
- global INB
- global INC
- global IND
- global INE
- global INF
- global ING
- startTime = time.time()
- while broken == 0:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- crashed = True
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE:
- quitF()
- if event.key == pygame.K_LEFT:
- #print('left')
- INA = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_RIGHT:
- #print('right')
- INB = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_UP:
- #print('up')
- INC = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_DOWN:
- #print('down')
- IND = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_SPACE:
- INE = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_w:
- INF = 1
- pygame.event.clear()
- broken = 1
- elif event.key == pygame.K_a:
- ING = 1
- pygame.event.clear()
- broken = 1
- timeSinceStart = time.time()-startTime
- timeRemaining = wait - timeSinceStart
- strText = "Time Remaining: " +format(timeRemaining,'.2f')+"S"
- strText1 = "Tries Remaining: "+str(chances)
- text = font_large.render(strText, 1, black)
- text1= font_large.render(strText1, 1, black)
- screen.fill(white)
- screen.blit(text, (0 , display_height/2))
- screen.blit(text1, (0 , display_height/2-64))
- pygame.display.update()
- #has time passed yet?
- if time.time()-startTime >= wait:
- broken = 1
- def inputTimeG():
- running = True
- num = 1
- confirm = 0
- while running:
- for event in pygame.event.get():
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE:
- quitF()
- if event.key == pygame.K_LEFT:
- pass
- elif event.key == pygame.K_RIGHT:
- pass
- elif event.key == pygame.K_UP:
- num = num+1
- elif event.key == pygame.K_DOWN:
- confirm = 1
- if num > 9:
- num = 1
- if confirm == 1:
- return(num)
- running = False
- strText = "How many seconds do you need to think about this?"
- strText2 = "1 to 9 Seconds (Press Up to cycle number, down to confirm): "+str(num)
- text = font.render(strText, 1, black)
- text2 = font.render(strText2, 1, black)
- screen.fill(white)
- screen.blit(text, (len(strText) , display_height/2))
- screen.blit(text2, (len(strText2), display_height/2+32))
- pygame.display.update()
- screen.fill(white)
- pygame.display.update()
- def play(filename):
- vlcI = vlc.Instance()
- player = vlcI.media_player_new()
- media = vlcI.media_new(filename)
- player.set_media(media)
- player.play()
- playing = set([1,2,3,4])
- sleep(0.25)
- return player
- def restart():
- os.system('bash restart_code.sh &')
- quitF()
- def scoreDisplay(PScore):
- while True:
- for event in pygame.event.get():
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_ESCAPE:
- quitF()
- if event.key == pygame.K_LEFT:
- restart()
- elif event.key == pygame.K_RIGHT:
- restart()
- elif event.key == pygame.K_UP:
- restart()
- elif event.key == pygame.K_DOWN:
- restart()
- elif event.key == pygame.K_SPACE:
- restart()
- elif event.key == pygame.K_w:
- restart()
- elif event.key == pygame.K_e:
- restart()
- strText = "Touch Any Fruit To Continue"
- strText2 = "Your Final Score Was: "+str(PScore)
- text = font.render(strText, 1, black)
- text2 = font.render(strText2, 1, black)
- screen.fill(white)
- screen.blit(text, (len(strText) , display_height/2))
- screen.blit(text2, (len(strText2), display_height/2+32))
- pygame.display.update()
- def gameLoopDifficultyOne(wait):
- print('1')
- global chances
- global OP_old
- global INA
- global INB
- global INC
- global IND
- global score
- while True:
- lightsDefault()
- chances=chances-1
- #print("You have",chances,"chances left")
- #OP= random.randint(1, 4)
- OP = 1
- while OP == OP_old:
- OP= random.randint(1, 8)
- #print(OP)
- OP_old = OP
- if OP==1 or OP==5: # For an AND column
- AND_on()
- waitF(wait)
- if INA != 0:
- correct('and')
- score=score+10
- sleep(.25)
- INA = 0
- elif INB == 1 or INC == 1 or IND == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- wrong()
- elif OP==2 or OP==6: # For an OR column
- OR_on()
- waitF(wait)
- if INB != 0:
- correct('OR')
- score=score+10
- sleep(.25)
- INB = 0
- elif INA == 1 or INC == 1 or IND == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- wrong()
- elif OP==3 or OP==7: # For a NAND column
- NAND_on()
- waitF(wait)
- if INC !=0:
- correct('NAND')
- score=score+10
- sleep(.25)
- INC = 0
- elif INA == 1 or INB == 1 or IND == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- wrong()
- elif OP==4 or OP==8:# For a NOR column
- NOR_on()
- waitF(wait)
- if IND !=0:
- correct('NOR')
- score=score+10
- sleep(.25)
- IND = 0
- elif INA == 1 or INB == 1 or INC == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- wrong()
- if chances==0:
- getFinalScore(score,1,wait)
- print ("Your Final Score is:", score/wait, ", Game Over")
- ALL_off()
- break
- screen.fill(white)
- pygame.display.update()
- def gameLoopDifficultyTwo(wait):
- print('2')
- global chances
- global OP_old
- global INA
- global INB
- global INC
- global IND
- global INE
- global INF
- global score
- while True:
- lightsDefault()
- chances=chances-1
- #print("You have",chances,"chances left")
- OP= random.randint(1, 6)
- #OP = 1
- while OP == OP_old:
- OP= random.randint(1, 6)
- #print(OP)
- OP_old = OP
- if OP==1: # For an AND column
- AND_on()
- waitF2(wait)
- if INA != 0:
- correct('and')
- score=score+10
- sleep(.25)
- INA = 0
- elif INB == 1 or INC == 1 or IND == 1 or INE == 1 or INF == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- elif OP==2: # For an OR column
- OR_on()
- waitF2(wait)
- if INB != 0:
- correct('OR')
- score=score+10
- sleep(.25)
- INB = 0
- elif INA == 1 or INC == 1 or IND == 1 or INE == 1 or INF == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- elif OP==3: # For a NAND column
- NAND_on()
- waitF2(wait)
- if INC !=0:
- correct('NAND')
- score=score+10
- sleep(.25)
- INC = 0
- elif INA == 1 or INB == 1 or IND == 1 or INE == 1 or INF == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- elif OP==4:# For a NOR column
- NOR_on()
- waitF2(wait)
- if IND !=0:
- correct('NOR')
- score=score+10
- sleep(.25)
- IND = 0
- elif INA == 1 or INB == 1 or INC == 1 or INE == 1 or INF == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- elif OP==5:# For a XOR column
- XOR_on()
- waitF2(wait)
- if INE !=0:
- correct('XOR')
- score=score+10
- sleep(.25)
- INE = 0
- elif INA == 1 or INB == 1 or INC == 1 or IND == 1 or INF == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- elif OP==6:# For a XNOR column
- XNOR_on()
- waitF2(wait)
- if INF !=0:
- correct('XNOR')
- score=score+10
- sleep(.25)
- INE = 0
- elif INA == 1 or INB == 1 or INC == 1 or IND == 1 or INE == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- if chances==0:
- getFinalScore(score,2,wait)
- print ("Your Final Score is:", score/wait, ", Game Over")
- ALL_off()
- break
- screen.fill(white)
- pygame.display.update()
- def gameLoopDifficultyThree(wait):
- print('3')
- global chances
- global OP_old
- global INA
- global INB
- global INC
- global IND
- global INE
- global INF
- global ING
- global score
- while True:
- lightsDefault()
- chances=chances-1
- #print("You have",chances,"chances left")
- OP= random.randint(1, 7)
- #OP = 1
- while OP == OP_old:
- OP= random.randint(1, 7)
- #print(OP)
- OP_old = OP
- if OP==1: # For an AND column
- AND_on()
- waitF3(wait)
- if INA != 0:
- correct('and')
- score=score+10
- sleep(.25)
- INA = 0
- elif INB == 1 or INC == 1 or IND == 1 or INE == 1 or INF == 1 or ING == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- wrong()
- elif OP==2: # For an OR column
- OR_on()
- waitF3(wait)
- if INB != 0:
- correct('OR')
- score=score+10
- sleep(.25)
- INB = 0
- elif INA == 1 or INC == 1 or IND == 1 or INE == 1 or INF == 1 or ING == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- wrong()
- elif OP==3: # For a NAND column
- NAND_on()
- waitF3(wait)
- if INC !=0:
- correct('NAND')
- score=score+10
- sleep(.25)
- INC = 0
- elif INA == 1 or INB == 1 or IND == 1 or INE == 1 or INF == 1 or ING == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- wrong()
- elif OP==4:# For a NOR column
- NOR_on()
- waitF3(wait)
- if IND !=0:
- correct('NOR')
- score=score+10
- sleep(.25)
- IND = 0
- elif INA == 1 or INB == 1 or INC == 1 or INE == 1 or INF == 1 or ING == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- wrong()
- elif OP==5:# For a XOR column
- XOR_on()
- waitF3(wait)
- if INE !=0:
- correct('XOR')
- score=score+10
- sleep(.25)
- INE = 0
- elif INA == 1 or INB == 1 or INC == 1 or IND == 1 or INF == 1 or ING == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- wrong()
- elif OP==6:# For a XNOR column
- XNOR_on()
- waitF3(wait)
- if INF !=0:
- correct('XNOR')
- score=score+10
- sleep(.25)
- INE = 0
- elif INA == 1 or INB == 1 or INC == 1 or IND == 1 or INE == 1 or ING == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- wrong()
- elif OP==7:# For a Gibberish column
- Gibberish_on()
- waitF3(wait)
- if ING !=0:
- correct('Gibberish')
- score=score+10
- sleep(.25)
- INE = 0
- elif INA == 1 or INB == 1 or INC == 1 or IND == 1 or INE == 1:
- INA = 0
- INB = 0
- INC = 0
- IND = 0
- INE = 0
- INF = 0
- ING = 0
- wrong()
- if chances==0:
- getFinalScore(score,3,wait)
- print ("Your Final Score is:", score/wait, ", Game Over")
- ALL_off()
- break
- screen.fill(white)
- pygame.display.update()
- def menu(wait):
- menuPos=1
- while True:
- confirmed = 0
- for event in pygame.event.get():
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_DOWN:
- if menuPos != 3:
- menuPos = menuPos+1
- if event.key == pygame.K_UP:
- if menuPos != 1:
- menuPos = menuPos-1
- if event.key == pygame.K_SPACE:
- if confirmed != 1:
- confirmed = 1
- if event.key == pygame.K_ESCAPE:
- quitF()
- screen.fill(white)
- if menuPos == 1:
- text2 = font_large.render(">> Lunatic Mode", 1, blue)
- screen.blit(text2,(50,10))
- text2 = font_large.render(" Normal Mode", 1, black)
- screen.blit(text2,(50,120))
- text2 = font_large.render(" Easy Mode", 1, black)
- screen.blit(text2,(50,230))
- if menuPos == 2:
- text2 = font_large.render(" Lunatic Mode", 1, black)
- screen.blit(text2,(50,10))
- text2 = font_large.render(">> Normal Mode", 1, blue)
- screen.blit(text2,(50,120))
- text2 = font_large.render(" Easy Mode", 1, black)
- screen.blit(text2,(50,230))
- if menuPos == 3:
- text2 = font_large.render(" Lunatic Mode", 1, black)
- screen.blit(text2,(50,10))
- text2 = font_large.render(" Normal Mode", 1, black)
- screen.blit(text2,(50,120))
- text2 = font_large.render(">> Easy Mode", 1, blue)
- screen.blit(text2,(50,230))
- if confirmed == 1:
- print(menuPos)
- if menuPos == 3:
- gameLoopDifficultyOne(wait)
- elif menuPos == 2:
- gameLoopDifficultyTwo(wait)
- elif menuPos == 1:
- gameLoopDifficultyThree(wait)
- pygame.display.update()
- lightsDefault()
- wait = 9
- #gameLoopDifficultyOne(wait)
- menu(wait)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement