Cpp ASCII Gamecontact(at)guillaumelevieux.com :: « Home

Projet Jeu ASCII

Privateer


Dwarf Fortress


Shoot'em


Objectif L'objectif de ce workshop de 5 jours est de vous faire une petite remise à niveau en C++. Vous devrez développer un jeu au rendu ASCII / console uniquement, en équipe de deux de niveau équilibré. De plus, vous consacrerez la dernière heure de chaque journée à une revue de code d'un autre groupe (une demi heure sur chaque projet).

Qualite du code Vous devrez produire le code le plus propre possible, avec avant tout un projet qui fonctionne. N'oubliez pas que vous etes en phase de prototypage, donc il vous faut trouver un juste milieu entre la qualité du code et votre vitesse de développement.

Rendu Vous rendrez : 1) une vidéo de votre proto, vous pouvez générer ca rapidement avec windows 10 (windows + G ). Si vous avez du mal à la compresser ensuite, uploadez sur youtube et récupérez la avec keepvid, la vidéo sera propre. 2) dans un zip, le code de votre jeu ainsi qu'une image du diagramme de classe de votre moteur (que vous pouvez générer avec visual), et tout autre visuel que vous jugez intéressant à montrer. Vous avez le lien de rendu à partir de votre compte. Un premier rendu sera fait le vendredi avant 17h. Vous avez ensuite tout le reste du semestre pour finir votre projet. (et le reste de l'année si c'est le projet que vous voulez pousser pour votre pres en M2).

Déroulement Vous utiliserez la console windows et l'API qui va avec.

1) Constitution des equipes : vous me donnez votre niveau en C++ et on tire au sort les equipes.
2) Vous choisissez rapidement un concept de jeu. Inspirez vous d'autres jeux ASCII.
3) Vous codez et on vous aide

Attention, les accès à la console windows sont assez lents. Utiliser un système de buffer :

HANDLE hOutput = (HANDLE)GetStdHandle( STD_OUTPUT_HANDLE );

COORD dwBufferSize = { SCREEN_WIDTH,SCREEN_HEIGHT };
COORD dwBufferCoord = { 0, 0 };
SMALL_RECT rcRegion = { 0, 0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1 };

CHAR_INFO buffer[SCREEN_HEIGHT][SCREEN_WIDTH];

ReadConsoleOutput( hOutput, (CHAR_INFO *)buffer, dwBufferSize,
dwBufferCoord, &rcRegion );

buffer[5][10].Char.AsciiChar = 'H';
buffer[5][10].Attributes = 0x0E;
buffer[5][11].Char.AsciiChar = 'i';
buffer[5][11].Attributes = 0x0B;
buffer[5][12].Char.AsciiChar = '!';
buffer[5][12].Attributes = 0x0A;

WriteConsoleOutput( hOutput, (CHAR_INFO *)buffer, dwBufferSize,
dwBufferCoord, &rcRegion );

Buffered Console


#ifndef __NY_TIMER__
#define __NY_TIMER__

#include <windows.h>

class NYTimer
{
	public :
		LARGE_INTEGER lastUpdateTime;
		LONGLONG freq;

		NYTimer()
		{
			QueryPerformanceCounter(&lastUpdateTime);
			LARGE_INTEGER li_freq;
			QueryPerformanceFrequency(&li_freq);
			freq = li_freq.QuadPart;
			freq /= 1000;
		}

		void start(void)
		{
			QueryPerformanceCounter(&lastUpdateTime);
		}

		float getElapsedSeconds(bool restart = false)
		{
			LARGE_INTEGER timeNow;
			QueryPerformanceCounter(&timeNow);
			LONGLONG elapsedLong = timeNow.QuadPart-lastUpdateTime.QuadPart;

			float elapsed = (float) ((float)elapsedLong/(float)freq);
			elapsed /= 1000.0f;

			if (restart)
				lastUpdateTime = timeNow;

			return elapsed;
		}

		unsigned long getElapsedMs(bool restart = false)
		{
			LARGE_INTEGER timeNow;
			QueryPerformanceCounter(&timeNow);
			LONGLONG elapsedLong = timeNow.QuadPart-lastUpdateTime.QuadPart;

			unsigned long elapsed = (unsigned long) ((float)elapsedLong/(float)freq);
			return elapsed;
		}
};

#endif

Timer Windows Precis


Cours CPP



Jour 01




Jour 02




Exo d'optim




Jour 03




Jour 04




Jour 05


Divers

A titre d'information, voici certaines metriques de la partie lib du moteur de doom 3 (id software) (Source Monitor).

Source Monitor


Nombre de lignes


Pourcentage de lignes commentees


Nombre d' instructions


Nombre d' instructions par methode


Maximum Block Depth is the maximum nested block depth level found. At the start of each file the block level is zero. Depths up to 9 are recorded and all statements at deeper levels are counted as depth 9.

Profondeur maximale


The complexity metric is counted approximately as defined by Steve McConnell in his book Code Complete, Microsoft Press, 1993, p.395. The complexity metric measures the number of execution paths through a function or method. Each function or method has a complexity of one plus one for each branch statement such as if, else, for, foreach, or while. Arithmetic if statements (MyBoolean ? ValueIfTrue : ValueIfFalse) each add one count to the complexity total. A complexity count is added for each '&&' and '||' in the logic within if, for, while or similar logic statements.

Switch statements add complexity counts for each exit from a case (due to a break, goto, return, throw, continue, or similar statement), and one count is added for a default case even if one is not present. (Note: when a project's Modified Complexity option is selected, switch statements add a count of one to the complexity and the internal case statements do not contribute to the complexity metric.) Each catch or except statement in a try block (but not the try or finally statements) each add one count to the complexity as well.

Complexite moyenne




Slides Microsoft GDC Optim




Id Code Style