Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozási alapok 2.. Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók

Hasonló előadás


Az előadások a következő témára: "Programozási alapok 2.. Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók"— Előadás másolata:

1 Programozási alapok 2.

2 Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók https://dotnetfiddle.net/ – talán ez a legjobb https://dotnetfiddle.net/

3 Forráskód helye Konzol, a bemenetet „>” után kéri be Új programFordítás+futtatás

4 Gyakoroljunk együtt!

5 Visual Studio projektek Egy solution-höz több projekt is tartozhat Startup projekt: amelyik futtatáskor elindul

6 Feladat: Kő papír olló RockPaperScissorsBasic projekt, Program.cs 1. Feladat: írjuk meg a figura beolvasását! 2. Feladat: nézzük meg, ki nyert! 3. Feladat: lehessen kilépni a játékból!

7 Programkonstrukciók (4): alprogramok A programozó lusta, nem szereti ugyanazt kétszer leírni Alprogram: programrészlet, aminek külön neve van, erre hivatkozva lehet az alprogramot meghívni. Láttunk már ilyet, pl: Console.WriteLine(Mit írjon ki) Ugyanilyen maga a Main program is Átláthatóbb a kód: bonyolult műveletek helyett egyetlen, kifejező sor Lehet paraméterezni is, az alprogram ugyanazt a viselkedést valósítja meg (azaz valamilyen részproblémát old meg) más-más paraméterekkel

8 Alprogram szintaxis módosítók típus alprogramnév(paraméterek) { Utasítás_1; Utasítás_2; … } Ez most nem érdekes… Visszatérési érték típusa Mint a változók: típus név, típus név… Alprogram „törzse”, a működést megvalósító programkód

9 Alprogram példák void print(string s) { Console.WriteLine(s); } int add(int a, int b) { return a+b; } void add_2(int a, int b, out int result) { result = a+b; } void: speciális visszatérési érték. Az alprogram valamit csinál, de nem ad vissza „végeredményt” Függvénynek nevezzük az olyan alprogramokat, amelyek valamilyen értéket számolnak ki. A végeredményt a return kulcsszóval jelezzük. lehetnek kimenő (out) paraméterek is, ezeket az alprogram állítja elő így tudunk pl. több értéket visszaadni

10 Alprogram meghívása print( "Hello World!" ); int i = add(2, 5); i = add(i, 2*i); add_2(3, 42*52, out i); Ekvivalens azzal, mintha az alprogramot bemásolnánk ide, és a paraméterek helyére beírnánk az átadott értékeket Itt az i változó kimenő, azaz a program által számolt érték Ezt az out kulcsszóval kell jeleznünk

11 Első alprogramom (1. feladat) RockPaperScissorsSubprogram projekt Írjunk alprogramot, ami beolvas egy kő papír olló figurát! Adja vissza, hogy a beolvasott érték érvényes-e és a beolvasott értéket is! static bool readFigure(string message, out string figure) { Console.WriteLine(message); figure = Console.ReadLine(); if ("ko" == figure || "papir" == figure || "ollo" == figure) { return true; } return false; }

12 Első alprogramom: felhasználási példa static void Main(string[] args) { bool newGame = true; Random rnd = new Random(); while (newGame) { Console.Clear(); string playerFigureString; while (!readFigure("Mit mutatsz?", out playerFigureString)) { Console.WriteLine("Ervenyes figurak: ko, papir, ollo"); } //...

13 Feladat: kő papír olló, alprogram 2. Feladat: írjunk alprogramot, ami a véletlenszerűen generált számból stringet csinál!

14 Programkonstrukciók (2.5): választás (switch) if (változó == érték_1) { Utasításblokk_1; } else if (változó == érték_2) { Utasításblokk_2; } else if (változó == érték_3) { Utasításblokk_3; } // … else { Egyébként_ág; } switch (változó) { case érték_1: Utasításblokk_1; break; case érték_2: Utasításblokk_2; break; case érték_3: Utasításblokk_3; break; default: Egyébként_ág; }

15 Programkonstrukciók (2.5): választás (switch) switch (változó) { case érték_1: Utasításblokk_1; break; case érték_2: Utasításblokk_2; break; case érték_3: Utasításblokk_3; break; default: Egyébként_ág; } default (általában) nem kötelező De mindig ajánlott kiírni egy üres default ágat A változó csak elemi típus lehet bool, char, string, int, … break helyett állhat: return (alprogramból visszatérés) goto case érték_i (másik címkére ugrás) (throw – ez most nem érdekes…)

16 Feladat: kő papír olló, switch 3. Feladat: írjunk switch-case szerkezetet, ami a nyertes alapján kiírja az eredményt! A nyertest a winner függvény adja vissza, egész számként -1: az első játékos nyert (ami most a felhasználó) 0: döntetlen 1: a második játékos nyert (ami most a gépi játékos)

17 Adatszerkezetek Az algoritmustervezés legfontosabb eszközeinek egyike Sok egyforma (vagy hasonló) dolgot szeretnénk rendezett formában tárolni Rengeteg fajtája van, az optimális választás attól függ, hogy az adatszerkezetben tárolt adatokkal mit szeretnénk kezdeni Felhasználási példák: Gyors keresés telefonkönyv Gyors beszúrás jegyzettömb Sorrendiség ki volt itt előbb? Szomszédsági viszony határos országok Térbeli elrendezés legközelebbi rakétavető

18 Tömb (1D) Azonos típusú elemek számozott listája Indexek (elemek sorszáma) Tömb elemei Tömb hossza (mérete) 8 Első index (nullától!!!) Tömb (6-os indexű) eleme

19 Tömb (1D) a programban int[] numbers; tömb létrehozás deklaráció (név létrehozás) numbers ??? int[] numbers = new int[6]; int[] numbers = new int[6] { 2, 1, 5, 4, 2, 7 }; int[] numbers = { 2, 1, 5, 4, 2, 7 }; létrehozás és inicializáció

20 Tömb (1D) a programban numbers ??? numbers[3] = 9; numbers[6] = 0; 9 // futási idejű hiba!

21 Tömbök bejárása Nagyon gyakran előjövő feladatok: A tömb minden elemére végezzünk el valami műveletet Keressünk a tömbben Tömb bejárás string[] array = {"alma", "dio", "mogyoro"}; for (int i = 0; i < array.Length; ++i) { Console.WriteLine(array[i]); } foreach: Speciális for ciklus adatszerkezetek bejárására // pontosan ugyanazt csinálja, mint az előző ciklus foreach (string s in array) { Console.WriteLine(s); }

22 Feladat: Kő papír olló, tömbökkel Hány helyen kell átírni az előző programot, ha más nevet szeretnék a figuráknak? Használjunk tömböket a figuranevek tárolására! Máshol ne forduljon elő a figurák neve static string[] FigureStrings = { "ko", "papir", "ollo" }; static string intToFigure(int i) { if (0 <= i && i < FigureStrings.Length) return figures[i]; return ""; }

23 Konstansok Motiváció: a kő papír olló programban észben kell tartanunk, hogy melyik indexhez milyen figura tartozott. 1. változat: definiáljunk nekik konstansokat const int ROCK = 0; const int PAPER = 1; const int SCISSORS = 2; A konstansok típussal rendelkező, névvel azonosított értékek (mint a változók), amelyek értéke a program során nem változhat const int ROCK = 0; ROCK = 2; // fordítási hiba! Tipikusan előre beégetett értékeket szoktunk megadni velük

24 Felsorolási típus Motiváció: a kő papír olló programban észben kell tartanunk, hogy melyik indexhez milyen figura tartozott. 2. (szebb) változat: definiáljunk nekik saját felsorolási típust Emlékeztető: a típus meghatározza többek között, hogy a változók milyen értékeket vehetnek fel enum Figures {ROCK = 0, PAPER, SCISSORS}; A felvehető értékeket mi soroljuk fel, név szerint Számmá tudjuk őket konvertálni, explicit konverzióval int i = (int)Figures.ROCK; // C#: típusnév.érték A felsorolt értékeknek megfelelő számot egyenlőség jel után megadhatjuk Alapból 0-tól kezdődik, egyesével nő

25 Felsorolási típus: bejárás Összes érték bejárására speciális konstrukció: foreach (Az Enum.GetValues egy tömböt ad vissza a lehetséges értékekkel, ezt járja be a foreach) foreach (int i in Enum.GetValues(typeof(Figures))) { Console.Write(FigureStrings[i] + " "); } foreach (Figures f in Enum.GetValues(typeof(Figures))) { Console.Write(FigureStrings[(int)f] + " "); }

26 Feladat: kő papír olló, enum Definiáljunk enum típust a figurákhoz Indexeljük ezzel a figurák neveit tartalmazó tömbünket mindenhol a kódban!

27 Tömb (2D) A[1,3] A[2,1] A[0,0] A[3,5]

28 Tömb (2D) a programban int[,] twoDimArray = new int[3, 2] { { 7, 2 }, { 1, 4 }, { 5, 9 } }; ahány vessző, annyi+1 dimenziós dimenziók méretei

29 2D tömb bejárása Összes elem, egyszerre: foreach (int i in twoDimArray) { Console.WriteLine(i); } Dimenziónként: for (int row = 0; row < twoDimArray.GetLength(0); ++row) { for (int col = 0; col < twoDimArray.GetLength(1); ++col) { Console.WriteLine(twoDimArray[row, col]); } HF: mi történik, ha a két for-t megcseréljük?

30 Kép mint 2D tömb

31 2D tömb a játékokban

32 3D tömb a játékokban

33 Feladat: Pacman alapprogram Pacman solution, Pacman01-2DArray projekt 1. feladat: rajzoljuk a ki a pályát Már tárolva van egy 2D tömbben 2. feladat: pontszámmegjelenítés

34 Objektum Orientált Programozás Programozási paradigma A legtöbb programban logikailag valamilyen nem elemi típusú „objektumon” dolgozunk Szörny, rakétavető, képernyő, bemeneti fájl … Ezekhez létrehozhatunk saját típus: osztály Attribútumok (tulajdonságok) Objektumokon végezhető műveletek

35 Osztály, mint „összetett típus” class HiScore { // public: láthatóság kifelé (ld. Később) public string playerName; public int score; public DateTime date; // további adatok, pl. játszott faj stb. } //... Használat: HiScore hiscore = new HiScore(); hiscore.score = 5; hiscore.playerName = "Lajos"; attribútum vagy property hiscore playerName score date 5 Lajos példányosítás …

36 Osztály, mint típus saját műveletekkel class MyInteger { public MyInteger(int value) { this.value = value; } public void negate() { value = -value; } public void print() { Console.WriteLine(value); } int value; } static void Main(string[] args) { MyInteger m = new MyInteger(5); m.print(); m.negate(); m.print(); } konstruktor metódusok / tagfüggvények

37 Házi feladat: Legyen Ön is milliomos Tipp: kérdés osztály Kérdés szövege Lehetséges válaszok (4 elemű tömb) Helyes válasz sorszáma A játék menete: Amíg a játékos ki nem lép, kiírunk 1-1 kérdést és a lehetséges válaszokat Bekérjük a játékos tippjét Ha jó a válasz, ugrunk a következő nyereményszintre Különben game over

38 Pacman V2 Van már Vec2 osztály GameObject osztály class GameObject { public enum GO_Type { WALL, HERO, ENEMY, COIN } public virtual void draw() { //TODO } public GO_Type mType; public Vec2 position = new Vec2(); public Vec2 move = new Vec2(); public int score = 0; }

39 Player funkciói class GameObject { … public void update() { if (mType == GO_Type.HERO) { if (System.Console.KeyAvailable) { ConsoleKeyInfo keyinfo = System.Console.ReadKey(true); move.setNull(); if (keyinfo.Key == ConsoleKey.LeftArrow) move.x = -1; if (keyinfo.Key == ConsoleKey.RightArrow) move.x = 1; if (keyinfo.Key == ConsoleKey.UpArrow) move.y = -1; if (keyinfo.Key == ConsoleKey.DownArrow) move.y = 1; if (keyinfo.Key == ConsoleKey.Escape) System.Environment.Exit(0); }

40 Player funkciói II. class GameObject { … public void allowMove() { System.Console.SetCursorPosition(position.x, position.y + 1); System.Console.Write(" "); position = position.add(move); move.setNull(); draw(); } public void cancelMove() { move.setNull(); }

41 Main loop //draw level … System.Console.SetCursorPosition(0, 0); System.Console.Write("Score: 0");.. következő dia jön ide

42 while (true){ for (int i = 0; i < cols; ++i) { for (int j = 0; j < rows; ++j) { if(map[j][i] != null) map[j][i].update(); if(map[j][i] == player) { if (!player.move.isNull()) { Vec2 nextPosition = player.position.add(player.move); GameObject obj = map[nextPosition.y][nextPosition.x]; if (obj.mType != GameObject.GO_Type.WALL) { if (obj.mType == GameObject.GO_Type.COIN) { player.score++; map[nextPosition.y][nextPosition.x] = null; drawGUI(); } else if (obj.mType == GameObject.GO_Type.ENEMY) { player = null; drawGUI(); } player.allowMove(); map[player.position.y][player.position.x] = player; } else player.cancelMove(); }

43 GUI rajzolás class Game { void drawGUI() { if(player == null) { System.Console.SetCursorPosition(0, 0); System.Console.Write("GAME OVER"); System.Threading.Thread.Sleep(3000); System.Environment.Exit(0); } System.Console.SetCursorPosition(0, 0); System.Console.Write("Score: " + player.score); }

44 Öröklődés Játékobjektum Játékos Fal SárkányVámpír Szörny Specializáció

45 Öröklődés példa class Vec2 {/*... */}; public class GameObject { public void draw() { /*... */ } public void move() { /*... */ } Vec2 position; int ID; //... } public class Monster : GameObject { // örököltük a metódusokat // örököltük a koordinátát, ID-t stb. }

46 Absztrakt osztály class Vec2 {/*... */}; public class GameObject { public void draw() { /*... */ } public void move() { /*... */ } Vec2 position; int ID; //... } public class Monster : GameObject { // örököltük a metódusokat // örököltük a koordinátát, ID-t stb. } Hogyan mozog egy „általános” játékobjektum???

47 Absztrakt osztály class Vec2 {/*... */}; public abstract class GameObject { public abstract void draw(); public abstract void move(); Vec2 position; int ID; //... } public class Monster : GameObject { // felülírjuk az örökölt metódusok viselkedését public override void draw() { /*... */ } public override void move() { /*... */ } // örököltük a koordinátát, ID-t stb. } Nem írunk hozzá törzset, majd a speciális esetek implementálják külön-külön A konkrét, nem absztrakt leszármazottak már definiálják a viselkedést

48 Pacman V3 Öröklődés Game loop

49 Pacman modell


Letölteni ppt "Programozási alapok 2.. Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók"

Hasonló előadás


Google Hirdetések