Programmering02 [prrprr02]

Kodexempel

HighScore.cs

[Tillbaka till förra sidan]

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;


// =======================================================================
// HsItem, en beh�llare-klass som inneh�ller info om en person i
// highscorelistan.
// =======================================================================
class HSItem
{
	// Variabler och egenskaper f�r dem:
	string name;
	int points;

	public string Name{ get { return name; } set { name = value; } }

	public int Points { get { return points; } set { points = value; } }

	// =======================================================================
	// HSItem(), klassens konstruktor
	// =======================================================================
	public HSItem(string name, int points)
	{
		this.name = name;
		this.points = points;
	}
}

// =======================================================================
// HighScore, inneh�ller en lista med hsItems samt metoder f�r att
// manipulera listan.
// =======================================================================
class HighScore
{
	int maxInList = 5; // Hur m�nga som f�r vara i listan
	List<HSItem> highscore = new List<HSItem>();
	string name; // Spelarens namn

	// Anv�nds f�r att skriva ut vilket tecken spelaren har valt just nu:
	string currentChar;
	int key_index = 0; // Denna anv�nds f�r att mata in spelarens namn
	// Dessa anv�nds f�r att kontrollera n�r tangenter trycktes in:
	double lastChange = 0;
	Keys previousKey;

	// =======================================================================
	// HighScore(), klassens konstruktor
	// =======================================================================
	public HighScore(int maxInList)
	{
		this.maxInList = maxInList;
	}

	// =======================================================================
	// Sort(),  metod som sorterar listan. Metoden
	// anropas av Add() n�r en ny person l�ggs till i
	// listan. Anv�nder algoritmen bubblesort
	// =======================================================================
	void Sort()
	{
		int max = highscore.Count - 1;

		// Den yttre loopen, g�r igenom hela listan            
		for (int i = 0; i < max; i++)
		{
			// Den inre, g�r igenom element f�r element
			int nrLeft = max - i; // F�r att se hur m�nga som redan g�tts igenom
			for (int j = 0; j < nrLeft; j++)
			{
				if (highscore[j].Points < highscore[j + 1].Points) // J�mf�r elementen
				{
					// Byt plats!
					HSItem temp = highscore[j];
					highscore[j] = highscore[j + 1];
					highscore[j + 1] = temp;
				}
			}
		}
	}

	// =======================================================================
	// Add(), l�gger till en person i highscore-listan.
	// =======================================================================
	void Add(int points)
	{
		// Skapa en tempor�r variabel av typen HSItem:
		HSItem temp = new HSItem(name, points);
		// L�gg till tmp i listan. Observera att f�ljande Add()
		// tillh�r klassen List (�r allts� skapad av Microsoft).
		// Metoden har endast samma namn, som just denna Add():
		highscore.Add(temp);
		Sort(); // Sortera listan efter att vi har lagt till en person!

		// �r det f�r m�nga i listan?
		if (highscore.Count > maxInList)
		{
			// Eftersom vi har lagt till endast en person nu, s� betyder
			// det att det �r en person f�r mycket. Index p� personen
			// som �r sist i listan, �r samma som maxInList. Vi vill ju
			// att det h�gsta indexet ska vara maxInList-1. Allst� kan
			// vi bara ta bort elementet med index maxInList.
			// Exempel:
			// maxInList �r 5, vi har 6 element i listan. Det sj�tte
			// elementet har index 5. Vi g�r highscore.RemoveAt(5):
			highscore.RemoveAt(maxInList);
		}
	}

	// =======================================================================
	// CheckKey(), kontrollerar om en viss tangent har tryckts och huruvida
	// det har g�tt lagomt l�ng tid (130ms) sedan tidigare tryck av samma
	// tangent.
	// =======================================================================
	bool CheckKey(Keys key, GameTime gameTime)
	{
		KeyboardState keyboardState = Keyboard.GetState();
		if (keyboardState.IsKeyDown(key))
		{
			// Har det g�tt lagomt l�ng tid, eller �r det en helt annan
			// tangent som trycks ned denna g�ng?
			if (lastChange + 130 < gameTime.TotalGameTime.TotalMilliseconds
				|| previousKey != key)
			{
				// s�tt om variablerna inf�r n�sta varv i spelloopen:
				previousKey = key;
				lastChange = gameTime.TotalGameTime.TotalMilliseconds;
				return true;
			}
		}
		// Just den tangenten (key) trycktes INTE ned, eller s� trycktes den
		// ned alldeles nyligen (mindre �n 130ms):
		return false;
	}

	// =======================================================================
	// PrintDraw(), metod f�r att skriva ut listan. Det finns ingen
	// PrintUpdate() d� det �r en helt statisk text som skrivs ut.
	// =======================================================================
	public void PrintDraw(SpriteBatch spriteBatch, SpriteFont font)
	{
		string text = "HIGHSCORE\n";
		foreach(HSItem h in highscore)
			text += h.Name + " " + h.Points + "\n";

		spriteBatch.DrawString(font, text, Vector2.Zero, Color.White);
	}

	// =======================================================================
	// EnterUpdate(), h�r matar anv�ndaren in sitt anv�ndarnamn. Precis som
	// klassiska gamla arkadspel kan man ha tre tecken A-Z i sitt namn. Detta
	// �r Update-delen i spel-loopen f�r inmatning av highscore-namn. Metoden
	// ska forts�tta anropas av Update() s� l�nge true returneras.
	// =======================================================================
	public bool EnterUpdate(GameTime gameTime, int points)
	{
		// Vilka tecken som �r m�jliga:
		char[] key = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
					   'L', 'M', 'N', 'O', 'P',  'Q', 'R', 'S', 'T', 'U',
					   'V', 'X', 'Y', 'Z'};


		// Anv�ndaren trycker knappen ned�t, stega framl�nges i key-vektorn:
		if (CheckKey(Keys.Down, gameTime))
		{
			key_index++;
			if (key_index >= key.Length)
				key_index = 0;
		}

		// Anv�ndaren trycker knappen upp�t, stega bakl�nges i key-vektorn:
		if (CheckKey(Keys.Up, gameTime))
		{
			key_index--;
			if (key_index <= 0)
				key_index = key.Length - 1;
		}

		// Anv�ndaren trycker ENTER, l�gg till det valda tecknet i 
		if (CheckKey(Keys.Enter, gameTime))
		{
			name += key[key_index].ToString();
			if (name.Length == 3)
			{
				// �terst�ll namnet och allt s� att man kan l�gga till namnet 
				// p� en ny spelare:
				Add(points);
				name = "";
				currentChar = "";
				key_index = 0;
				return true; // Ange att vi �r klara
			}
		}
		// Lagra det tecken som nu �r valt, s� att vi kan skriva ut det i
		// EnterDraw():
		currentChar = key[key_index].ToString();
		// Ange att vi inte �r klara, forts�tt anropa denna metod via Update():
		return false;
	}

	// =======================================================================
	// EnterDraw(), skriver ut de tecken spelaren har matat in av sitt namn
	// (om n�got) samt det tecken (av tre) som just nu �r valt.
	// =======================================================================
	public void EnterDraw(SpriteBatch spriteBatch, SpriteFont font)
	{
		string text = "ENTER NAME:" + name + currentChar;
		spriteBatch.DrawString(font, text, Vector2.Zero, Color.White);
	}

	// =======================================================================
	// SaveToFile(), spara till fil.
	// =======================================================================
	public void SaveToFile(string filename)
	{
	}

	// =======================================================================
	// LoadFromFile(), ladda fr�n fil.
	// =======================================================================
	public void LoadFromFile(string filename)
	{
	}
}