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éthodeVersion 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.

1
# Olivier Lecluse
2
# 8 mars 2019
3
# version ordi
4
5
from random import randint
6
from microbit import *
7
import radio,music
8
9
radio.config(group=1)
10
radio.on()
11
12
boats = []
13
gameOn = False
14
15
def placer():
16
    global boats
17
    boats=[]
18
    h=randint(0,1)
19
    if h==0: # bateau de 3 horizontal
20
        x3=randint(0,2)
21
        y3=randint(0,4)
22
        boats.append((x3,y3))
23
        boats.append((x3+1,y3))
24
        boats.append((x3+2,y3))
25
    else:    # bateau de 3 vertical
26
        x3=randint(0,4)
27
        y3=randint(0,2)
28
        boats.append((x3,y3))
29
        boats.append((x3,y3+1))
30
        boats.append((x3,y3+2))
31
32
    cont = True
33
    while cont :
34
        if h==0: # bateau de 2 verrtical
35
            x2=randint(0,4)
36
            y2=randint(0,3)
37
            if (x2,y2) not in boats and (x2, y2+1) not in boats:
38
                boats.append((x2,y2))
39
                boats.append((x2,y2+1))
40
                cont=False
41
        else: # bateau de 2 horizontal
42
            x2=randint(0,3)
43
            y2=randint(0,4)
44
            if (x2,y2) not in boats and (x2+1, y2) not in boats:
45
                boats.append((x2,y2))
46
                boats.append((x2+1,y2))
47
                cont=False
48
49
def afficher():
50
    display.clear()
51
    for b in boats:
52
        display.set_pixel(b[0],b[1],9)
53
54
placer()
55
afficher()
56
while True:
57
    if button_a.was_pressed() and not gameOn:
58
        placer()
59
        afficher()
60
    if button_b.was_pressed() and not gameOn:
61
        gameOn = True
62
        radio.send("GO")
63
        music.play(music.POWER_UP)
64
    if gameOn:
65
        # la partie est en cours
66
67
        # Gestion de l'arrivee d'un coup
68
        incoming = radio.receive()
69
        if incoming:
70
            try:
71
                hx,hy = incoming.split(',')
72
                hit=(int(hx),int(hy))
73
            except:
74
                continue
75
            if (hit) in  boats:
76
                boats.remove(hit)
77
                radio.send("HIT")
78
                music.pitch(1000, 500)
79
                color=0
80
            else:
81
                radio.send("MISS")
82
                music.pitch(200, 500)
83
                color=2
84
            display.set_pixel(hit[0], hit[1], color)
85
86
        # Fin de la partie
87
        if len(boats)==0:
88
            radio.send("GAME OVER")
89
            music.play(music.FUNERAL)
90
            gameOn=False
91

MéthodeVersion Joueur

  • Le bouton A déplace la cible verticalement

  • Le bouton B déplace la cible horizontalement

  • Une secousse déclenche le tir

1
# Olivier Lecluse
2
# 8 mars 2019
3
# version joueur
4
5
from microbit import *
6
import radio
7
8
radio.config(group=1)
9
radio.on()
10
11
nbHits = 0
12
gameOn = False
13
movePixColor = 5
14
missPixColor = 2
15
hitPixColor = 9
16
17
def deplacement():
18
    global x, y, lastX, lastY, lastPix
19
    # On rétablit l'ancien pixel
20
    display.set_pixel(lastX, lastY, lastPix)
21
    
22
    lastPix = display.get_pixel(x,y)
23
    lastX, lastY=x, y
24
    display.set_pixel(x,y,movePixColor)
25
26
27
while True:
28
    if not gameOn:
29
        # en atttente du placement des bateaux
30
        incoming = radio.receive()
31
        if incoming == "GO":
32
            gameOn = True
33
            display.show("Go")
34
            sleep(500)
35
            display.clear()
36
            nbHits=0
37
            x,y = 0,0 # position du tir
38
            lastPix = 0
39
            lastX, lastY=0,0
40
            display.set_pixel(0,0,movePixColor)
41
    else :
42
        # jouer la partie
43
        if button_b.was_pressed():
44
            x = (x+1)%5
45
            deplacement()
46
        if button_a.was_pressed():
47
            y = (y+1)%5
48
            deplacement()
49
        if accelerometer.was_gesture("shake"):
50
            message = "{},{}".format(x, y)
51
            radio.send(message)
52
            response = False
53
            while not response:
54
                incoming = radio.receive()
55
                if incoming == "HIT":
56
                    display.set_pixel(x,y,hitPixColor)
57
                    lastPix = hitPixColor
58
                    response = True
59
                    nbHits += 1
60
                elif incoming == "MISS":
61
                    display.set_pixel(x,y,missPixColor)
62
                    lastPix = missPixColor
63
                    response = True
64
                elif incoming == "GAME OVER":
65
                    display.set_pixel(x,y,hitPixColor)
66
                    lastPix = hitPixColor
67
                    display.show("WIN")
68
                    gameOn = False
69
                    response = True
70
                elif incoming:
71
                    response = True
72
        if nbHits == 5:
73
            gameOn = False
74
            display.show("WIN")
75