Skip to content
Extraits de code Groupes Projets
Valider 795ca306 rédigé par Vany Ingenzi's avatar Vany Ingenzi
Parcourir les fichiers

Working on player OneAfterOne

parent 00a07f1e
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Fichier ajouté
......@@ -50,6 +50,7 @@ in
%%%% Description of the map %%%%
/*
NRow = 10
NColumn = 20
Map = [[0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0]
......@@ -62,12 +63,20 @@ in
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
[0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0]]
*/
NRow = 5
NColumn = 5
Map = [[0 0 0 0 1]
[0 1 1 0 0]
[0 0 0 1 0]
[0 0 1 0 0]
[0 0 0 0 0]]
%%%% Players description %%%%
NbPlayers = 3
Players = [player000basic player001basic player002basic]
Colors = [black c(245 88 203) c(255 102 0)]
Players = [player020oneafterone player020oneafterone player020oneafterone]
Colors = [ black c(245 88 203) c(255 102 0)]
%%%% Surface time/turns %%%%
......
Fichier ajouté
Fichier ajouté
functor
import
Input
OS
System
export
portPlayer:StartPlayer
define
StartPlayer
TreatStream
AllDirections = [east west north south surface]
AllWeapons = [missile sonar drone mine]
fun{NewRec Rec Feature Value}
NewRecord={Record.clone Rec}
in
{List.forAll {Record.arity NewRecord} proc{$ Feat}
if Feat==Feature then NewRecord.Feat=Value
else NewRecord.Feat=Rec.Feat end
end}
NewRecord
end
fun{ValidPosition X Y History}
if X < 1 orelse X > Input.nRow then
false
elseif Y < 1 orelse Y > Input.nColumn then
false
else
{And {Not {List.nth {List.nth Input.map X} Y}==1}
{Not {List.member pt(x:X y:Y) History}}}
end
end
fun{GetRandomPosInWater History}
RandomX = ({OS.rand} mod Input.nRow) + 1
RandomY = ({OS.rand} mod Input.nColumn) + 1
in
if {Not {ValidPosition RandomX RandomY History}} then
{GetRandomPosInWater History}
else pt(x:RandomX y:RandomY)
end
end
fun {HandleInitPosition State initPosition(ID Pos)}
RandomPt = {GetRandomPosInWater State.history}
in
ID=State.id Pos=RandomPt
{NewRec {NewRec State pos Pos} history nil}
end
fun {GetRandomElement L}
Idx=({OS.rand} mod {List.length L}) + 1
in
{List.nth L Idx}
end
fun {UpdatePos pt(x:X y:Y) Direction}
case Direction
of east then pt(x:X y:Y+1)
[] west then pt(x:X y:Y-1)
[] south then pt(x:X+1 y:Y)
[] north then pt(x:X-1 y:Y)
[] surface then pt(x:X y:Y)
end
end
fun {GetPossibleDirections CurrentPos History Directions}
case Directions of nil then nil
[] east|T then
if {ValidPosition CurrentPos.x CurrentPos.y+1 History} then
east|{GetPossibleDirections CurrentPos History T}
else {GetPossibleDirections CurrentPos History T} end
[] west|T then
if {ValidPosition CurrentPos.x CurrentPos.y-1 History} then
west|{GetPossibleDirections CurrentPos History T}
else {GetPossibleDirections CurrentPos History T} end
[] south|T then
if {ValidPosition CurrentPos.x+1 CurrentPos.y History} then
south|{GetPossibleDirections CurrentPos History T}
else {GetPossibleDirections CurrentPos History T} end
[] north|T then
if {ValidPosition CurrentPos.x-1 CurrentPos.y History} then
north|{GetPossibleDirections CurrentPos History T}
else {GetPossibleDirections CurrentPos History T} end
[] surface|T then
surface|{GetPossibleDirections CurrentPos History T}
end
end
fun {HandleMove State move(ID Pos Direction)}
RandomDirection={GetRandomElement {GetPossibleDirections State.pos State.history AllDirections}}
NewPos={UpdatePos State.pos RandomDirection}
in
ID=State.id Pos=NewPos Direction=RandomDirection
case RandomDirection
of surface then
{NewRec {NewRec State pos NewPos} history nil}
else
{NewRec {NewRec State pos NewPos} history Pos|State.history}
end
end
fun {GetNewChargeFireItem Item}
case Item
of mine then '#'(fireItem:mine({GetRandomPosInWater nil}) charge:0)
[] missile then '#'(fireItem:missile({GetRandomPosInWater nil}) charge:0)
[] drone then Rdm={GetRandomPosInWater nil} in
if {OS.rand} mod 2 == 0 then '#'(fireItem:drone(row Rdm.x) charge:0)
else '#'(fireItem:drone(column Rdm.y) charge:0) end
[] sonar then '#'(fireItem:sonar charge:0)
end
end
fun {CheckFireItemReady '#'(fireItem:FireItem charge:NbCharge)}
Input.{Record.label FireItem}==NbCharge
end
fun{HandleChargeItem State chargeItem(ID Item)}
ToCharge={GetRandomElement State.chargingItems}
AfterCharge={NewRec ToCharge charge ToCharge.charge+1}
NewChargingItems
in
if {CheckFireItemReady AfterCharge} then NewChargingItem={GetNewChargeFireItem {Record.label AfterCharge.fireItem}} in
ID=State.id Item={Record.label AfterCharge.fireItem}
NewChargingItems={List.map State.chargingItems fun{$ Item}
if Item==ToCharge then NewChargingItem
else Item end
end}
{NewRec {NewRec State chargingItems NewChargingItems} chargedItems AfterCharge.fireItem|State.chargedItems}
else
NewChargingItems={List.map State.chargingItems fun{$ Item}
if Item==ToCharge then AfterCharge
else Item end
end}
ID=State.id Item=null
{NewRec State chargingItems NewChargingItems}
end
end
fun {HandleFireItem State fireItem(ID KindFire)}
case State.chargedItems
of nil then
ID=State.id KindFire=null
State
elseif {OS.rand} mod 2 == 0 then ToFire={GetRandomElement State.chargedItems} in
ID=State.id KindFire=ToFire
case {Record.label KindFire} of mine then
{NewRec {NewRec State chargedItems {List.subtract State.chargedItems ToFire}} placedMines KindFire|State.placedMines}
else
{NewRec State chargedItems {List.subtract State.chargedItems ToFire}}
end
else
ID=State.id KindFire=null
State
end
end
fun{HandleFireMine State fireMine(ID Mine)}
case State.placedMines
of nil then
ID=State.id Mine=null
State
elseif {OS.rand} mod 5 \= 0 then MineToExplode={GetRandomElement State.placedMines} in
ID=State.id Mine=MineToExplode
{NewRec State placedMines {List.subtract State.placedMines MineToExplode}}
else
ID=State.id Mine=null
State
end
end
fun {ManhattanDistance Pos1 Pos2}
{Abs Pos1.x-Pos2.x}+{Abs Pos1.y-Pos2.y}
end
fun {DamageFromExplosion MyPos ExplosionPos}
case {ManhattanDistance MyPos ExplosionPos}
of 0 then 2
[] 1 then 1
else 0 end
end
fun{HandleExplosion State ID Pos Msg}
Damage={DamageFromExplosion State.pos Pos}
in
case Damage
of 0 then
Msg=null
State
else NewLife={Max 0 State.life-Damage} in
case NewLife
of 0 then
Msg=sayDeath(State.id)
{NewRec State life 0}
else
Msg=sayDamageTaken(State.id Damage NewLife)
{NewRec State life NewLife}
end
end
end
proc{DeadTreatStream Stream State}
case Stream
of initPosition(ID Pos)|T then
ID=null
{DeadTreatStream T State}
[] move(ID Pos Direction)|T then
ID=null
{DeadTreatStream T State}
[] dive|T then %% Ignored
{DeadTreatStream T State}
[] saySurface(ID)|T then %% Ignored
{DeadTreatStream T State}
[] sayMove(ID Direct)|T then %% Ignored
{DeadTreatStream T State}
[] chargeItem(ID Item)|T then
ID=null
{DeadTreatStream T State}
[] isDead(Answer)|T then
Answer=true
{DeadTreatStream T State}
[] fireItem(ID KindFire)|T then
ID=null
{DeadTreatStream T State}
[] fireMine(ID Mine)|T then
ID=null
{DeadTreatStream T State}
[] sayCharge(ID KindItem)|T then %% Ignored
{DeadTreatStream T State}
[] sayMinePlaced(ID)|T then %% Ignored
{DeadTreatStream T State}
[] sayMissileExplode(ID Pos Msg)|T then
Msg=null
{DeadTreatStream T State}
[] sayMineExplode(ID Pos Msg)|T then
Msg=null
{DeadTreatStream T State}
[] sayPassingDrone(drone(row X) ID Answer)|T then
ID=null
{DeadTreatStream T State}
[] sayPassingDrone(drone(column Y) ID Answer)|T then
ID=null
{DeadTreatStream T State}
[] sayAnswerDrone(Drone ID Answer)|T then %% Ignore
{DeadTreatStream T State}
[] sayPassingSonar(ID Resp)|T then
ID=null
{DeadTreatStream T State}
[] sayAnswerSonar(ID Answer)|T then %% Ignore
{DeadTreatStream T State}
[] sayDamageTaken(ID Damage LifeLeft)|T then %% Ignore
{DeadTreatStream T State}
[] sayDeath(ID)|T then %% Ignore
{DeadTreatStream T State}
end
end
proc{AliveTreatStream Stream State}
case Stream
of initPosition(ID Pos)|T then NewState in
{System.show 'Player'#State.id.id#'received'#initPosition(ID Pos)}
NewState={HandleInitPosition State initPosition(ID Pos)}
{System.show 'Player'#State.id.id#'replied'#initPosition(ID Pos)}
{AliveTreatStream T NewState}
[] move(ID Pos Direction)|T then NewState in
{System.show 'Player'#State.id.id#'received'#move(ID Pos Direction)}
NewState={HandleMove State move(ID Pos Direction)}
{System.show 'Player'#State.id.id#'replied'#move(ID Pos Direction)}
{AliveTreatStream T NewState}
[] dive|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#dive}
{AliveTreatStream T State}
[] saySurface(ID)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#saySurface(ID)}
{AliveTreatStream T State}
[] sayMove(ID Direct)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#sayMove(ID Direct)}
{AliveTreatStream T State}
[] isDead(Answer)|T then
Answer=false
{AliveTreatStream T State}
[] chargeItem(ID Item)|T then NewState in
{System.show 'Player'#State.id.id#'received'#chargeItem(ID Item)}
NewState={HandleChargeItem State chargeItem(ID Item)}
{System.show 'Player'#State.id.id#'replied'#chargeItem(ID Item)}
{AliveTreatStream T NewState}
[] fireItem(ID KindFire)|T then NewState in
{System.show 'Player'#State.id.id#'received'#fireItem(ID KindFire)}
NewState={HandleFireItem State fireItem(ID KindFire)}
{System.show 'Player'#State.id.id#'replied'#fireItem(ID KindFire)}
{AliveTreatStream T NewState}
[] fireMine(ID Mine)|T then NewState in
{System.show 'Player'#State.id.id#'received'#fireMine(ID Mine)}
NewState={HandleFireMine State fireMine(ID Mine)}
{System.show 'Player'#State.id.id#'replied'#fireMine(ID Mine)}
{AliveTreatStream T NewState}
[] sayCharge(ID KindItem)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#sayCharge(ID KindItem)}
{AliveTreatStream T State}
[] sayMinePlaced(ID)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#sayMinePlaced(ID)}
{AliveTreatStream T State}
[] sayMissileExplode(ID Pos Msg)|T then NewState in
{System.show 'Player'#State.id.id#'received'#sayMissileExplode(ID Pos Msg)}
NewState={HandleExplosion State ID Pos Msg}
{System.show 'Player'#State.id.id#'replied'#sayMissileExplode(ID Pos Msg)}
if NewState.life > 0 then {AliveTreatStream T NewState}
else {DeadTreatStream T NewState} end
[] sayMineExplode(ID Pos Msg)|T then NewState in
{System.show 'Player'#State.id.id#'received'#sayMineExplode(ID Pos Msg)}
NewState={HandleExplosion State ID Pos Msg}
{System.show 'Player'#State.id.id#'replied'#sayMineExplode(ID Pos Msg)}
if NewState.life > 0 then {AliveTreatStream T NewState}
else {DeadTreatStream T NewState} end
[] sayPassingDrone(drone(row X) ID Answer)|T then
{System.show 'Player'#State.id.id#'received'#sayPassingDrone(drone(row X) ID Answer)}
ID=State.id.id
Answer=State.pos.x==X
{System.show 'Player'#State.id.id#'replied'#sayPassingDrone(drone(row X) ID Answer)}
{AliveTreatStream T State}
[] sayPassingDrone(drone(column Y) ID Answer)|T then
{System.show 'Player'#State.id.id#'received'#sayPassingDrone(drone(column Y) ID Answer)}
ID=State.id.id
Answer=State.pos.y==Y
{System.show 'Player'#State.id.id#'replied'#sayPassingDrone(drone(column Y) ID Answer)}
{AliveTreatStream T State}
[] sayAnswerDrone(Drone ID Answer)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayAnswerDrone(Drone ID Answer)}
{AliveTreatStream T State}
[] sayPassingSonar(ID Resp)|T then
ID=State.id.id Resp=pt(x:State.pos.x y:{Max 0 State.pos.y})
{System.show 'Player'#State.id.id#'received'#sayPassingSonar(ID Resp)}
{AliveTreatStream T State}
[] sayAnswerSonar(ID Answer)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayAnswerSonar(ID Answer)}
{AliveTreatStream T State}
[] sayDamageTaken(ID Damage LifeLeft)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayDamageTaken(ID Damage LifeLeft)}
{AliveTreatStream T State}
[] sayDeath(ID)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayDeath(ID)}
{AliveTreatStream T State}
end
end
fun{StartPlayer Color ID}
Stream
Port
in
{NewPort Stream Port}
thread
{AliveTreatStream Stream '#'(id:id(id:ID color:Color name:name)
life:Input.maxDamage
pos:pt(x:0 y:0)
chargingItems:[ {GetNewChargeFireItem mine} {GetNewChargeFireItem missile}
{GetNewChargeFireItem sonar} {GetNewChargeFireItem drone} ]
chargedItems:nil
placedMines:nil
history:nil)}
end
Port
end
end
\ No newline at end of file
......@@ -9,60 +9,52 @@ define
StartPlayer
TreatStream
AllDirections = [east west north south surface]
AllWeapons = [missile sonar drone mine]
fun{NewRec Rec Feature Value}
NewRecord={Record.clone Rec}
in
{List.forAll {Record.arity NewRecord} proc{$ Feat}
if Feat==Feature then NewRecord.Feat=Value
else NewRecord.Feat=Rec.Feat end
end}
NewRecord
end
fun{ValidPosition X Y History}
if X < 1 orelse X > Input.nRow then
false
elseif Y < 1 orelse Y > Input.nColumn then
false
else
{And {Not {List.nth {List.nth Input.map X} Y}==1}
{Not {List.member pt(x:X y:Y) History}}}
AllWeapons = [missile drone]
fun {GetNewEnemyTarget MyId Dead}
Enemy=({OS.rand} mod Input.nbPlayer) + 1
in
if {List.length Dead}==Input.nbPlayer then
null
elseif Enemy \= MyId andthen {Not {List.member Enemy Dead}} then
Enemy
else
{GetNewEnemyTarget MyId Dead}
end
end
fun{GetRandomPosInWater History}
RandomX = ({OS.rand} mod Input.nRow) + 1
RandomY = ({OS.rand} mod Input.nColumn) + 1
in
if {Not {ValidPosition RandomX RandomY History}} then
{GetRandomPosInWater History}
else pt(x:RandomX y:RandomY)
fun {GetNewChargeFireItem Item}
case Item
of missile then '#'(fireItem:missile({GetRandomPosInWater nil}) charge:0)
[] drone then Unbound in
if {OS.rand} mod 2 == 0 then '#'(fireItem:drone(row Unbound) charge:0)
else '#'(fireItem:drone(column Unbound) charge:0) end
end
end
fun {HandleInitPosition State initPosition(ID Pos)}
RandomPt = {GetRandomPosInWater State.history}
in
ID=State.id Pos=RandomPt
{NewRec {NewRec State pos Pos} history nil}
end
fun {GetRandomElement L}
Idx=({OS.rand} mod {List.length L}) + 1
fun{StartPlayer Color ID}
Stream
Port
in
{List.nth L Idx}
end
fun {UpdatePos pt(x:X y:Y) Direction}
case Direction
of east then pt(x:X y:Y+1)
[] west then pt(x:X y:Y-1)
[] south then pt(x:X+1 y:Y)
[] north then pt(x:X-1 y:Y)
[] surface then pt(x:X y:Y)
{NewPort Stream Port}
thread
{AliveTreatStream Stream '#'( id:id(id:ID color:Color name:name)
pos:pt(x:0 y:0)
history:nil
dead:nil
chargingItems: [
{GetNewChargeFireItem drone} {GetNewChargeFireItem drone}
{GetNewChargeFireItem missile}
]
chargedItems:nil
target:'#'(idNum:{GetNewEnemyTarget ID nil} history:nil confirmedRow:unit confirmedColumn:unit)
life:Input.maxDamage
gaveUpPosition: false
loopDirection: AllDirections
dronesLog:'#'(row:0 column:0)
)}
end
Port
end
fun {GetPossibleDirections CurrentPos History Directions}
......@@ -88,6 +80,53 @@ define
end
end
fun {GetRandomElement L}
Idx=({OS.rand} mod {List.length L}) + 1
in
{List.nth L Idx}
end
fun{ValidPosition X Y PointsHistory}
if X < 1 orelse X > Input.nRow then
false
elseif Y < 1 orelse Y > Input.nColumn then
false
else
{And {Not {List.nth {List.nth Input.map X} Y}==1}
{Not {List.member pt(x:X y:Y) PointsHistory}}}
end
end
fun{NewRec Rec Feature Value}
NewRecord={Record.clone Rec}
in
{List.forAll {Record.arity NewRecord} proc{$ Feat}
if Feat==Feature then NewRecord.Feat=Value
else NewRecord.Feat=Rec.Feat end
end}
NewRecord
end
fun{GetRandomPosInWater History}
RandomX = ({OS.rand} mod Input.nRow) + 1
RandomY = ({OS.rand} mod Input.nColumn) + 1
in
if {Not {ValidPosition RandomX RandomY History}} then
{GetRandomPosInWater History}
else pt(x:RandomX y:RandomY)
end
end
fun {UpdatePos pt(x:X y:Y) Direction}
case Direction
of east then pt(x:X y:Y+1)
[] west then pt(x:X y:Y-1)
[] south then pt(x:X+1 y:Y)
[] north then pt(x:X-1 y:Y)
[] surface then pt(x:X y:Y)
end
end
fun {HandleMove State move(ID Pos Direction)}
RandomDirection={GetRandomElement {GetPossibleDirections State.pos State.history AllDirections}}
NewPos={UpdatePos State.pos RandomDirection}
......@@ -98,17 +137,62 @@ define
{NewRec {NewRec State pos NewPos} history nil}
else
{NewRec {NewRec State pos NewPos} history Pos|State.history}
end
end
fun {HandleInitPosition State initPosition(ID Pos)}
RandomPt = {GetRandomPosInWater State.history}
in
ID=State.id Pos=RandomPt
{NewRec {NewRec State pos Pos} history nil}
end
fun{InverseUpdatePos pt(x:X y:Y) Direction}
case Direction
of east then pt(x:X y:Y-1)
[] west then pt(x:X y:Y+1)
[] south then pt(x:X-1 y:Y)
[] north then pt(x:X+1 y:Y)
end
end
fun{PossiblePath pt(x:X y:Y) DirectionsHistory}
case DirectionsHistory of nil then true
[] Direction|T then Origin={InverseUpdatePos pt(x:X y:Y) Direction} in
if {ValidPosition Origin.x Origin.y nil} then
{PossiblePath Origin T}
else
false
end
end
end
fun {GetNewChargeFireItem Item}
case Item
of mine then '#'(fireItem:mine({GetRandomPosInWater nil}) charge:0)
[] missile then '#'(fireItem:missile({GetRandomPosInWater nil}) charge:0)
[] drone then Rdm={GetRandomPosInWater nil} in
if {OS.rand} mod 2 == 0 then '#'(fireItem:drone(row Rdm.x) charge:0)
else '#'(fireItem:drone(column Rdm.y) charge:0) end
[] sonar then '#'(fireItem:sonar charge:0)
fun {EnemyPossiblePositions NRow NColumn Directions Acc}
if Input.nRow==NRow andthen NColumn==Input.nColumn then Acc
elseif NRow==Input.nRow then
if {ValidPosition NRow NColumn nil} andthen
{PossiblePath pt(x:Input.nRow y:NColumn) Directions} then
{EnemyPossiblePositions 1 NColumn+1 Directions pt(x:Input.nRow y:NColumn)|Acc}
else
{EnemyPossiblePositions 1 NColumn+1 Directions Acc}
end
else
if {ValidPosition NRow NColumn nil} andthen
{PossiblePath pt(x:NRow y:NColumn) Directions} then
{EnemyPossiblePositions NRow+1 NColumn Directions pt(x:NRow y:NColumn)|Acc}
else
{EnemyPossiblePositions NRow+1 NColumn Directions Acc}
end
end
end
fun {HandleSayMove State sayMove(id(id:EnemyId color:_ name:_) Direction)}
%% MoreComplex
case EnemyId==State.target.idNum
of true then
{NewRec State target '#'(idNum:EnemyId history:Direction|State.target.history)}
else
State
end
end
......@@ -138,122 +222,42 @@ define
end
end
fun {HandleFireItem State fireItem(ID KindFire)}
case State.chargedItems
of nil then
ID=State.id KindFire=null
State
elseif {OS.rand} mod 2 == 0 then ToFire={GetRandomElement State.chargedItems} in
ID=State.id KindFire=ToFire
case {Record.label KindFire} of mine then
{NewRec {NewRec State chargedItems {List.subtract State.chargedItems ToFire}} placedMines KindFire|State.placedMines}
else
{NewRec State chargedItems {List.subtract State.chargedItems ToFire}}
fun {FireSomething State fireItem(ID KindFire)}
case State.chargedItems
of nil then ID=State.id KindFire=null State
else ToFire={GetRandomElement State.chargedItems} in
case ToFire
of drone(column Y) then Y=(State.dronesLog.column mod Input.nColumn)+1
[] drone(row X) then X=(State.dronesLog.row mod Input.row)+1
end
else
ID=State.id KindFire=null
State
KindFire=ToFire ID=State.id
{NewRec State chargedItems {List.subtract State.chargedItems ToFire}}
end
end
fun{HandleFireMine State fireMine(ID Mine)}
case State.placedMines
of nil then
ID=State.id Mine=null
State
elseif {OS.rand} mod 5 \= 0 then MineToExplode={GetRandomElement State.placedMines} in
ID=State.id Mine=MineToExplode
{NewRec State placedMines {List.subtract State.placedMines MineToExplode}}
else
ID=State.id Mine=null
State
end
end
fun {ManhattanDistance Pos1 Pos2}
{Abs Pos1.x-Pos2.x}+{Abs Pos1.y-Pos2.y}
end
fun {DamageFromExplosion MyPos ExplosionPos}
case {ManhattanDistance MyPos ExplosionPos}
of 0 then 2
[] 1 then 1
else 0 end
end
fun{HandleExplosion State ID Pos Msg}
Damage={DamageFromExplosion State.pos Pos}
fun {HandleFireItem State fireItem(ID KindFire)}
Possibilities
in
case Damage
of 0 then
Msg=null
State
else NewLife={Max 0 State.life-Damage} in
case NewLife
of 0 then
Msg=sayDeath(State.id)
{NewRec State life 0}
else
Msg=sayDamageTaken(State.id Damage NewLife)
{NewRec State life NewLife}
end
end
if {List.length State.target.history} >= 10 then
Possibilities={EnemyPossiblePositions 1 1 State.target.history nil}
{System.show 'Enemy History'#State.target.history}
else
{FireSomething State fireItem(ID KindFire)}
end
end
proc{DeadTreatStream Stream State}
case Stream
of initPosition(ID Pos)|T then
ID=null
{DeadTreatStream T State}
[] move(ID Pos Direction)|T then
ID=null
{DeadTreatStream T State}
[] dive|T then %% Ignored
{DeadTreatStream T State}
[] saySurface(ID)|T then %% Ignored
{DeadTreatStream T State}
[] sayMove(ID Direct)|T then %% Ignored
{DeadTreatStream T State}
[] chargeItem(ID Item)|T then
ID=null
{DeadTreatStream T State}
[] isDead(Answer)|T then
Answer=true
{DeadTreatStream T State}
[] fireItem(ID KindFire)|T then
ID=null
{DeadTreatStream T State}
[] fireMine(ID Mine)|T then
ID=null
{DeadTreatStream T State}
[] sayCharge(ID KindItem)|T then %% Ignored
{DeadTreatStream T State}
[] sayMinePlaced(ID)|T then %% Ignored
{DeadTreatStream T State}
[] sayMissileExplode(ID Pos Msg)|T then
Msg=null
{DeadTreatStream T State}
[] sayMineExplode(ID Pos Msg)|T then
Msg=null
{DeadTreatStream T State}
[] sayPassingDrone(drone(row X) ID Answer)|T then
ID=null
{DeadTreatStream T State}
[] sayPassingDrone(drone(column Y) ID Answer)|T then
ID=null
{DeadTreatStream T State}
[] sayAnswerDrone(Drone ID Answer)|T then %% Ignore
{DeadTreatStream T State}
[] sayPassingSonar(ID Resp)|T then
ID=null
{DeadTreatStream T State}
[] sayAnswerSonar(ID Answer)|T then %% Ignore
{DeadTreatStream T State}
[] sayDamageTaken(ID Damage LifeLeft)|T then %% Ignore
{DeadTreatStream T State}
[] sayDeath(ID)|T then %% Ignore
{DeadTreatStream T State}
end
fun {HandleAnswerDrone State sayAnswerDrone(Drone ID Answer)}
case ID
of id(id:EnemyId color:_ name:_) then
if Answer then
case Drone
of drone(column Y) then
{NewRec State target {NewRec State.target confirmedColumn}}
[] drone(row X) then
end
else State end
else State end
end
proc{AliveTreatStream Stream State}
......@@ -267,19 +271,20 @@ define
{System.show 'Player'#State.id.id#'received'#move(ID Pos Direction)}
NewState={HandleMove State move(ID Pos Direction)}
{System.show 'Player'#State.id.id#'replied'#move(ID Pos Direction)}
{AliveTreatStream T NewState}
{AliveTreatStream T NewState}
[] dive|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#dive}
{AliveTreatStream T State}
[] saySurface(ID)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#saySurface(ID)}
{AliveTreatStream T State}
[] sayMove(ID Direct)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#sayMove(ID Direct)}
{AliveTreatStream T State}
[] isDead(Answer)|T then
Answer=false
{AliveTreatStream T State}
[] sayDeath(ID)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayDeath(ID)}
{AliveTreatStream T State}
[] sayMove(ID Direct)|T then NewState in
{System.show 'Player'#State.id.id#'received'#sayMove(ID Direct)}
NewState={HandleSayMove State sayMove(ID Direct)}
{AliveTreatStream T State}
[] chargeItem(ID Item)|T then NewState in
{System.show 'Player'#State.id.id#'received'#chargeItem(ID Item)}
NewState={HandleChargeItem State chargeItem(ID Item)}
......@@ -290,76 +295,26 @@ define
NewState={HandleFireItem State fireItem(ID KindFire)}
{System.show 'Player'#State.id.id#'replied'#fireItem(ID KindFire)}
{AliveTreatStream T NewState}
[] fireMine(ID Mine)|T then NewState in
{System.show 'Player'#State.id.id#'received'#fireMine(ID Mine)}
NewState={HandleFireMine State fireMine(ID Mine)}
{System.show 'Player'#State.id.id#'replied'#fireMine(ID Mine)}
{AliveTreatStream T NewState}
[] saySurface(ID)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#saySurface(ID)}
{AliveTreatStream T State}
[] sayCharge(ID KindItem)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#sayCharge(ID KindItem)}
{AliveTreatStream T State}
[] sayMinePlaced(ID)|T then %% Ignored
{System.show 'Player'#State.id.id#'received'#sayMinePlaced(ID)}
{AliveTreatStream T State}
[] sayMissileExplode(ID Pos Msg)|T then NewState in
{System.show 'Player'#State.id.id#'received'#sayMissileExplode(ID Pos Msg)}
NewState={HandleExplosion State ID Pos Msg}
{System.show 'Player'#State.id.id#'replied'#sayMissileExplode(ID Pos Msg)}
if NewState.life > 0 then {AliveTreatStream T NewState}
else {DeadTreatStream T NewState} end
[] sayMineExplode(ID Pos Msg)|T then NewState in
{System.show 'Player'#State.id.id#'received'#sayMineExplode(ID Pos Msg)}
NewState={HandleExplosion State ID Pos Msg}
{System.show 'Player'#State.id.id#'replied'#sayMineExplode(ID Pos Msg)}
if NewState.life > 0 then {AliveTreatStream T NewState}
else {DeadTreatStream T NewState} end
[] sayPassingDrone(drone(row X) ID Answer)|T then
{System.show 'Player'#State.id.id#'received'#sayPassingDrone(drone(row X) ID Answer)}
ID=State.id.id
Answer=State.pos.x==X
{System.show 'Player'#State.id.id#'replied'#sayPassingDrone(drone(row X) ID Answer)}
{AliveTreatStream T State}
[] sayPassingDrone(drone(column Y) ID Answer)|T then
{System.show 'Player'#State.id.id#'received'#sayPassingDrone(drone(column Y) ID Answer)}
ID=State.id.id
Answer=State.pos.y==Y
{System.show 'Player'#State.id.id#'replied'#sayPassingDrone(drone(column Y) ID Answer)}
{AliveTreatStream T State}
[] sayAnswerDrone(Drone ID Answer)|T then %% Ignore
[] sayAnswerDrone(Drone ID Answer)|T then NewState in %% Ignore
{System.show 'Player'#State.id.id#'received'#sayAnswerDrone(Drone ID Answer)}
{AliveTreatStream T State}
[] sayPassingSonar(ID Resp)|T then
ID=State.id.id Resp=pt(x:State.pos.x y:{Max 0 State.pos.y})
{System.show 'Player'#State.id.id#'received'#sayPassingSonar(ID Resp)}
{AliveTreatStream T State}
[] sayAnswerSonar(ID Answer)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayAnswerSonar(ID Answer)}
{AliveTreatStream T State}
[] sayDamageTaken(ID Damage LifeLeft)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayDamageTaken(ID Damage LifeLeft)}
{AliveTreatStream T State}
[] sayDeath(ID)|T then %% Ignore
{System.show 'Player'#State.id.id#'received'#sayDeath(ID)}
NewState={HandleAnswerDrone State sayAnswerDrone(Drone ID Answer)}
{AliveTreatStream T State}
end
end
fun{StartPlayer Color ID}
Stream
Port
in
{NewPort Stream Port}
thread
{AliveTreatStream Stream '#'(id:id(id:ID color:Color name:name)
life:Input.maxDamage
pos:pt(x:0 y:0)
chargingItems:[ {GetNewChargeFireItem mine} {GetNewChargeFireItem missile}
{GetNewChargeFireItem sonar} {GetNewChargeFireItem drone} ]
chargedItems:nil
placedMines:nil
history:nil)}
end
Port
end
end
\ No newline at end of file
Fichier ajouté
......@@ -350,16 +350,15 @@ define
in
{NewPort Stream Port}
thread
{AliveTreatStream Stream '#'(id:id(id:ID color:Color name:name)
life:Input.maxDamage
pos:pt(x:0 y:0)
chargingItems:[ {GetNewChargeFireItem mine} {GetNewChargeFireItem missile}
{GetNewChargeFireItem sonar} {GetNewChargeFireItem drone} ]
chargedItems:nil
placedMines:nil
history:nil)}
{AliveTreatStream Stream '#'( id:id(id:ID color:Color name:name)
life:Input.maxDamage
pos:pt(x:0 y:0)
chargingItems:[ {GetNewChargeFireItem mine} {GetNewChargeFireItem missile}
{GetNewChargeFireItem sonar} {GetNewChargeFireItem drone} ]
chargedItems:nil
placedMines:nil
history:nil)}
end
Port
end
end
\ No newline at end of file
Fichier ajouté
functor
import
Player000Basic
Player001Basic
Player002Basic
Player020Random
Player020OneAfterOne
export
playerGenerator:PlayerGenerator
define
PlayerGenerator
in
fun{PlayerGenerator Kind Color ID}
fun {PlayerGenerator Kind Color ID}
case Kind
of player000basic then
{Player000Basic.portPlayer Color ID}
[] player001basic then
{Player001Basic.portPlayer Color ID}
[] player002basic then
{Player002Basic.portPlayer Color ID}
of player020random then
{Player020Random.portPlayer Color ID}
[] player020oneafterone then
{Player020OneAfterOne.portPlayer Color ID}
end
end
end
\ No newline at end of file
Fichier ajouté
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter