Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaVilmos Székely Megváltozta több, mint 8 éve
1
Programozási alapok 2.
2
Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók http://rextester.com/runcode http://volatileread.com/UtilityLibrary/SnippetCompiler 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 25392181 0 1234567Indexek (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]; 0 1 2 3 4 5 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ó 2 1 5 4 2 7
20
Tömb (1D) a programban numbers ??? 0 1 2 3 4 5 2 1 5 4 2 7 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) 012345 0 1 2 3 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 } }; 72 14 59 0 1 2 0 1 2 3 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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.