début du bot facile

pull/74/head
Thomas Chazot 1 year ago
parent deb3e59cae
commit 23e4b24d5b

@ -28,20 +28,22 @@ io.on('connection', (socket) => {
io.to(room).emit("game created", network, person, indices, Math.floor(Math.random() * map.get(room).length)) io.to(room).emit("game created", network, person, indices, Math.floor(Math.random() * map.get(room).length))
}); });
socket.on("lobby joined", (room, name) =>{ socket.on("lobby joined", (room, player) =>{
if (player.type=="Human"){
socket.join(room) socket.join(room)
}
if (map.get(room) == undefined){ if (map.get(room) == undefined){
map.set(room, [{id: socket.id, name: name}]) map.set(room, [{type: player.type, id: player.id, name: player.name}])
} }
else{ else{
const tab = map.get(room) const tab = map.get(room)
for(let i = 0; i<tab.length; i++){ for(let i = 0; i<tab.length; i++){
if (tab[i].id === socket.id){ if (tab[i].id === player.id){
tab.splice(i, 1) tab.splice(i, 1)
} }
} }
map.get(room).push({id: socket.id, name: name}) map.get(room).push({type: player.type, id: player.id, name: player.name})
} }
io.to(room).emit("new player", map.get(room)) io.to(room).emit("new player", map.get(room))

@ -47,6 +47,7 @@ const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick, handleS
const solotmp = params.get('solo'); const solotmp = params.get('solo');
const navigate = useNavigate(); const navigate = useNavigate();
console.log(person)
useEffect(() =>{ useEffect(() =>{
touchedPlayer=playerTouched touchedPlayer=playerTouched

@ -6,7 +6,9 @@ import { useTheme } from '../Style/ThemeContext';
/* Ressources */ /* Ressources */
import Person from '../res/img/Person.png' import Person from '../res/img/Person.png'
import leave from '../res/img/bot.png' import BotImg from '../res/img/bot.png'
import { useGame } from '../Contexts/GameContext';
import Bot from '../model/Bot';
interface PlayerStatusProps { interface PlayerStatusProps {
img: any img: any
state: any state: any
@ -14,12 +16,17 @@ interface PlayerStatusProps {
index: number index: number
setPlayerTouched: (newPlayerTouch: number) => void; setPlayerTouched: (newPlayerTouch: number) => void;
playerTouched: number playerTouched: number
showCircle: boolean
} }
let touchedPlayer = -1 let touchedPlayer = -1
//@ts-ignore //@ts-ignore
const PersonStatus: React.FC<PlayerStatusProps> = ({img = Person, state= Person, name = "Dummy", index, playerTouched, setPlayerTouched}) => { const PersonStatus: React.FC<PlayerStatusProps> = ({img = Person, state= Person, name = "Dummy", index, playerTouched, setPlayerTouched, showCircle}) => {
const theme=useTheme(); const theme=useTheme();
const {players} = useGame()
if (players[index] instanceof Bot){
img = BotImg
}
const [touchedPlayer, setTouchedPlayer] = useState(-2) const [touchedPlayer, setTouchedPlayer] = useState(-2)
useEffect(() =>{ useEffect(() =>{
@ -30,11 +37,12 @@ const PersonStatus: React.FC<PlayerStatusProps> = ({img = Person, state= Person,
<div className='centerDivV' onClick={() => setPlayerTouched(index)}> <div className='centerDivV' onClick={() => setPlayerTouched(index)}>
<img src={img} alt="player" height="60" width="60"/> <img src={img} alt="player" height="60" width="60"/>
<h5>{name}</h5> <h5>{name}</h5>
{(touchedPlayer == index) ?(
{(touchedPlayer == index && showCircle) ?(
<div className='statusDiv' style={{ backgroundColor: "gold" }}> <div className='statusDiv' style={{ backgroundColor: "gold" }}>
<img src={state} alt="state" height="30" width="30"/> <img src={state} alt="state" height="30" width="30"/>
</div> </div>
): ): showCircle &&
( (
<div className='statusDiv' style={{ backgroundColor: theme.colors.primary }}> <div className='statusDiv' style={{ backgroundColor: theme.colors.primary }}>
<img src={state} alt="state" height="30" width="30"/> <img src={state} alt="state" height="30" width="30"/>

@ -25,7 +25,7 @@ const PlayerList: React.FC<PlayerListProps> = ({ players, playerTouched, setPlay
{ {
//@ts-ignore //@ts-ignore
players.map((player, index) => ( players.map((player, index) => (
player.id!=socket.id && <PersonStatus img={Person} state={Person} key={index} name={player.name + " " + colorToEmoji(positionToColor(index), true)} playerTouched={playerTouched} setPlayerTouched={setPlayerTouched} index={index}/> player.id!=socket.id && <PersonStatus img={Person} state={Person} key={index} name={player.name + " " + colorToEmoji(positionToColor(index), true)} playerTouched={playerTouched} setPlayerTouched={setPlayerTouched} index={index} showCircle={true}/>
)) ))
} }
</div> </div>

@ -1,3 +1,5 @@
import EasyBot from "./model/EasyBot";
import Human from "./model/Human";
import AgeIndice from "./model/Indices/AgeIndice"; import AgeIndice from "./model/Indices/AgeIndice";
import ColorEdgesIndice from "./model/Indices/ColorEdgesIndice"; import ColorEdgesIndice from "./model/Indices/ColorEdgesIndice";
import ColorIndice from "./model/Indices/ColorIndice"; import ColorIndice from "./model/Indices/ColorIndice";
@ -7,6 +9,7 @@ import NbSportIndice from "./model/Indices/NbSportIndice";
import SportIndice from "./model/Indices/SportIndice"; import SportIndice from "./model/Indices/SportIndice";
import Person from "./model/Person"; import Person from "./model/Person";
import PersonNetwork from "./model/PersonsNetwork"; import PersonNetwork from "./model/PersonsNetwork";
import Player from "./model/Player";
class JSONParser{ class JSONParser{
@ -78,6 +81,17 @@ class JSONParser{
}); });
return tabIndice return tabIndice
} }
static JSONToPlayer(json: any): Player{
switch (json.type){
case "Human":
return new Human(json.id, json.name)
case "EasyBot":
return new EasyBot(json.id, json.name)
default:
throw new Error("PARSER unable to parse player: " + json.type);
}
}
} }
export default JSONParser export default JSONParser

@ -32,3 +32,11 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
.playerContainer {
display: flex;
flex-direction: column;
align-items: center;
padding-left: "5px";
}

@ -26,7 +26,7 @@ import { useGame } from '../Contexts/GameContext';
function EndGame() { function EndGame() {
const {winner, person} =useGame() const {winner, person, players, indices} =useGame()
console.log(winner) console.log(winner)
const theme = useTheme(); const theme = useTheme();
return ( return (
@ -39,19 +39,27 @@ function EndGame() {
</div> </div>
<div className='winner'> <div className='winner'>
<img src={Person} width='300' height='300'/> <img src={Person} width='300' height='300'/>
<h3>{indices[players.findIndex((p) => p.id == winner?.id)].ToString("fr")}</h3>
</div> </div>
<div className='bottom'> <div className='bottom'>
<div className='centerDivH'> <div className='centerDivH'>
<BigButtonNav dest="/play" img={Leave}/> <BigButtonNav dest="/play" img={Leave}/>
</div> </div>
<div className='centerDivH'> <ul className='centerDivH'>
{/* {
<PersonStatus img={Person} state={Replay} name="Dummy"/> players.map((player, index) => (
<PersonStatus img={Person} state={Leave} name="bot2"/> <div className="playerContainer">
<PersonStatus img={Person} state={Leave} name="bot3"/> {player.id!=winner?.id &&
*/} <>
<PersonStatus img={Person} state={Person} key={index} name={player.name} playerTouched={1} setPlayerTouched={() => {}} index={index} showCircle={false}/>
<h5 style={{width: 50}}>{indices[players.findIndex((p) => p.id == player?.id)].ToString("fr")}</h5>
</>
}
</div> </div>
))
}
</ul>
<div className='centerDivH'> <div className='centerDivH'>
<BigButtonNav dest="/lobby" img={Replay}/> <BigButtonNav dest="/lobby" img={Replay}/>
</div> </div>

@ -11,6 +11,7 @@
padding: 20px; padding: 20px;
margin-right: 10px; margin-right: 10px;
margin-left: 30px; margin-left: 30px;
} }
.lobby-vertical-divider{ .lobby-vertical-divider{
@ -54,3 +55,8 @@
font-size: 20px; font-size: 20px;
cursor: pointer; cursor: pointer;
} }
.centerButton {
display: flex;
justify-content: center;
}

@ -23,6 +23,8 @@ import { useNavigate } from 'react-router-dom';
import { socket } from "../SocketConfig"; import { socket } from "../SocketConfig";
import { random } from 'lodash'; import { random } from 'lodash';
import Player from '../model/Player'; import Player from '../model/Player';
import Human from '../model/Human';
import EasyBot from '../model/EasyBot';
@ -38,10 +40,14 @@ function Lobby() {
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);
const room = params.get('room'); const room = params.get('room');
function addBot(){
socket.emit("lobby joined", room, new EasyBot("botId" + Math.floor(Math.random() * 1000), "Bot" + Math.floor(Math.random() * 100)).toJson())
}
useEffect(() => { useEffect(() => {
if (first){ if (first){
first = false first = false
socket.emit("lobby joined", room, "test name" + Math.floor(Math.random() * 10)) socket.emit("lobby joined", room, new Human(socket.id, "Test" + Math.floor(Math.random() * 100)).toJson())
return () => { return () => {
socket.off('game created'); socket.off('game created');
@ -78,9 +84,10 @@ function Lobby() {
socket.on("new player", (tab) =>{ socket.on("new player", (tab) =>{
const tmpTab: Player[] = [] const tmpTab: Player[] = []
for (const p of tab){ for (const p of tab){
tmpTab.push(new Player(p.id, p.name)) tmpTab.push(JSONParser.JSONToPlayer(p))
console.log(tmpTab)
} }
setPlayersData(tab.map((p: any) => new Player(p.id, p.name))) setPlayersData(tmpTab)
}) })
const [codeShowed, setCodeShowed] = useState(true); const [codeShowed, setCodeShowed] = useState(true);
@ -111,6 +118,14 @@ function Lobby() {
{players.map((player, index) => ( {players.map((player, index) => (
<PlayerItemList key={player.id} pdp={PersonImg} name={player.name} id={player.id}/> <PlayerItemList key={player.id} pdp={PersonImg} name={player.name} id={player.id}/>
))} ))}
<div className='centerButton'>
<button className='button' onClick={addBot}
style={{
backgroundColor: theme.colors.primary,
borderColor: theme.colors.secondary}}>
+
</button>
</div>
</div> </div>
</div> </div>

@ -59,7 +59,7 @@
"nb_friends_indice_end": "friends", "nb_friends_indice_end": "friends",
"nb_sports_indice_start": "The suspect is playing", "nb_sports_indice_start": "The suspect is playing",
"nb_sports_indice_end": "sport", "nb_sports_indice_end": "sport(s)",
"sport_start": "The suspect plays at least", "sport_start": "The suspect plays at least",
"sport_end": "" "sport_end": ""

@ -0,0 +1,13 @@
import PersonNetwork from "./PersonsNetwork";
import Player from "./Player";
abstract class Bot extends Player{
constructor( id: string, name: string){
super(id, name);
}
abstract playRound(personNetwork : PersonNetwork, players: Player): [number, boolean]
}
export default Bot

@ -0,0 +1,28 @@
import Bot from "./Bot";
import Indice from "./Indices/Indice";
import PersonNetwork from "./PersonsNetwork";
import Player from "./Player";
class EasyBot extends Bot{
public indice: Indice | undefined
constructor(id: string, name: string){
super(id, name)
}
toJson() {
return {
type: "EasyBot",
id: this.id,
name: this.name,
};
}
playRound(personNetwork: PersonNetwork, players: Player): [number, boolean] {
return [1, false]
}
}
export default EasyBot

@ -11,9 +11,8 @@ class EdgesCreator{
CreateWorkingEdge(personNetwork: PersonNetwork, choosenPerson: Person, indice: Indice, indices: Indice[]){ CreateWorkingEdge(personNetwork: PersonNetwork, choosenPerson: Person, indice: Indice, indices: Indice[]){
let creator = IndiceEdgesFactory.Create(indice) let creator = IndiceEdgesFactory.Create(indice)
const nbMaxEdge = Math.floor(Math.random() * 5) + 1
creator.createWorkingEdges(personNetwork, choosenPerson, indices) const nbMaxEdge = creator.createWorkingEdges(personNetwork, choosenPerson, indices)
if (choosenPerson.getFriends().length < nbMaxEdge){ if (choosenPerson.getFriends().length < nbMaxEdge){
for (const p of personNetwork.getPersons()){ for (const p of personNetwork.getPersons()){

@ -0,0 +1,18 @@
import Player from "./Player";
class Human extends Player{
constructor(id: string, name: string){
super(id, name)
}
toJson() {
return {
type: "Human",
id: this.id,
name: this.name,
};
}
}
export default Human

@ -40,7 +40,7 @@ class ColorIndiceEdgesCreator implements IndiceEdgesCreator{
if (testEdgeWork < indices.length){ if (testEdgeWork < indices.length){
p.addFriend(person) p.addFriend(person)
person.addFriend(p) person.addFriend(p)
return 1 return Math.floor(Math.random() * 4)
} }
} }
} }

@ -13,7 +13,7 @@ class NbSportIndiceTester implements IndiceTester{
} }
Works(person: Person): boolean { Works(person: Person): boolean {
return this.nbSportIndice.getNbSport() == person.getSports().length return this.nbSportIndice.getNbSport().includes(person.getSports().length)
} }
} }

@ -2,21 +2,30 @@ import { GetJsonFile } from "../EnumExtender";
import Indice from "./Indice"; import Indice from "./Indice";
class NbSportIndice extends Indice { class NbSportIndice extends Indice {
private nbSport: number; private nbSport: number[];
constructor(id: number, nbSport: number) { constructor(id: number, nbSport: number[]) {
super(id); super(id);
this.nbSport = nbSport; this.nbSport = nbSport;
} }
public getNbSport(): number{ public getNbSport(): number[]{
return this.nbSport return this.nbSport
} }
// Implémentation de la méthode abstraite // Implémentation de la méthode abstraite
ToString(lang: string): string { ToString(lang: string): string {
let json = GetJsonFile(lang) let json = GetJsonFile(lang)
return `${json.nb_sports_indice_start} ${this.nbSport} ${json.nb_sports_indice_end}`; let string = `${json.nb_sports_indice_start}`;
this.nbSport.forEach((i, index) =>{
if (index == this.nbSport.length - 1){
string += i
}
else{
string += ` ${i} ${json.or} `
}
})
return string + ` ${json.nb_sports_indice_end}`
} }
toJSON() { toJSON() {

@ -13,30 +13,34 @@ class NetworkGenerator{
const tabAdo: number[] = [] const tabAdo: number[] = []
const tabAdulte: number[] = [] const tabAdulte: number[] = []
const tabVieux: number[] = [] const tabVieux: number[] = []
const tabTresVieux: number[] = []
const tabPerson: Person[] = [] const tabPerson: Person[] = []
const tabNames = json.names const tabNames = json.names
/*
let id = 0 let id = 0
for(let i = 0; i < nbPerson/4; i++){ for(let i = 0; i < nbPerson/5; i++){
const nombreAleatoire = Math.floor(Math.random() * 14) + 1; const nombreAleatoire = Math.floor(Math.random() * 14) + 1;
tabJeune.push(nombreAleatoire) tabJeune.push(nombreAleatoire)
} }
for(let i = 0; i < nbPerson/4; i++){ */
const nombreAleatoire = Math.floor(Math.random() * 5) + 15; for(let i = 0; i < nbPerson/3; i++){
const nombreAleatoire = Math.floor(Math.random() * 9) + 12;
tabAdo.push(nombreAleatoire) tabAdo.push(nombreAleatoire)
} }
for(let i = 0; i < nbPerson/4; i++){ for(let i = 0; i < nbPerson/3; i++){
const nombreAleatoire = Math.floor(Math.random() * 10) + 20; const nombreAleatoire = Math.floor(Math.random() * 10) + 20;
tabAdulte.push(nombreAleatoire) tabAdulte.push(nombreAleatoire)
} }
for(let i = 0; i < nbPerson/4; i++){ for(let i = 0; i < nbPerson/3; i++){
const nombreAleatoire = Math.floor(Math.random() * 31) + 30; const nombreAleatoire = Math.floor(Math.random() * 30) + 30;
tabVieux.push(nombreAleatoire) tabVieux.push(nombreAleatoire)
} }
const tabAge: number[][] = [tabJeune, tabAdo, tabAdulte, tabVieux]
const tabAge: number[][] = [tabAdo, tabAdulte, tabVieux]
let tmpTabSport=[...tabSports] let tmpTabSport=[...tabSports]
let tmpTabColor = [...tabColor] let tmpTabColor = [...tabColor]

@ -1,5 +1,4 @@
class Player{ abstract class Player{
public id: string public id: string
public name: string; public name: string;
@ -7,6 +6,8 @@ class Player{
this.id=id this.id=id
this.name=name this.name=name
} }
abstract toJson(): any
} }
export default Player export default Player

@ -48,9 +48,15 @@ class Stub{
} }
for (let i=1; i<3; i++){ for (let i=1; i<3; i++){
indices.push(new NbSportIndice(test, i)) for (let j=0; j<3; j++){
if (j==i){
continue
}
indices.push(new NbSportIndice(test, [i, j]))
test++ test++
} }
}
return indices return indices
} }
} }

Loading…
Cancel
Save