le jeu de bataille navale - Niveau intermédiaire
Dans cette simulation de jeu de bataille navale, nous utiliserons deux cartes. La première sera l'ordinateur et contiendra deux bateaux placés aléatoirement et la seconde sera pour le joueur qui essayera de couler les bateaux. La partie se termine quand les bateaux sont coulés.
La liaison radio est mise à contribution pour la communication du début de la partie, de la fin de partie, les tirs et les résultats des tirs.
Ce projet commence à être ambitieux pour une réalisation dans le cadre de SNT.
Méthode : Version ordinateur
Le bouton A permet de décider un autre placement
Le bouton B permet de démarrer la partie
Des bruitages sont joués lorsqu'un haut-parleur est connecté sur pin0.
# Olivier Lecluse
# 8 mars 2019
# version ordi
from random import randint
from microbit import *
import radio,music
radio.config(group=1)
radio.on()
boats = []
gameOn = False
def placer():
global boats
boats=[]
h=randint(0,1)
if h==0: # bateau de 3 horizontal
x3=randint(0,2)
y3=randint(0,4)
boats.append((x3,y3))
boats.append((x3+1,y3))
boats.append((x3+2,y3))
else: # bateau de 3 vertical
x3=randint(0,4)
y3=randint(0,2)
boats.append((x3,y3))
boats.append((x3,y3+1))
boats.append((x3,y3+2))
cont = True
while cont :
if h==0: # bateau de 2 verrtical
x2=randint(0,4)
y2=randint(0,3)
if (x2,y2) not in boats and (x2, y2+1) not in boats:
boats.append((x2,y2))
boats.append((x2,y2+1))
cont=False
else: # bateau de 2 horizontal
x2=randint(0,3)
y2=randint(0,4)
if (x2,y2) not in boats and (x2+1, y2) not in boats:
boats.append((x2,y2))
boats.append((x2+1,y2))
cont=False
def afficher():
display.clear()
for b in boats:
display.set_pixel(b[0],b[1],9)
placer()
afficher()
while True:
if button_a.was_pressed() and not gameOn:
placer()
afficher()
if button_b.was_pressed() and not gameOn:
gameOn = True
radio.send("GO")
music.play(music.POWER_UP)
if gameOn:
# la partie est en cours
# Gestion de l'arrivee d'un coup
incoming = radio.receive()
if incoming:
try:
hx,hy = incoming.split(',')
hit=(int(hx),int(hy))
except:
continue
if (hit) in boats:
boats.remove(hit)
radio.send("HIT")
music.pitch(1000, 500)
color=0
else:
radio.send("MISS")
music.pitch(200, 500)
color=2
display.set_pixel(hit[0], hit[1], color)
# Fin de la partie
if len(boats)==0:
radio.send("GAME OVER")
music.play(music.FUNERAL)
gameOn=False
Méthode : Version Joueur
Le bouton A déplace la cible verticalement
Le bouton B déplace la cible horizontalement
Une secousse déclenche le tir
# Olivier Lecluse
# 8 mars 2019
# version joueur
from microbit import *
import radio
radio.config(group=1)
radio.on()
nbHits = 0
gameOn = False
movePixColor = 5
missPixColor = 2
hitPixColor = 9
def deplacement():
global x, y, lastX, lastY, lastPix
# On rétablit l'ancien pixel
display.set_pixel(lastX, lastY, lastPix)
lastPix = display.get_pixel(x,y)
lastX, lastY=x, y
display.set_pixel(x,y,movePixColor)
while True:
if not gameOn:
# en atttente du placement des bateaux
incoming = radio.receive()
if incoming == "GO":
gameOn = True
display.show("Go")
sleep(500)
display.clear()
nbHits=0
x,y = 0,0 # position du tir
lastPix = 0
lastX, lastY=0,0
display.set_pixel(0,0,movePixColor)
else :
# jouer la partie
if button_b.was_pressed():
x = (x+1)%5
deplacement()
if button_a.was_pressed():
y = (y+1)%5
deplacement()
if accelerometer.was_gesture("shake"):
message = "{},{}".format(x, y)
radio.send(message)
response = False
while not response:
incoming = radio.receive()
if incoming == "HIT":
display.set_pixel(x,y,hitPixColor)
lastPix = hitPixColor
response = True
nbHits += 1
elif incoming == "MISS":
display.set_pixel(x,y,missPixColor)
lastPix = missPixColor
response = True
elif incoming == "GAME OVER":
display.set_pixel(x,y,hitPixColor)
lastPix = hitPixColor
display.show("WIN")
gameOn = False
response = True
elif incoming:
response = True
if nbHits == 5:
gameOn = False
display.show("WIN")