Pong Source



  • Ich suche ein möglichst einfach gehaltenes Pong in C.
    Schlecht wäre natürlich auch nicht, wenn es dokumentiert wäre.

    Und bevor hier irgendjemand schreit: "Mach deine HÜ gefälligst selber!". Es wäre wirklich schön, wenn wir in der Schule C lernen würden.

    Grund ist, dass es mich schlicht und einfach interessiert.



  • hmm warum fängst du nicht an, selber eins zu machen und fragst, wenn du nicht weiterkommst, an der jeweiligen entscheidenden stelle?
    wäre mehr lerneffekt 😉



  • Pong ist zwar vom Spielprinzip einfach und beim ersten überlegen auch einfach zu progen aber beim 2. hinsehen ist das gar nicht so einfach das zu schreiben. Ich würde mal mit nem Snake oder TicTacToe oder Minesweeper anfangen denn die sind auch von der ausführung her einfach. Bei Pong musste nämlich mit Physikalischen Formeln und so rechnen (Auf - Abprallwinkel) und das is ned so leicht.



  • Wird beim traditionellen Pong beim Aufprall auf eine vertikale Fläche nicht einfach die horizontale Komponente des Bewegungsvektors negiert (bei horizontaler Fläche umgekehrt)? Es ist ja nicht so dass es bei Pong besonders viele Schrägen und Ecken gibt 😉



  • Also ich hätte das mit dem reflexionsgesetzt ausgerechnet wo der Ball hinfliegt denn wenn der Ball auf die Kante des Balkens trifft ist deine Methode nicht mehr wirksam



  • also ein Tic Tac Toe hab ich schon gemacht (Konsolenversion)

    Ich hab nur einfach keine Ahnung wie ich ein Snake oder ein Pong anfangen soll, darum würde mich der source ja interessieren



  • Pong in der Konsole zu proggen ist unmöglich! Begründung: Der Spielball würde in der Konsole durch ein Einzelzeichen dargestellt werden und da mann in der Konsolle ein Pixelmuster von 80x44 im vollbildmodus hatt ist es so gut wie unmöglich die Flugbahn eines Balls zu simmulieren.

    PacMan progge ich selber grad mein tip fang mit dem Level an.

    Snake hab i schon geproggd da fängst du am besten mit der Steuerung und der Schlange an.

    So habs ich gemacht du kannst es auch so machen musst aber nicht



  • Sie dir mal mein Snake an: www.cpp-snake.at.tf



  • Bauarbeiterjoe schrieb:

    Pong in der Konsole zu proggen ist unmöglich! Begründung: Der Spielball würde in der Konsole durch ein Einzelzeichen dargestellt werden und da mann in der Konsolle ein Pixelmuster von 80x44 im vollbildmodus hatt ist es so gut wie unmöglich die Flugbahn eines Balls zu simmulieren.

    PacMan progge ich selber grad mein tip fang mit dem Level an.

    Snake hab i schon geproggd da fängst du am besten mit der Steuerung und der Schlange an.

    So habs ich gemacht du kannst es auch so machen musst aber nicht

    klar ist es möglich pong zu proggen, ich hab hier ne gute version selber gemacht (src-code werde ich aber nicht posten, da muss man sichs chon selbst gedanken machen...). es is sehr einfach gehalten und besitzt au nicht wirklich ein reflexionsgesetz, aber das kann man immer noch implentieren. das eim
    nzige problem was ich habe, ist das 2 spieler unmöglich gleichzeitig aufs spielgeschehen eingreifen können - was aber nicht sehr tragisch ist, da sich eh immer nur einer bewegen muss.



  • Bauarbeiterjoe schrieb:

    Pong in der Konsole zu proggen ist unmöglich! Begründung: Der Spielball würde in der Konsole durch ein Einzelzeichen dargestellt werden und da mann in der Konsolle ein Pixelmuster von 80x44 im vollbildmodus hatt ist es so gut wie unmöglich die Flugbahn eines Balls zu simmulieren.

    quatsch, es geht sogar mit viel weniger pixeln: http://www.blinkenlights.de/interactive.de.html



  • wie du aber auch siehst hat der Ball nur die sehr wenige Flugwinkel ca 10-15 und dann wird das Spiel sehr ungenau. Es ist machbar aber in welcher Qualität?



  • schon mal was von interner genauigkeit gehoert, joe? kleiner troll, du 😉



  • PlayingWithFire schrieb:

    Bauarbeiterjoe schrieb:

    Pong in der Konsole zu proggen ist unmöglich! Begründung: Der Spielball würde in der Konsole durch ein Einzelzeichen dargestellt werden und da mann in der Konsolle ein Pixelmuster von 80x44 im vollbildmodus hatt ist es so gut wie unmöglich die Flugbahn eines Balls zu simmulieren.

    PacMan progge ich selber grad mein tip fang mit dem Level an.

    Snake hab i schon geproggd da fängst du am besten mit der Steuerung und der Schlange an.

    So habs ich gemacht du kannst es auch so machen musst aber nicht

    klar ist es möglich pong zu proggen, ich hab hier ne gute version selber gemacht (src-code werde ich aber nicht posten, da muss man sichs chon selbst gedanken machen...). es is sehr einfach gehalten und besitzt au nicht wirklich ein reflexionsgesetz, aber das kann man immer noch implentieren. das eim
    nzige problem was ich habe, ist das 2 spieler unmöglich gleichzeitig aufs spielgeschehen eingreifen können - was aber nicht sehr tragisch ist, da sich eh immer nur einer bewegen muss.

    boah den source wirste ned posten? haste nen deal mit capcom am start? oder doch eher mit activision 😮



  • Ist jetzt kein C sondern C# aber villeicht hilft es jemanden:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    string Racket = " ==== ";  //schläger
    Console.Title = "Abbruch mit ESC, Steuerung mit den Cursertasten";
    Console.SetWindowSize(80,20);
    Console.BufferHeight = 20;
    ConsoleInfo cki;
    int posX = Console.BufferWidth / 2; // 39 // schlägerposition
    int posY = Console.BufferHeight -2;
    Console.SetCursorPosition(posX, posY);
    Console.Write(Racket); // schläger
    int x0, y0;  //alte Ballposition
    int x1 = posX, y1 = 1; //neue Ballpos.
    int vx = 1, vy = 1; //Ballgeschwindigkeit
    DateTime t1, t0 = DateTime.Now;
    
    while(true)
    {
    x0 = x1; 
    y0 = y1;
    t1 = DateTime.Now;
    int ms = (t1.Millisecond - t0.Millisecond + 1000) % 1000;
    if (ms > 100)
    {
    t0 = t1;
    if (x1 == 0 || x1 == Console.BufferWidth - 1)
    vx = -vx;
    x1 += vx;
    if (y1 == 0 || (y1 == posY - 1 && x1 > posX && x1 < posX + Racket.Length))
    vy = -vy;
    y1 += vy;
    if (y1 > posY)
    {
    string mess = "Game Over,loser (ENTER)";
    Console.SetCursorPosition( Console.BufferWidth / 2 - mess.Length/2, Console.BufferHeight / 2);
    Console.WriteLine(mess);
    Console.Beep(280, 500);
    Console.ReadLine();
    return;
    }
    Console.SetCursorPosition(x0, y0);
    Console.Write(" ");
    Console.SetCursorPosition(x1, y1);
    Console.Write("0");
    }
    if (Console.KeyAvailable)
    {
    cki = Console.ReadKey();
    switch (cki.Key)
    {
    case ConsoleKey.Escape:
    return;
    break;
    case ConsoleKey.LeftArrow:
    if (posX > 0)
    posX--;
    break;
    case ConsoleKey.RightArrow:
    if (posX < Console.BufferWidth - Racket.Length - 2)
    posX++;
    break;
    }
    Console.SetCursorPosition(posX,posY);
    Console.Write(racket);
    }
    }
    }
    }
    }
    

    (Den code habe ich aus der c't Nr.5 (20.02.2006), Seite 246)



  • um ehrlich zu sein hab ich wirklich noch nie was von interner Genauigkeit gehört. Was ist das?

    @zafiro ich denke nicht das der source hier jemanden weiterhilft aber is trotzdem nett



  • Das heißt, das du intern z.B. die Ballposition in double-Genauigkeit verwenden und berechnen kannst - und für die Anzeige rundest du die Werte dann auf die Genauigkeit, die dein Bildschirm darstellen kann.



  • Eben das ist das Problem in der Konsole. Die gerundeten Werte ergeben keine schöne Flubahn sondern immer nur eine abgehackte strecke. Eine schräge Linie würde in der Konsole ungefähr so ausehen:

    ...............X........
    .............X..........
    ...........X............
    .........X..............
    
    aber eine flachere Flubahn wäre schon schwierig:
    
    .................................x
    ........................x
    ................x
    .........X
    

    Beim 2. Beispiel Sieht man das problem ziemlich deutlich: wie soll man die Zwischenräume ausfüllen?

    (Die Punkte sind nur damit es auch richtig dargestellt wird)



  • bauarbeiterjoe schrieb:

    .................................x
    ........................x
    ................x
    .........X
    

    Beim 2. Beispiel Sieht man das problem ziemlich deutlich: wie soll man die Zwischenräume ausfüllen?

    na so...

    .............................xxxxx
    .....................xxxxxxx
    ..............xxxxxx
    .........Xxxx
    


  • Genau davon hab ich geredet. so bekommt mann ab ca 5° Flugwinkel eine Gerade Linie und keine Schiefe Linie mehr


Log in to reply