pull/51/head
Pierre Ferreira 1 year ago
commit aee2d6893e

@ -8,10 +8,16 @@
"name": "cryptide",
"version": "1.0.0",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.4.2",
"@fortawesome/free-regular-svg-icons": "^6.4.2",
"@fortawesome/free-solid-svg-icons": "^6.4.2",
"@fortawesome/react-fontawesome": "^0.2.0",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/lodash": "^4.14.200",
"bootstrap": "^5.3.2",
"lodash": "^4.17.21",
"react": "^18.2.0",
"react-bootstrap": "^2.9.1",
"react-dom": "^18.2.0",
@ -20,6 +26,7 @@
"react-router-dom": "^6.18.0",
"react-scripts": "5.0.1",
"typescript": "^5.2.2",
"vis-network": "^9.1.9",
"web-vitals": "^2.1.4"
}
},
@ -2404,6 +2411,18 @@
"postcss-selector-parser": "^6.0.10"
}
},
"node_modules/@egjs/hammerjs": {
"version": "2.0.17",
"resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz",
"integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==",
"peer": true,
"dependencies": {
"@types/hammerjs": "^2.0.36"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@ -2583,6 +2602,63 @@
"tslib": "^2.4.0"
}
},
"node_modules/@fortawesome/fontawesome-common-types": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz",
"integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==",
"hasInstallScript": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@fortawesome/fontawesome-svg-core": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz",
"integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==",
"hasInstallScript": true,
"dependencies": {
"@fortawesome/fontawesome-common-types": "6.4.2"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@fortawesome/free-regular-svg-icons": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz",
"integrity": "sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q==",
"hasInstallScript": true,
"dependencies": {
"@fortawesome/fontawesome-common-types": "6.4.2"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@fortawesome/free-solid-svg-icons": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz",
"integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==",
"hasInstallScript": true,
"dependencies": {
"@fortawesome/fontawesome-common-types": "6.4.2"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@fortawesome/react-fontawesome": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
"integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
"dependencies": {
"prop-types": "^15.8.1"
},
"peerDependencies": {
"@fortawesome/fontawesome-svg-core": "~1 || ~6",
"react": ">=16.3"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.13",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
@ -3933,6 +4009,25 @@
"tslib": "^2.4.0"
}
},
"node_modules/@testing-library/dom": {
"version": "9.3.3",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz",
"integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
"@types/aria-query": "^5.0.1",
"aria-query": "5.1.3",
"chalk": "^4.1.0",
"dom-accessibility-api": "^0.5.9",
"lz-string": "^1.5.0",
"pretty-format": "^27.0.2"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@testing-library/jest-dom": {
"version": "5.17.0",
"resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz",
@ -4161,6 +4256,12 @@
"@types/node": "*"
}
},
"node_modules/@types/hammerjs": {
"version": "2.0.44",
"resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.44.tgz",
"integrity": "sha512-pdGBkAh4ggfXAkiwgmTdROJe3mwvLWJYm6JiaAwCtskAU0Weh+JQyyMTbhvxjxD2n8sr8PrxVwyDzmpnK4pUrQ==",
"peer": true
},
"node_modules/@types/hoist-non-react-statics": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
@ -4257,6 +4358,11 @@
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
},
"node_modules/@types/lodash": {
"version": "4.14.201",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz",
"integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ=="
},
"node_modules/@types/mime": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz",
@ -6120,6 +6226,12 @@
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
},
"node_modules/component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"peer": true
},
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@ -11808,6 +11920,12 @@
"node": ">=4.0"
}
},
"node_modules/keycharm": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.4.0.tgz",
"integrity": "sha512-TyQTtsabOVv3MeOpR92sIKk/br9wxS+zGj4BG7CR8YbK4jM3tyIBaF0zhzeBUMx36/Q/iQLOKKOT+3jOQtemRQ==",
"peer": true
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@ -16827,6 +16945,54 @@
"node": ">= 0.8"
}
},
"node_modules/vis-data": {
"version": "7.1.8",
"resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.8.tgz",
"integrity": "sha512-h/cxRDVqnpqqpTBqwUbbKIpWVovOQ+h5rbFS/kio8TUH1np98Lv9bHdWZxahJlyzBaBR9KGvwGHB00jn3MjLbQ==",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/visjs"
},
"peerDependencies": {
"uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
"vis-util": "^5.0.1"
}
},
"node_modules/vis-network": {
"version": "9.1.9",
"resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.9.tgz",
"integrity": "sha512-Ft+hLBVyiLstVYSb69Q1OIQeh3FeUxHJn0WdFcq+BFPqs+Vq1ibMi2sb//cxgq1CP7PH4yOXnHxEH/B2VzpZYA==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/visjs"
},
"peerDependencies": {
"@egjs/hammerjs": "^2.0.0",
"component-emitter": "^1.3.0",
"keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0",
"uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
"vis-data": "^6.3.0 || ^7.0.0",
"vis-util": "^5.0.1"
}
},
"node_modules/vis-util": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.6.tgz",
"integrity": "sha512-HyAZ+x3q6/Xh6OFPIQOGPOPgnHL9KVNvWW6+k3aTCbAG8Tq7vncgRat6oY8ywZ7j1Fq0mOfUb6fLrFvfI9nUKg==",
"peer": true,
"engines": {
"node": ">=8"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/visjs"
},
"peerDependencies": {
"@egjs/hammerjs": "^2.0.0",
"component-emitter": "^1.3.0"
}
},
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",

@ -2,10 +2,16 @@
"name": "cryptide",
"version": "1.0.0",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.4.2",
"@fortawesome/free-regular-svg-icons": "^6.4.2",
"@fortawesome/free-solid-svg-icons": "^6.4.2",
"@fortawesome/react-fontawesome": "^0.2.0",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/lodash": "^4.14.200",
"bootstrap": "^5.3.2",
"lodash": "^4.17.21",
"react": "^18.2.0",
"react-bootstrap": "^2.9.1",
"react-dom": "^18.2.0",
@ -14,6 +20,7 @@
"react-router-dom": "^6.18.0",
"react-scripts": "5.0.1",
"typescript": "^5.2.2",
"vis-network": "^9.1.9",
"web-vitals": "^2.1.4"
},
"scripts": {

@ -9,6 +9,7 @@ import Login from './Pages/LoginForm';
import SignUp from './Pages/SignUpForm';
import Play from './Pages/Play';
import Lobby from './Pages/Lobby';
import InGame from './Pages/InGame';
import EndGame from './Pages/EndGame';
@ -39,7 +40,6 @@ function App() {
//const locale = 'fr';
const [locale, setLocale] = useState('fr');
//@ts-ignore
const changeLocale = (newLocale) => {
setLocale(newLocale);
@ -52,8 +52,6 @@ function App() {
// <img src={logo} className="App-logo" alt="logo" />
// </header>
// </div>
//@ts-ignore
<IntlProvider locale={locale} messages={messages[locale]}>
<BrowserRouter>
@ -64,8 +62,8 @@ function App() {
<Route path="/signup" element={<SignUp />} />
<Route path="/play" element={<Play/>} />
<Route path="/lobby" element={<Lobby/>} />
<Route path="/endgame" element={<EndGame/>} />
<Route path="/game" element={<InGame/>} />
</Routes>
</BrowserRouter>
</IntlProvider>

@ -0,0 +1,22 @@
.choice-bar-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.choice-bar-heading {
font-size: 1.5em;
color: #333;
}
.choice-bar-button {
margin: 5px;
padding: 10px;
background-color: lightseagreen;
color: #fff;
border: 2px solid grey;
border-radius: 5px;
cursor: pointer;
}

@ -0,0 +1,21 @@
import React from 'react';
import './ChoiceBar.css';
const ChoiceBar = () => {
const players = ['Player1', 'Player2', 'Player3'];
return (
<div className="choice-bar-container">
<h3 className="choice-bar-heading">Quel joueur voulez-vous interroger ?</h3>
<div>
{players.map((player, index) => (
<button key={index} className="choice-bar-button">
{player}
</button>
))}
</div>
</div>
);
};
export default ChoiceBar;

@ -0,0 +1,10 @@
#graph-container {
width: 100%;
height: 75vh;
display: flex;
flex-direction: column;
align-items: center;
background-color: #f5f5f5;
padding: 20px;
box-sizing: border-box;
}

@ -0,0 +1,143 @@
import React, { useEffect } from "react";
import { DataSet, Network} from "vis-network/standalone/esm/vis-network";
import EdgesCreator from "../source/EdgesCreator";
import GraphCreator from "../source/Graph/GraphCreator";
import IndiceChooser from "../source/IndiceChooser";
import SportIndice from "../source/Indices/SportIndice";
import NetworkGenerator from "../source/NetworkGenerator";
import Sport from "../source/Sport";
import Stub from "../source/Stub";
import "./GraphContainer.css";
import NodePerson from "../source/Graph/NodePerson";
import IndiceTesterFactory from "../source/Factory/IndiceTesterFactory";
const edgesCreator = new EdgesCreator()
const chooser = new IndiceChooser()
const indices = Stub.GenerateIndice()
const networkPerson = NetworkGenerator.GenerateNetwork(50)
const rand = Math.floor(Math.random() * 50)
const person = networkPerson.getPersons()[rand]
const choosenIndices = chooser.chooseIndice(networkPerson, person, indices, 8)
edgesCreator.CreateAllEdges(networkPerson, person, choosenIndices)
const graph = GraphCreator.CreateGraph(networkPerson)
let indice = new SportIndice(12, [Sport.TENNIS, Sport.BASEBALL])
console.log(networkPerson)
console.log(graph)
choosenIndices.forEach((indice) =>{
console.log(indice.ToString("fr"))
});
console.log(person)
const testIndice = choosenIndices[0]
interface MyGraphComponentProps {
onNodeClick: (shouldShowChoiceBar: boolean) => void;
}
const MyGraphComponent: React.FC<MyGraphComponentProps> = ({onNodeClick}) => {
useEffect(() => {
const container = document.getElementById('graph-container');
if (!container) {
console.error("Container not found");
return;
}
// Charger les données dans le graph
const nodes = new DataSet(graph.nodesPerson);
// Configuration des options du Graphe
const initialOptions = {
layout: {
improvedLayout: true,
hierarchical: {
enabled: false,
direction: 'LR', // LR (Left to Right) ou autre selon votre préférence
sortMethod: 'hubsize'
}
},
physics: {
enabled: true,
barnesHut: {
gravitationalConstant: -1000,
springConstant: 0.001,
springLength: 100
}
}
};
const networkData = { nodes: nodes, edges: graph.edges };
const network = new Network(container, networkData, initialOptions);
//TEST POUR MONTRER QU'IL Y EN A QU'UN A CHAQUE FOIS
/*
networkPerson.getPersons().forEach(p => {
let a = 0
for (let i of choosenIndices){
let tester = IndiceTesterFactory.Create(i)
if (tester.Works(p)){
a++
}
}
if (a==choosenIndices.length){
networkData.nodes.update({id: p.getId(), label: p.getName() + "\n🔵"})
}
});
*/
// Gérer le changement entre la physique et le déplacement manuel
network.on("dragging", (params) => {
if (params.nodes.length > 0) {
// Un nœud a été cliqué
initialOptions.physics.enabled = false;
network.setOptions(initialOptions);
}
});
network.on("click", (params) => {
if(params.nodes.length > 0){
//TEST POUR VOIR SI ON PEUT RAJOUTER DES TRUCS AU LABEL
const pers = networkPerson.getPersons().find((p) => p.getId() == params.nodes[0])
if (pers!=undefined){
const node = nodes.get().find((n) => params.nodes[0] == n.id)
if (node != undefined){
var tester = IndiceTesterFactory.Create(testIndice)
if (tester.Works(pers)){
networkData.nodes.update({id: params.nodes[0], label: node.label + "🔵"})
}
else{
networkData.nodes.update({id: params.nodes[0], label: node.label + "🟦"})
}
}
}
// Renvoyer un true pour afficher la choice bar
onNodeClick(true)
}
else{
// Renvoyer un false pour cacher la choice bar
onNodeClick(false)
}
});
}, []); // Le tableau vide signifie que cela ne s'exécutera qu'une fois après le premier rendu
return (
<>
<div id="graph-container"/>
</>
);
};
export default MyGraphComponent;

@ -6,6 +6,7 @@ import { FormattedMessage } from 'react-intl';
function Home() {
return (
<div className="home-container">

@ -0,0 +1,23 @@
import React, { useState } from 'react';
import GraphContainer from '../Components/GraphContainer';
import ChoiceBar from '../Components/ChoiceBar';
const InGame = () => {
const [showChoiceBar, setShowChoiceBar] = useState(false);
const handleNodeClick = (shouldShowChoiceBar: boolean) => {
setShowChoiceBar(shouldShowChoiceBar);
};
return (
<div>
<GraphContainer onNodeClick={handleNodeClick} />
<div id="bottom-container">
{showChoiceBar && <ChoiceBar />}
</div>
</div>
);
};
export default InGame;

@ -39,7 +39,7 @@ function Lobby() {
}
</ul>
<center>
<ButtonImgNav dest='/' img={cible} text=' À la chasse !'/> {/* page de baptiste ici */}
<ButtonImgNav dest='/game' img={cible} text=' À la chasse !'/> {/* page de baptiste ici */}
</center>
</div>
</div>

@ -0,0 +1,36 @@
import {
Network,
Options,
Data,
Edge,
Node
} from "vis-network/standalone/esm/vis-network";
import React, { useState, useLayoutEffect, useRef } from "react";
export interface UseVisNetworkOptions {
options: Options;
nodes: Node[];
edges: Edge[];
}
export default (props: UseVisNetworkOptions) => {
const { edges, nodes, options } = props;
const [network, addNetwork] = useState<Network | null>(null);
const ref = useRef<HTMLDivElement>(null);
const data: Data = { nodes, edges };
useLayoutEffect(() => {
if (ref.current) {
const instance = new Network(ref.current, data, options);
addNetwork(instance);
}
return () => network?.destroy();
}, []);
return {
network,
ref
};
};

@ -26,5 +26,41 @@
"create_room" : "Create room",
"play_solo" : "Single player",
"play" : "PLAY"
"play" : "PLAY",
"football": "Football",
"basketball": "Basketball",
"baseball": "Baseball",
"tennis": "Tennis",
"bowling": "Bowling",
"white": "White",
"black": "Black",
"blond": "Blond",
"redhead": "Red",
"brown": "Brown",
"and": "and",
"or": "or",
"or_sport": "or",
"age_indice_start": "The suspect is between",
"age_indice_more_start": "The suspect is older than or",
"age_indice_end": "years old",
"color_edges_start": "The suspect has at least one friend with",
"color_edges_end": "hair",
"color_start": "The suspect has",
"color_end": "hair",
"nb_friends_indice_start": "The suspect has at least",
"nb_friends_indice_end": "friends",
"nb_sports_indice_start": "The suspect is playing",
"nb_sports_indice_end": "sport",
"sport_start": "The suspect plays at least",
"sport_end": ""
}

@ -26,5 +26,40 @@
"join" : "Rejoindre",
"create_room" : "Créer une partie",
"play_solo" : "Jouer seul",
"play" : "JOUER"
"play" : "JOUER",
"football": "Football",
"basketball": "Basketball",
"baseball": "Baseball",
"tennis": "Tennis",
"bowling": "Bowling",
"white": "Blanc",
"black": "Noir",
"blond": "Blond",
"redhead": "Roux",
"brown": "Brun",
"and": "et",
"or": "ou",
"or_sport": "ou du",
"age_indice_start": "Le suspect a entre",
"age_indice_more_start": "Le suspect a ou a plus de",
"age_indice_end": "ans",
"color_edges_start": "Le suspect a au moins un ami avec les cheveux",
"color_edges_end": "",
"color_start": "Le suspect a les cheveux",
"color_end": "",
"nb_friends_indice_start": "Le suspect a au moins",
"nb_friends_indice_end": "amis",
"nb_sports_indice_start": "Le suspect pratique",
"nb_sports_indice_end": "sport(s)",
"sport_start": "Le suspect pratique au moins du",
"sport_end": ""
}

@ -0,0 +1,96 @@
{
"names": [
"Emma",
"Olivia",
"Sophia",
"Ava",
"Isabella",
"Mia",
"Amelia",
"Harper",
"Evelyn",
"Abigail",
"Emily",
"Charlotte",
"Scarlett",
"Grace",
"Lily",
"Aria",
"Chloe",
"Zoey",
"Penelope",
"Riley",
"Layla",
"Stella",
"Aurora",
"Natalie",
"Zoe",
"Lucy",
"Hannah",
"Leah",
"Victoria",
"Hazel",
"Violet",
"Aurora",
"Ruby",
"Ivy",
"Eleanor",
"Savannah",
"Alice",
"Claire",
"Nora",
"Lillian",
"Mila",
"Peyton",
"Aaliyah",
"Gabriella",
"Eliana",
"Bella",
"Sadie",
"Hailey",
"Aurora",
"Liam",
"Noah",
"Oliver",
"Elijah",
"William",
"James",
"Benjamin",
"Lucas",
"Henry",
"Alexander",
"Jackson",
"Aiden",
"Sebastian",
"Carter",
"Daniel",
"Matthew",
"Wyatt",
"Jack",
"Jayden",
"Owen",
"Noah",
"Ethan",
"Mason",
"Logan",
"Caden",
"Samuel",
"David",
"Joseph",
"Michael",
"Gabriel",
"Caleb",
"Ryan",
"Isaac",
"Luke",
"Andrew",
"Nathan",
"Dylan",
"Adam",
"Joshua",
"Connor",
"Brayden",
"Julian"
]
}

@ -0,0 +1,9 @@
enum Color {
WHITE,
BLACK,
BLOND,
REDHEAD,
BROWN,
}
export default Color

@ -0,0 +1,117 @@
import IndiceTesterFactory from "./Factory/IndiceTesterFactory";
import EdgesIndice from "./Indices/EdgesIndice";
import Indice from "./Indices/Indice";
import Person from "./Person";
import PersonNetwork from "./PersonsNetwork";
import cloneDeep from 'lodash/cloneDeep';
import IndiceEdgesFactory from "./Factory/IndiceEdgesCreatorFactory";
class EdgesCreator{
CreateWorkingEdge(personNetwork: PersonNetwork, choosenPerson: Person, indice: Indice, indices: Indice[]){
let creator = IndiceEdgesFactory.Create(indice)
const nbMaxEdge = Math.floor(Math.random() * 5) + 1
creator.createWorkingEdges(personNetwork, choosenPerson, indices)
if (choosenPerson.getFriends().length < nbMaxEdge){
for (const p of personNetwork.getPersons()){
if (choosenPerson.getFriends().length == nbMaxEdge){
return
}
if (p!=choosenPerson && !choosenPerson.getFriends().includes(p)){
let testEdgeWork = 0
const p1 = cloneDeep(p);
const personEdge = cloneDeep(choosenPerson);
p1.addFriend(personEdge)
personEdge.addFriend(p1)
indices.forEach((indice) => {
const tester = IndiceTesterFactory.Create(indice)
if (tester.Works(p1)){
testEdgeWork ++
}
});
if (testEdgeWork < indices.length){
p.addFriend(choosenPerson)
choosenPerson.addFriend(p)
}
}
}
}
}
CreateNotWorkingEdge(personNetwork: PersonNetwork, personToCreateEdge: Person, choosenPerson: Person, indices: Indice[], map: Map<number, number>){
const test = [...personNetwork.getPersons()]
shuffleArray(test)
test.forEach((p) => {
if (personToCreateEdge.getFriends().length == map.get(personToCreateEdge.getId())){
return
}
if (p != personToCreateEdge && p != choosenPerson && !personToCreateEdge.getFriends().includes(p)){
let testEdgeWork1 = 0
let testEdgeWork2 = 0
const p1 = cloneDeep(p);
const personEdge = cloneDeep(personToCreateEdge);
p1.addFriend(personEdge)
personEdge.addFriend(p1)
indices.forEach((indice) => {
const tester = IndiceTesterFactory.Create(indice)
if (tester.Works(p1) || map.get(p.getId()) === p.getFriends().length){
testEdgeWork1 ++
}
if (tester.Works(personEdge) || map.get(p.getId()) === p.getFriends().length){
testEdgeWork2 ++
}
});
if (testEdgeWork1 < indices.length && testEdgeWork2 < indices.length){
p.addFriend(personToCreateEdge)
personToCreateEdge.addFriend(p)
}
}
});
}
CreateAllEdges(personNetwork: PersonNetwork, choosenPerson: Person, indices: Indice[]){
const test = new Map<number, number>()
const tabEdgesSize: number[] = []
for (let i = 0; i<personNetwork.getPersons().length / 4; i++){
tabEdgesSize.push(1)
tabEdgesSize.push(2)
tabEdgesSize.push(3)
tabEdgesSize.push(4)
}
indices.forEach(indice => {
if (indice instanceof EdgesIndice){
this.CreateWorkingEdge(personNetwork, choosenPerson, indice, indices)
}
});
personNetwork.getPersons().forEach((p) => {
if (p != choosenPerson){
const rand = Math.floor(Math.random() * 4)
test.set(p.getId(), tabEdgesSize[rand] + p.getFriends().length)
tabEdgesSize.splice(rand, 1)
}
});
personNetwork.getPersons().forEach((p) => {
if (p != choosenPerson){
this.CreateNotWorkingEdge(personNetwork, p, choosenPerson, indices, test)
}
});
}
}
function shuffleArray(array: Person[]) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
export default EdgesCreator

@ -0,0 +1,99 @@
import Color from "./Color";
import Sport from "./Sport";
import React from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faFutbol, faBasketballBall } from '@fortawesome/free-solid-svg-icons';
import { parseJsonText } from "typescript";
function GetJsonFile(lang: string){
const response = require(`../Translations/${lang}.json`);
const data = response;
return data
}
function ColorToString(color: Color, lang: string): string{
let json = GetJsonFile(lang)
switch(color){
case Color.WHITE:
return json.white
case Color.BLACK:
return json.black
case Color.BLOND:
return json.blond
case Color.REDHEAD:
return json.redhead
case Color.BROWN:
return json.brown
}
}
function ColorToHexa(color: Color): string{
switch(color){
case Color.WHITE:
return "#FFFFFF"
case Color.BLACK:
return "#000000"
case Color.BLOND:
return "#E2BC74"
case Color.REDHEAD:
return "#FF8B00"
case Color.BROWN:
return "#5B3C11"
}
}
function ColorToColorFont(color: Color): string{
switch(color){
case Color.WHITE:
return "#000000"
case Color.BLACK:
return "#FFFFFF"
case Color.BLOND:
return "#000000"
case Color.REDHEAD:
return "#000000"
case Color.BROWN:
return "#FFFFFF"
}
}
function SportToString(sport: Sport, lang: string): string{
let json = GetJsonFile(lang)
switch(sport){
case Sport.FOOT:
return json.football
case Sport.BASEBALL:
return json.baseball
case Sport.BASKET:
return json.basketball
case Sport.TENNIS:
return json.tennis
case Sport.BOWLING:
return json.bowling
case Sport.AUCUN:
return ""
}
}
function SportToIcon(sport: Sport): string{
switch(sport){
case Sport.FOOT:
return "⚽"
case Sport.BASEBALL:
return "⚾"
case Sport.BASKET:
return "🏀"
case Sport.TENNIS:
return "🎾"
case Sport.BOWLING:
return "🎳"
case Sport.AUCUN:
return ""
}
}
export {ColorToString, SportToString, ColorToHexa, ColorToColorFont, SportToIcon, GetJsonFile}

@ -0,0 +1,27 @@
import ColorIndiceEdgesCreator from "../IndiceEdgesCreator.ts/ColorIndiceEdgesCreator";
import IndiceEdgesCreator from "../IndiceEdgesCreator.ts/IndiceEdgesCreator";
import NbEdgesIndiceEdgesCreator from "../IndiceEdgesCreator.ts/NbEdgesIndiceEdgesCreator";
import AgeIndice from "../Indices/AgeIndice";
import ColorEdgesIndice from "../Indices/ColorEdgesIndice";
import ColorIndice from "../Indices/ColorIndice";
import Indice from "../Indices/Indice";
import NbEdgesIndice from "../Indices/NbEdgesIndice";
import ColorIndiceTester from "../IndiceTester/ColorIndiceTester";
import IndiceTester from "../IndiceTester/IndiceTester";
import IndiceTesterAge from "../IndiceTester/IndiceTesterAge";
import NbEdgesIndiceTester from "../IndiceTester/NbEdgesIndiceTester";
class IndiceEdgesFactory{
static Create(indice: Indice): IndiceEdgesCreator{
if (indice instanceof NbEdgesIndice){
return new NbEdgesIndiceEdgesCreator(indice)
}
if (indice instanceof ColorEdgesIndice){
return new ColorIndiceEdgesCreator(indice)
}
throw new Error("Method not finished.");
}
}
export default IndiceEdgesFactory

@ -0,0 +1,41 @@
import AgeIndice from "../Indices/AgeIndice";
import ColorEdgesIndice from "../Indices/ColorEdgesIndice";
import ColorIndice from "../Indices/ColorIndice";
import Indice from "../Indices/Indice";
import NbEdgesIndice from "../Indices/NbEdgesIndice";
import NbSportIndice from "../Indices/NbSportIndice";
import SportIndice from "../Indices/SportIndice";
import ColorEdgesIndiceTester from "../IndiceTester/ColorIndiceEdgesTester";
import ColorIndiceTester from "../IndiceTester/ColorIndiceTester";
import IndiceTester from "../IndiceTester/IndiceTester";
import IndiceTesterAge from "../IndiceTester/IndiceTesterAge";
import NbEdgesIndiceTester from "../IndiceTester/NbEdgesIndiceTester";
import NbSportIndiceTester from "../IndiceTester/NbSportIndiceTester";
import SportIndiceTester from "../IndiceTester/SportIndiceTester";
class IndiceTesterFactory{
static Create(indice: Indice): IndiceTester{
if (indice instanceof AgeIndice){
return new IndiceTesterAge(indice)
}
if (indice instanceof NbEdgesIndice){
return new NbEdgesIndiceTester(indice)
}
if (indice instanceof ColorIndice){
return new ColorIndiceTester(indice)
}
if (indice instanceof ColorEdgesIndice){
return new ColorEdgesIndiceTester(indice)
}
if (indice instanceof SportIndice){
return new SportIndiceTester(indice)
}
if (indice instanceof NbSportIndice){
return new NbSportIndiceTester(indice)
}
throw new Error("Method not finished.");
}
}
export default IndiceTesterFactory

@ -0,0 +1,12 @@
class Edge{
public from: number
public to: number
constructor(from: number, to: number){
this.from = from
this.to = to
}
}
export default Edge

@ -0,0 +1,14 @@
class Font{
public color: string
public size: number
public align: string
constructor(color: string, size: number, align: string){
this.color=color
this.size=size
this.align=align
}
}
export default Font

@ -0,0 +1,35 @@
import Edge from "./Edge";
import { ColorToColorFont, ColorToHexa, SportToIcon, SportToString } from "../EnumExtender";
import GraphPerson from "./GraphPerson";
import NodePerson from "./NodePerson";
import PersonNetwork from "../PersonsNetwork";
import Font from "./Font";
class GraphCreator{
static CreateGraph(network: PersonNetwork): GraphPerson{
const nodesPerson : NodePerson[] = []
const edges: Edge[] = []
network.getPersons().forEach((p) =>{
let label = p.getName() + "\n" + p.getAge() + "\n"
for (let i = 0; i<p.getSports().length; i++){
label += SportToIcon(p.getSports()[i])
}
label += "\n"
const nodePerson = new NodePerson(p.getId(), label, p.getColor(), new Font(ColorToColorFont(p.getColor()), 14, 'center'), 'box')
nodesPerson.push(nodePerson)
p.getFriends().forEach((f) =>{
if(edges.some(edge => (edge.from === f.getId() && edge.to === p.getId()) || (edge.from === p.getId() && edge.to === f.getId()))){
return;
}
edges.push(new Edge(p.getId(), f.getId()))
});
});
return new GraphPerson(edges, nodesPerson)
}
}
export default GraphCreator

@ -0,0 +1,17 @@
import Edge from "./Edge";
import NodePerson from "./NodePerson";
class GraphPerson{
public edges: Edge[]
public nodesPerson: NodePerson[]
constructor(edges: Edge[], nodesPerson: NodePerson[]){
this.edges = edges
this.nodesPerson = nodesPerson
}
}
export default GraphPerson

@ -0,0 +1,21 @@
import Color from "../Color"
import { ColorToColorFont, ColorToHexa } from "../EnumExtender"
import Font from "./Font"
class NodePerson{
public id: number
public label: string
public color: string
public font: Font
public shape: string
constructor(id: number, label: string, color: Color, font: Font, shape: string){
this.id=id
this.label=label
this.color=ColorToHexa(color)
this.font=font
this.shape = shape
}
}
export default NodePerson

@ -0,0 +1,75 @@
import IndiceTesterFactory from "./Factory/IndiceTesterFactory";
import EdgesIndice from "./Indices/EdgesIndice";
import Indice from "./Indices/Indice";
import Person from "./Person";
import PersonNetwork from "./PersonsNetwork";
import cloneDeep from 'lodash/cloneDeep';
import IndiceEdgesFactory from "./Factory/IndiceEdgesCreatorFactory";
import AgeIndice from "./Indices/AgeIndice";
import ColorIndice from "./Indices/ColorIndice";
import SportIndice from "./Indices/SportIndice";
import NbSportIndice from "./Indices/NbSportIndice";
class IndiceChooser{
chooseIndice(personNetwork: PersonNetwork, choosenPerson: Person, indices: Indice[], nbPlayer: number): Indice[]{
const choosenIndices: Indice[] = []
const ageIndice : Indice[] = []
const sportIndice : Indice[] = []
const colorIndice : Indice[] = []
const edgeIndice : Indice[] = []
const nbSportIndice : Indice[] = []
const tabIndice: Indice[][] = []
for (const indice of indices){
if (indice instanceof EdgesIndice){
edgeIndice.push(indice)
continue
}
const tester = IndiceTesterFactory.Create(indice)
if (tester.Works(choosenPerson)){
if (indice instanceof AgeIndice){
ageIndice.push(indice)
}
else if(indice instanceof ColorIndice){
colorIndice.push(indice)
}
else if(indice instanceof SportIndice){
sportIndice.push(indice)
}
else if(indice instanceof NbSportIndice){
nbSportIndice.push(indice)
}
}
}
let test = [...tabIndice]
if (ageIndice.length > 0) tabIndice.push(ageIndice)
if (colorIndice.length > 0) tabIndice.push(colorIndice)
if (sportIndice.length > 0) tabIndice.push(sportIndice)
if (nbSportIndice.length > 0) tabIndice.push(nbSportIndice)
for (let i = 0; i<nbPlayer-1; i++){
if (test.length == 0){
if (ageIndice.length > 0) test.push(ageIndice)
if (colorIndice.length > 0) test.push(colorIndice)
if (sportIndice.length > 0) test.push(sportIndice)
if (nbSportIndice.length > 0) test.push(nbSportIndice)
}
const rand = Math.floor(Math.random() * test.length)
const rand2 = Math.floor(Math.random() * test[rand].length)
choosenIndices.push(test[rand][rand2])
test[rand].splice(rand2, 1)
test.splice(rand, 1)
}
const rand = Math.floor(Math.random() * edgeIndice.length)
choosenIndices.push(edgeIndice[rand])
return choosenIndices
}
}
export default IndiceChooser

@ -0,0 +1,53 @@
import cloneDeep from "lodash/cloneDeep";
import IndiceTesterFactory from "../Factory/IndiceTesterFactory";
import ColorEdgesIndice from "../Indices/ColorEdgesIndice";
import ColorIndice from "../Indices/ColorIndice";
import EdgesIndice from "../Indices/EdgesIndice";
import Indice from "../Indices/Indice";
import NbEdgesIndice from "../Indices/NbEdgesIndice";
import ColorEdgesIndiceTester from "../IndiceTester/ColorIndiceEdgesTester";
import ColorIndiceTester from "../IndiceTester/ColorIndiceTester";
import NbEdgesIndiceTester from "../IndiceTester/NbEdgesIndiceTester";
import Person from "../Person";
import PersonNetwork from "../PersonsNetwork";
import IndiceEdgesCreator from "./IndiceEdgesCreator";
class ColorIndiceEdgesCreator implements IndiceEdgesCreator{
private indice: ColorEdgesIndice
constructor(indice: ColorEdgesIndice){
this.indice = indice
}
createWorkingEdges(personNetwork: PersonNetwork, person: Person, indices: Indice[]): number {
let indiceTest = new ColorEdgesIndiceTester(this.indice)
for (const p of personNetwork.getPersons()){
let a = false
if (p!=person){
let testEdgeWork = 0
const p1 = cloneDeep(p)
p1.addFriend(person)
const choosenOne = cloneDeep(person)
choosenOne.addFriend(p1)
if (indiceTest.Works(choosenOne)){
for (const indice of indices){
const tester = IndiceTesterFactory.Create(indice)
if (tester.Works(p1)){
testEdgeWork ++
}
}
if (testEdgeWork < indices.length){
p.addFriend(person)
person.addFriend(p)
return 1
}
}
}
}
return person.getFriends().length
}
}
export default ColorIndiceEdgesCreator

@ -0,0 +1,9 @@
import Indice from "../Indices/Indice";
import Person from "../Person";
import PersonNetwork from "../PersonsNetwork";
interface IndiceEdgesCreator{
createWorkingEdges(personNetwork: PersonNetwork, person: Person, indices: Indice[]): number
}
export default IndiceEdgesCreator

@ -0,0 +1,47 @@
import cloneDeep from "lodash/cloneDeep";
import IndiceTesterFactory from "../Factory/IndiceTesterFactory";
import EdgesIndice from "../Indices/EdgesIndice";
import Indice from "../Indices/Indice";
import NbEdgesIndice from "../Indices/NbEdgesIndice";
import NbEdgesIndiceTester from "../IndiceTester/NbEdgesIndiceTester";
import Person from "../Person";
import PersonNetwork from "../PersonsNetwork";
import IndiceEdgesCreator from "./IndiceEdgesCreator";
class NbEdgesIndiceEdgesCreator implements IndiceEdgesCreator{
private indice: NbEdgesIndice
constructor(indice: NbEdgesIndice){
this.indice = indice
}
createWorkingEdges(personNetwork: PersonNetwork, person: Person, indices: Indice[]): number {
let indiceTest = new NbEdgesIndiceTester(this.indice)
const nbEdges = this.indice.getNbEdges() + Math.floor(Math.random() * 2)
personNetwork.getPersons().forEach(p => {
if (person.getFriends().length == nbEdges){
return
}
if (p!=person){
let testEdgeWork = 0
const p1 = cloneDeep(p)
p1.addFriend(person)
indices.forEach((indice) => {
const tester = IndiceTesterFactory.Create(indice)
if (tester.Works(p1)){
testEdgeWork ++
}
});
if (testEdgeWork < indices.length){
p.addFriend(person)
person.addFriend(p)
}
}
});
return person.getFriends().length
}
}
export default NbEdgesIndiceEdgesCreator

@ -0,0 +1,36 @@
import AgeIndice from "../Indices/AgeIndice";
import ColorEdgesIndice from "../Indices/ColorEdgesIndice";
import ColorIndice from "../Indices/ColorIndice";
import Person from "../Person";
import IndiceTester from "./IndiceTester";
class ColorEdgesIndiceTester implements IndiceTester{
private colorEdgesIndice: ColorEdgesIndice
constructor(colorEdgesIndice: ColorEdgesIndice){
this.colorEdgesIndice = colorEdgesIndice;
}
Works(person: Person): boolean {
let res = false
person.getFriends().forEach(p => {
if(this.colorEdgesIndice.getColors().includes(p.getColor())){
res = true
return true
}
});
return res
}
TestWorks(person: Person): boolean {
person.getFriends().forEach(p => {
if(this.colorEdgesIndice.getColors().includes(p.getColor())){
return true
}
});
return false
}
}
export default ColorEdgesIndiceTester

@ -0,0 +1,23 @@
import AgeIndice from "../Indices/AgeIndice";
import ColorIndice from "../Indices/ColorIndice";
import Person from "../Person";
import IndiceTester from "./IndiceTester";
class ColorIndiceTester implements IndiceTester{
private colorIndice: ColorIndice
constructor(colorIndice: ColorIndice){
this.colorIndice = colorIndice;
}
Works(person: Person): boolean {
return this.colorIndice.getColors().includes(person.getColor())
}
TestWorks(person: Person): boolean {
return this.colorIndice.getColors().includes(person.getColor())
}
}
export default ColorIndiceTester

@ -0,0 +1,10 @@
import Indice from "../Indices/Indice"
import Person from "../Person"
interface IndiceTester{
Works(person: Person): boolean
TestWorks(person: Person): boolean
}
export default IndiceTester

@ -0,0 +1,22 @@
import AgeIndice from "../Indices/AgeIndice";
import Person from "../Person";
import IndiceTester from "./IndiceTester";
class IndiceTesterAge implements IndiceTester{
private ageIndice: AgeIndice
constructor(ageIndice: AgeIndice){
this.ageIndice = ageIndice;
}
Works(person: Person): boolean {
return person.getAge() >= this.ageIndice.getMinimum() && person.getAge()<= this.ageIndice.getMaximum()
}
TestWorks(person: Person): boolean {
return person.getAge() >= this.ageIndice.getMinimum() && person.getAge()<this.ageIndice.getMaximum()
}
}
export default IndiceTesterAge

@ -0,0 +1,23 @@
import AgeIndice from "../Indices/AgeIndice";
import NbEdgesIndice from "../Indices/NbEdgesIndice";
import Person from "../Person";
import IndiceTester from "./IndiceTester";
class NbEdgesIndiceTester implements IndiceTester{
private nbEdgesIndice: NbEdgesIndice
constructor(nbEdgesIndice: NbEdgesIndice){
this.nbEdgesIndice = nbEdgesIndice;
}
Works(person: Person): boolean {
return person.getFriends().length >= this.nbEdgesIndice.getNbEdges()
}
TestWorks(person: Person): boolean {
return true
}
}
export default NbEdgesIndiceTester

@ -0,0 +1,24 @@
import AgeIndice from "../Indices/AgeIndice";
import ColorIndice from "../Indices/ColorIndice";
import NbSportIndice from "../Indices/NbSportIndice";
import Person from "../Person";
import IndiceTester from "./IndiceTester";
class NbSportIndiceTester implements IndiceTester{
private nbSportIndice: NbSportIndice
constructor(nbSportIndice: NbSportIndice){
this.nbSportIndice = nbSportIndice;
}
Works(person: Person): boolean {
return this.nbSportIndice.getNbSport() == person.getSports().length
}
TestWorks(person: Person): boolean {
return this.nbSportIndice.getNbSport() == person.getSports().length
}
}
export default NbSportIndiceTester

@ -0,0 +1,34 @@
import AgeIndice from "../Indices/AgeIndice";
import ColorIndice from "../Indices/ColorIndice";
import SportIndice from "../Indices/SportIndice";
import Person from "../Person";
import IndiceTester from "./IndiceTester";
class SportIndiceTester implements IndiceTester{
private sportIndice: SportIndice
constructor(sportIndice: SportIndice){
this.sportIndice = sportIndice;
}
Works(person: Person): boolean {
for (const sport of person.getSports()){
if (this.sportIndice.getSports().includes(sport)){
return true
}
}
return false
}
TestWorks(person: Person): boolean {
for (const sport of person.getSports()){
if (this.sportIndice.getSports().includes(sport)){
return true
}
}
return false
}
}
export default SportIndiceTester

@ -0,0 +1,33 @@
import { GetJsonFile } from "../EnumExtender";
import Indice from "./Indice";
class AgeIndice extends Indice {
private maximum: number;
private minimum: number;
constructor(id: number, minimum: number, maximum: number) {
super(id);
this.minimum = minimum;
this.maximum = maximum;
}
// Implémentation de la méthode abstraite
ToString(lang: string): string {
let json = GetJsonFile(lang)
if (this.maximum > 100){
return `${json.age_indice_more_start} ${this.minimum} ${json.age_indice_end}`
}
return `${json.age_indice_start} ${this.minimum} ${json.and} ${this.maximum} ${json.age_indice_end}`
}
getMinimum(): number{
return this.minimum
}
getMaximum(): number{
return this.maximum
}
}
export default AgeIndice

@ -0,0 +1,34 @@
import Color from "../Color";
import { ColorToString, GetJsonFile } from "../EnumExtender";
import EdgesIndice from "./EdgesIndice";
class ColorEdgesIndice extends EdgesIndice {
private neighborsColors: Color[];
constructor(id: number, neighborsColors: Color[]) {
super(id);
this.neighborsColors = neighborsColors;
}
public getColors(): Color[]{
return this.neighborsColors
}
// Implémentation de la méthode abstraite
ToString(lang: string): string {
let json = GetJsonFile(lang)
let string = json.color_edges_start;
for (let i = 0; i<this.neighborsColors.length; i++){
if (i==this.neighborsColors.length - 1 || this.neighborsColors.length == 1){
string = `${string} ${ColorToString(this.neighborsColors[i], lang)}`
}
else{
string = `${string} ${ColorToString(this.neighborsColors[i], lang)} ${json.or}`
}
}
return `${string} ${json.color_edges_end}`
}
}
export default ColorEdgesIndice

@ -0,0 +1,33 @@
import Color from "../Color";
import { ColorToString, GetJsonFile } from "../EnumExtender";
import Indice from "./Indice";
class ColorIndice extends Indice {
private colors: Color[]
constructor(id: number, colors: Color[]) {
super(id);
this.colors = colors
}
// Implémentation de la méthode abstraite
ToString(lang: string): string {
let json = GetJsonFile(lang)
let string = json.color_start;
for (let i = 0; i<this.colors.length; i++){
if (i==this.colors.length - 1 || this.colors.length == 1){
string = `${string} ${ColorToString(this.colors[i], lang)}`
}
else{
string = `${string} ${ColorToString(this.colors[i], lang)} ${json.or}`
}
}
return `${string} ${json.color_end}`
}
getColors(): Color[]{
return this.colors
}
}
export default ColorIndice

@ -0,0 +1,6 @@
import Indice from "./Indice";
abstract class EdgesIndice extends Indice {
}
export default EdgesIndice

@ -0,0 +1,23 @@
abstract class Indice {
protected id: number;
constructor(id: number) {
this.id = id;
}
// Getter and setter for id
getId(): number {
return this.id;
}
setId(id: number): void {
this.id = id;
}
// Méthode abstraite pour être implémentée par les classes dérivées
abstract ToString(lang: string): string;
}
export default Indice

@ -0,0 +1,23 @@
import { GetJsonFile } from "../EnumExtender";
import EdgesIndice from "./EdgesIndice";
class NbEdgesIndice extends EdgesIndice {
private nbNeighbors: number;
constructor(id: number, nbNeighbors: number) {
super(id);
this.nbNeighbors = nbNeighbors;
}
public getNbEdges(): number{
return this.nbNeighbors
}
// Implémentation de la méthode abstraite
ToString(lang: string): string {
let json = GetJsonFile(lang)
return `${json.nb_friends_indice_start} ${this.nbNeighbors} ${json.nb_friends_indice_end}`;
}
}
export default NbEdgesIndice

@ -0,0 +1,23 @@
import { GetJsonFile } from "../EnumExtender";
import Indice from "./Indice";
class NbSportIndice extends Indice {
private nbSport: number;
constructor(id: number, nbSport: number) {
super(id);
this.nbSport = nbSport;
}
public getNbSport(): number{
return this.nbSport
}
// Implémentation de la méthode abstraite
ToString(lang: string): string {
let json = GetJsonFile(lang)
return `${json.nb_sports_indice_start} ${this.nbSport} ${json.nb_sports_indice_end}`;
}
}
export default NbSportIndice

@ -0,0 +1,34 @@
import { GetJsonFile, SportToString } from "../EnumExtender";
import Sport from "../Sport";
import Indice from "./Indice";
class SportIndice extends Indice {
private sports: Sport[]
constructor(id: number, sports: Sport[]) {
super(id);
this.sports = sports
}
// Implémentation de la méthode abstraite
ToString(lang: string): string {
let json = GetJsonFile(lang)
let string = json.sport_start;
for (let i = 0; i<this.sports.length; i++){
if (i==this.sports.length - 1 || this.sports.length == 1){
string = `${string} ${SportToString(this.sports[i], lang)}`
}
else{
string = `${string} ${SportToString(this.sports[i], lang)} ${json.or_sport}`
}
}
return `${string} ${json.sport_end}`
}
getSports(): Sport[]{
return this.sports
}
}
export default SportIndice

@ -0,0 +1,77 @@
import Color from "./Color";
import Person from "./Person";
import PersonNetwork from "./PersonsNetwork";
import Sport from "./Sport";
class NetworkGenerator{
static GenerateNetwork(nbPerson: number): PersonNetwork{
let json = require("../res/names.json")
const tabSports: Sport[] = [0, 1, 2, 3, 4, 5, 5, 5, 5]
const tabColor: Color[] = [0, 1, 2, 3, 4]
const tabJeune: number[] = []
const tabAdo: number[] = []
const tabAdulte: number[] = []
const tabVieux: number[] = []
const tabPerson: Person[] = []
const tabNames = json.names
let id = 0
for(let i = 0; i < nbPerson/4; i++){
const nombreAleatoire = Math.floor(Math.random() * 14) + 1;
tabJeune.push(nombreAleatoire)
}
for(let i = 0; i < nbPerson/4; i++){
const nombreAleatoire = Math.floor(Math.random() * 5) + 15;
tabAdo.push(nombreAleatoire)
}
for(let i = 0; i < nbPerson/4; i++){
const nombreAleatoire = Math.floor(Math.random() * 10) + 20;
tabAdulte.push(nombreAleatoire)
}
for(let i = 0; i < nbPerson/4; i++){
const nombreAleatoire = Math.floor(Math.random() * 31) + 30;
tabVieux.push(nombreAleatoire)
}
const tabAge: number[][] = [tabJeune, tabAdo, tabAdulte, tabVieux]
let tmpTabSport=[...tabSports]
let tmpTabColor = [...tabColor]
for (let i = 0; i<nbPerson; i++){
const randName = Math.floor(Math.random() * tabNames.length)
const name = tabNames[randName]
tabNames.splice(randName, 1)
if (tmpTabColor.length == 0){
tmpTabColor = [...tabColor]
}
let sports = []
for (let j = 0; j < 3; j++){
if (tmpTabSport.length == 0) tmpTabSport = [...tabSports]
const rand = Math.floor(Math.random() * tmpTabSport.length)
if (tmpTabSport[rand] != Sport.AUCUN){
sports.push(tmpTabSport[rand])
}
tmpTabSport.splice(rand, 1)
}
const randCol = Math.floor(Math.random() * tmpTabColor.length)
const color = tmpTabColor[randCol]
tmpTabColor.splice(randCol, 1)
const randAge = Math.floor(Math.random() * tabAge.length)
const randAge2 = Math.floor(Math.random() * tabAge[randAge].length)
const age = tabAge[randAge][randAge2]
tabAge[randAge].splice(randAge2, 1)
if (tabAge[randAge].length == 0){
tabAge.splice(randAge, 1)
}
tabPerson.push(new Person(i, name, age, color, sports, []))
}
return new PersonNetwork(tabPerson)
}
}
export default NetworkGenerator

@ -0,0 +1,83 @@
import Sport from "./Sport";
import Color from "./Color";
class Person {
private id: number;
private name: string;
private age: number;
private color: Color;
private sports: Sport[];
private friends: Person[];
constructor(id: number, name: string, age: number, color: Color, sports: Sport[], friends: Person[]) {
this.id = id;
this.name = name;
this.age = age;
this.color = color;
this.sports = sports;
this.friends = friends;
}
getId(): number {
return this.id;
}
setId(id: number): void {
this.id = id;
}
// Getter and setter for name
getName(): string {
return this.name;
}
setName(name: string): void {
this.name = name;
}
// Getter and setter for age
getAge(): number {
return this.age;
}
setAge(age: number): void {
this.age = age;
}
// Getter and setter for color
getColor(): Color {
return this.color;
}
setColor(color: Color): void {
this.color = color;
}
// Getter and setter for sports
getSports(): Sport[] {
return this.sports;
}
addSport(sport: Sport): void {
this.sports.push(sport)
}
setSports(sports: Sport[]): void {
this.sports = sports;
}
// Getter and setter for friends
getFriends(): Person[] {
return this.friends;
}
addFriend(friend: Person): void {
this.friends.push(friend);
}
setFriends(friends: Person[]): void {
this.friends = friends;
}
}
export default Person

@ -0,0 +1,23 @@
import Person from "./Person";
class PersonNetwork{
private persons : Person[]
constructor(persons: Person[]){
this.persons = persons;
}
getPersons(): Person[]{
return this.persons;
}
setPersons(persons: Person[]){
this.persons = persons
}
addPerson(person: Person){
this.persons.push(person)
}
}
export default PersonNetwork

@ -0,0 +1,11 @@
enum Sport {
FOOT,
BASEBALL,
BASKET,
TENNIS,
BOWLING,
AUCUN
}
export default Sport

@ -0,0 +1,57 @@
import Color from "./Color"
import AgeIndice from "./Indices/AgeIndice"
import ColorEdgesIndice from "./Indices/ColorEdgesIndice"
import ColorIndice from "./Indices/ColorIndice"
import Indice from "./Indices/Indice"
import NbEdgesIndice from "./Indices/NbEdgesIndice"
import NbSportIndice from "./Indices/NbSportIndice"
import SportIndice from "./Indices/SportIndice"
import Sport from "./Sport"
class Stub{
static GenerateIndice(): Indice[]{
let indice = new NbEdgesIndice(1, 3)
let indice1 = new NbEdgesIndice(2, 4)
let ageIndice = new AgeIndice(3, 0, 14)
let ageIndice1 = new AgeIndice(4, 15, 19)
let ageIndice2 = new AgeIndice(5, 20, 29)
let ageIndice3 = new AgeIndice(6, 30, 100000)
let indices: Indice[] = [indice, indice1, ageIndice, ageIndice1, ageIndice2, ageIndice3]
let test = 7
for (let i: Color=0; i<5; i++){
for (let j: Color=0; j<5; j++){
if (j==i){
continue
}
indices.push(new ColorIndice(test, [i, j]))
test++
}
}
for (let i: Sport=0; i<5; i++){
for (let j: Sport=0; j<5; j++){
if (j==i){
continue
}
indices.push(new SportIndice(test, [i, j]))
test++
}
}
for (let i: Color=0; i<5; i++){
indices.push(new ColorEdgesIndice(test, [i]))
test++
}
for (let i=1; i<3; i++){
indices.push(new NbSportIndice(test, i))
test++
}
return indices
}
}
export default Stub

@ -1,5 +1,6 @@
{
"compilerOptions": {
// ...
"resolveJsonModule": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
@ -7,8 +8,7 @@
"target": "es5",
"lib": ["dom", "es2015"],
"jsx": "react",
"strict": true,
"strict": true
},
// ...
}
// "noImplicitAny": false,

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save