Restaurer le focus en WPF

Si vous désirez sauver et restaurer le focus en WPF (en interagissant avec un third party par exemple) vous pouvez utiliser:

public void SetSelectedItem(object SelectedItem)
{
// Sauvegarde le focus actuel
IInputElement focusedElement = Keyboard.FocusedElement;
 
// Here, do the third party interaction, like in mvvm:
Items.Where(p=>p.Id == SelectedItem.Id).IsSelected = true; // changes the focus
 
// Restaure le focus sauvegardé
if (focusedElement != null && Keyboard.FocusedElement != focusedElement)
        Keyboard.Focus(focusedElement);
}

Problème [RESOLU] avec GTX770-DC2OC-2GD5

216273

Jai eu un problème assez pénible après l’installation de mon nouvel ordinateur:

[PROBLEME]

Mon ordinateur crashait aléatoirement. Mon écran devenait noir (tout en restant allumé, diode active) et je devais forcément reboot la machine pour débloquer la situation.
Ca se produisait souvent:

  • Entre 2 maps de BF4. Durant le chargement de la nouvelle map.
  • Après avoir joué à BF4, quand je tentais d’ouvrir un browser.
  • Après une phase de minage de cryptocoins (j’utilise CudaMiner) Encore une fois, pas durant le processus, mais juste après

Mes dump files mentionnaient:

System:

SYSTEM_SERVICE_EXCEPTION nvlddmkm.sys

[…]

Probably caused by : nvlddmkm.sys ( nvlddmkm+39be1c )

Application: the thread tried to read from the virtual address for which it does not have the appropriate access

J’ai essayé de supprimer/réinstaller plusieurs drivers différents de NVIDIA sans succès

[SOLUTION]
Allez sur le site suivant et installez le bios update (sous Drivers & Tools)
VBIOS update for GTX770-DC2OC-2GD5 & GTX770-DC2-2GD5
Improve stability

https://www.asus.com/Graphics_Cards/GTX770DC2OC2GD5/#support

Ca a marché pour moi!

2013 – AI GameDev – Capture The Flag

Il y a quelque temps s’achevait le concours: AI Sandbox: CTF(Capture The Flag)

J’ai terminé à la 6ème position (70 participants) pour une durée d’1 mois et demi dessus (enfin, des soirs et weekends), assez intense (surtout avec le taff en parallèle) mais super sympa ! J’ai même pu être interviewé sur les stratégies mises en place (la classe! :D)

Voici un match (un des seuls que j’ai pu sauvé, où mon IA prends cher contre le 3ème de la compétition)

Quel était le but du concours?

Ce concours consistait à développer une Intelligence Artificielle (IA) pour le jeu « Capture the flag » L’implémentation du capture the flag était on ne peut plus simple : récupère le drapeau ennemi et ramène le à la zone de score pour marquer un point. Le bot qui a le plus de points à la fin gagne la partie ! Ce concours était organisé par AiGameDev.com et parrainé par « Guerilla games », développeurs de la série « Killzone » sur Playstation

A savoir:

– Le jeu est en temps réel. Certaines actions sont automatiques (comme tirer : il suffit d’avoir un ennemi dans son champs de vision et à porter de tir)

– Chaque ordre donné à un bot entraine un freeze d’une seconde (d’où une partie de la difficulté : il ne faut pas redonner des ordres sans cesse)

– Sur la carte, vous pouvez voir des petits blocs (blanc/gris). Les combattants ne peuvent pas passer à travers mais ils peuvent voir et tirer par-dessus. Les autres blocs sont trop grands pour voir quoique ce soit

Détails du développement (Fonctionnalités triées par ordre chronologique de dev)

A.     Récupération du Drapeau & parcours pour le ramener

Ce sont les 2 premiers rôles que j’ai implémenté :

  1. Atteindre le drapeau ennemi en utilisant les routes avec peu de risques.
  2. Ramener le drapeau en utilisant une route avec peu de risques

Pour faire cela, j’ai utilisé un algorithme A* (astar). La pondération des cases a beaucoup évoluée durant le dev, et a fini par prendre en compte

–          Les positions où l’ennemi défend

–          Les positions où mes combattants sont morts.

–          La proximité du spawn ennemi. (en lien avec la vitesse de respawn (différente selon les parties,  et le nombre de combattants total) Lorsqu’un de mes combattants porte le drapeau, un autre va sur l’endroit de spawn du drapeau ennemi dans le but de maximiser les points marqués.

B.     Défendre (camper) des endroits

Ensuite j’ai voulu avoir des protecteurs de drapeau.

Pour cela, j’ai implémenté un algorithme permettant de calculer la visibilité de chaque cellule sur la carte (pour que mes combattants puissent se cacher au maximum).

L’équipe d’admin AIGameDev nous ayant donné quelques indices très utiles pour réaliser ce type d’algo.

J’ai utilisé la méthode du “ray casting” pour obtenir ce que je voulais. Voilà un exemple de carte de visibilité calculé au début de chaque match (300ms~~ pour générer cela)

Map de visibilité
Map de visibilité

Au final j’ai utilisé cette fonctionnalité de recherche de points de campe assez souvent pour:

–          Défendre la zone où mon drapeau apparait

–          Défendre la zone de score de l’ennemi.

–          Défendre mon drapeau s’il a été pris et relâché par un ennemi.

–          Attaquer les points où mes ennemies pourraient se trouver pour protéger leur drapeau.

Cette fonctionnalité donne parfois de mauvaises positions (trop proche d’un bloc adjacent et empêchant mon combattant de voir réellement la zone couverte)

J’ai fait des modifications à la toute fin pour corriger ce bug mais je n’ai pas eu le temps de tester cela correctement (et j’ai bien l’impression que le bug subsiste)

J’aurai pu faire mieux aussi dans le sens où je ne prends pas en compte le chemin que les combattants ennemis prennent pour venir.

Donc il arrive (plutôt souvent) que mes défenseurs soient tués par derrière, sans qu’aucune intelligence ennemie ne soit nécessaire. Pour contrer cela, je surveille l’efficacité du point de campe (si 2 défenseurs meurent sans tuer personne, l’endroit sera recalculé)

C.      Attaque des combattants ennemis les plus proches

J’avais donc mes combattants qui défendent, celui qui essai de récupérer le flag.

J’ai ensuite décidé d’envoyer tous mes autres combattants à des positions spécifiques (zone de spawn du drapeau ennemi, zone de score…) jusqu’à temps de voir des combattants ennemis.

Tout ennemi est traqué en suivant la consigne suivante : « Pas plus de 2 de mes combattants affectés par combattant ennemi»  

D.     Attaque de la base ennemie

Après un moment, j’ai vu que mon IA ne pouvait pas gagner contre une défense descente, donc j’ai implémenté 2 nouvelles fonctionnalités pour y parvenir :

  1. Grouper plusieurs combattants proche du drapeau ennemi, et quand ils sont tous prêt, attaquer selon une route détournée.
  2. Certains de mes combattants sont désignés pour tuer les campeurs. Ils attaquent leurs ennemis via l’algo AStar en prenant en considération la zone de vision et la portée des campeurs

E.      Interception de l’ennemi porteur de drapeau

  J’ai remarqué que nous avions, via l’API, la position de notre drapeau à tout moment (que nous voyons notre drapeau ou non) J’ai donc implémenté une fonctionnalité permettant à mes combattants d’intercepter l’ennemi porteur de drapeau.

Seuls mes combattants ayant un job « peu important » (à savoir attaque de zone où d’ennemi) sont concernés.

F.      Etat “holding” d’un bot

  A la fin, je me suis concentré sur une particularité de ce concours, l’état “holding” pour un combattant donné.

Cet état se produit lorsque plusieurs combattants se rencontrent alors qu’ils sont à une distance supérieur à leur portée de tir, ils se regardent sans bouger et nécessite un développement particulier.

Jusqu’aux derniers jours avant la fin du concours, j’ai eu des parties où ni moi ni l’adversaire ne savait gérer cette holding state, donnant de belles parties où tout s’arrête pendant quelques secondes jusqu’au  déblocage par un évènement extérieur (un autre combattant qui passe par là). Parfois la partie freezait ainsi jusqu’à la fin.

Désormais, lorsqu’un de mes combattants est dans cet état, il obtient l’ordre d’attaquer l’ennemi qui le bloque, en prenant en compte la portée de tir de cet ennemi.

Le nombre de combattants alloué à chaque tâche est défini à l’initialisation, suivant le nombre de combattants total. J’aurai pu améliorer le niveau global de mon IA en jouant un peu plus sur ces chiffres.

G.     Tests and optimisations

Dans le but de tester mes fonctionnalités, j’ai fait quelques fonctions de debug afin d’être sur que toutes les valeurs sont comme je les attends.

Evidemment un fichier de log (vu qu’il était quasiment impossible de debugger avec des breakpoints avec l’architecture du jeu) mais aussi des bitmaps des cartes (extrêmement utiles pour vérifier la carte de poids lié au pathfinding, aux positions de camp et aussi les zone de tir des ennemis suivant leurs états.

Comme pour chaque concours d’IA, je pense qu’il est extrêmement important d’avoir un plan de test. De cette manière il est facile de savoir si le niveau global de l’IA augmente avec les nouvelles fonctionnalités implémentées et s’il n’y a pas de régression.

Pour cela, j’ai créé une liste de .cmd qui lançait les parties avec des configurations spécifiques et écrivant les résultats des matches dans un fichier. A la fin (après import/groupement des données dans Excel) J’avais ce genre d’infos:

Fredv2_suryav3

Très utile pour savoir sur quelles cartes mon IA est faible. (en l’occurence la map01 ou encore la map22)

H.    Conclusion: Je pense que j’aurai pu faire mieux avec plus de temps (comme tous les participants en fait :D). Je suis entré dans la compétition à la fin de la phase 2.

Les participants et les admins ont été très sympa, j’ai eu beaucoup de plaisir à monter dans le classement jusqu’à affronter les meilleurs.

Annexes:

ranking

Une partie entre les deux premiers:

FinalBot: Concours d’IA pour le Poker Texas Hold’em (C# bot)

[Update]

Après de nombreux tournois, mon bot (posté il y a maintenant plus de 6 mois) est désormais premier du classement, yeyyy 😀

finalBot_060513
Classement au 04/06/2013

[Post Initial]

Après AI Challenge « Ants » 2011, en manque de défi d’IA, j’ai effectué pas mal de recherche sur internet afin de trouver un concours qui me plairait.

Et je l’ai trouvé (enfin partiellement) FinalBot est un site concu il y a un peu plus d’un an, avec pour but d’hoster différents concours d’IA.

Lors du lancement, 2 jeux sont mis en place:

Un jeu de dark chess (les échecs avec du brouillard de guerre! Il fallait y penser!) et , de manière plus importante: un jeu de Hold’em Poker.

Top 2! (11/06/2012) Le premier est … loin oO

J’avais déjà eu l’envie de faire une IA sur ce thème du poker. Mais la mise en place du jeu peut être laborieuse et chronophage, ce qui m’avait un peu refroidi.

Bref, découverte du concours:

J’arrive après la guerre: le site et le concours ont été lancé durant l’été 2011 et une fois les récompenses données aux vainqueurs, le site a vu sa fréquentation décroître. Les bots développés sont toujours présents et 3 compétitions sont organisées automatiquement tous les jours (standard, headsup, bigpool). C’est CLR plateforme uniquement (C#/CPP/F#)

J’ai créé un bot début Août, random bot d’abord, afin de tester le site. Puis je m’y suis réellement mis. J’ai récupéré et testé un bon paquet de librairies « permettant » de calculer les probas dont j’avais besoin.

J’ai fini par choisir un package(C#) créé par Keith Rule (lien). Cet utilitaire ne fonctionne pas, comme je l’avais imaginé, sur des tables de données précalculées. Non, les probas sont re-calculés à la volée. C’est extrêmement bien optimisé (pour du C#), ce qui permet de calculer ces probas avec une bonne précision dans le temps imparti.

Mon bot est assez simpliste pour le moment. Il joue relativement safe et tente des bluffs dans un seul cas: s’il est le dernier à parler, que tout le monde à check et qu’il a des jetons. (dans ce cas là uniquement 30% du temps) Il n’analyse pas le comportement de chaque joueur en face (c’est le prochain pas)

Beaucoup de règles sont donc implémentées, avec de nombreux tresholds variables selon le nombre de joueurs toujours à la table, les valeurs de base étant setté via la bonne vieille méthode empirique et de bon sens. (donc très clairement améliorable!) Le Heads-Up (1v1) est géré de manière indépendante (car il faut être, de manière générale, bien plus agressif  en 1V1 que dans une partie avec plusieurs adversaires)

Après des mises à jour successives, je me suis rendu compte que le rythme des tournois mis en place sur le site officiel était bien trop faible pour avoir une visibilité un tant soit peu précise sur les conséquences des « améliorations » apportées au bot. De même pour le client de test (permettant de faire des matchs offline, entre les bots fourni (raisebot-callbot etc) et les bots développés (dont on possède les dll bien sur!)) :  Problème: ce client de test permet de faire … 1 match par 1 match. Pas de quoi avoir des stats précises :/

J’ai donc prit cet exe de test, browsé son code (via ILSpy) pour récupérer les méthodes utilisées pour ajouter les joueurs, lancer les matchs, récupéres les scores etc. Ensuite, création d’un nouvel exe winform sur visual studio. Intégration des dlls de l’exe de test, et je me suis fait mon tool à moi (très design, comme d’hab)

FinalBot Canon Launcher – Un design hors du commun

Grace à ce tool, j’ai désormais la possibilité de voir ce que mon bot vaut … véritablement: (données basées sur le % de première place) Ici un exemple avec 1000 parties:

Comparaison performance bots
Tiens tiens, la version 8 semble moins efficace que la 7…

Problème: je n’ai pas les DLLs des concurrents! (à venir, le premier du concours m’ayant « promis » sa DLL) A l’heure actuelle (je n’ai pas touché au bot depuis au moins 1 mois et demi) je suis 2ème du classement continu (La montée à pris du temps, dû au fait qu’il y a seulement 3 tournois/jour)

Lien vers le site FinalBot