Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

[leicht bis mittel-schwer] Game Of Life

Diskussion: [leicht bis mittel-schwer] Game Of Life im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Genial! Sehr interessantes Spiel Hab mal eine Javascript+HTML Lösung gebastelt: Klick = Zelle setzen Doppelklick = Zelle entfernen...

Like Tree1Likes

Antwort
Alt 17.07.10, 17:52   #16 (permalink)
 
Registriert seit: 17.07.10
nullEuro Leistung: Facit NTK
Likes: 0
Standard


Genial! Sehr interessantes Spiel Hab mal eine Javascript+HTML Lösung gebastelt:

Klick = Zelle setzen
Doppelklick = Zelle entfernen

Angehängte Dateien
Dateityp: zip game.zip (1,7 KB, 18x aufgerufen)
nullEuro ist offline   Mit Zitat antworten
Alt 24.07.10, 18:44   #17 (permalink)
 
Benutzerbild von chumbalum
 
Registriert seit: 09.07.10
chumbalum Leistung: Facit NTK
chumbalum eine Nachricht über ICQ schicken
Likes: 0
Standard

habe meine Version mal überarbeitet und SDL mit reingepackt ... aber der Aufwand SDL zu installieren ist 10x größer als der Nutzen :o
Code   

Code:
# Autor: Christian Hoff
require "sdl"

class GameOfLife
  include Enumerable

  def initialize(size)
    @size = size
    @feld = Array.new(@size){Array.new(@size,false)}

    # Startpopulation
    @feld[6][9] = true
    @feld[7][7] = true
    @feld[7][8] = true
    @feld[7][9] = true
    @feld[7][10] = true
    @feld[7][11] = true
    @feld[8][6] = true
    @feld[8][7] = true
    @feld[8][9] = true
    @feld[8][11] = true
    @feld[8][12] = true
    @feld[9][7] = true
    @feld[9][9] = true
    @feld[9][11] = true
    @feld[10][9] = true

    # Zusatz
    @screen = nil
    init_sdl()
  end

  def init_sdl()
    SDL.init(SDL::INIT_VIDEO)
    @screen = SDL::setVideoMode(800, 600, 16,SDL::SWSURFACE)
  end

  def each(&block)
    @feld.each(&block)
  end

  def to_s
    self.inject(string=""){|string,senkrecht|
      senkrecht.each{|waagerecht| (waagerecht)?(string+="O "):(string+="  ")
      }
      string+="\n"
    }
  end

  def step()
    buffer_array = []
    for x in (0..(@size-1))
      for y in (0..(@size-1))
        counter = 0
        
        counter += 1 if @feld[y-1][x-1] if (x-1 >= 0 && y-1 >= 0)
        counter += 1 if @feld[y-1][x] if (y-1 >= 0)
        counter += 1 if @feld[y-1][x+1] if (x+1 < @size && y-1 >= 0)
        counter += 1 if @feld[y][x-1] if (x-1 >= 0)
        counter += 1 if @feld[y][x+1] if (x+1 < @size)
        counter += 1 if @feld[y+1][x-1] if (x-1 >= 0 && y+1 < @size)
        counter += 1 if @feld[y+1][x] if (y+1 < @size)
        counter += 1 if @feld[y+1][x+1] if (x+1 < @size && y+1 < @size)

        # => Eine tote Zelle mit genau drei lebenden Nachbarn wird in der Folgegeneration neu geboren.
        if ((counter == 3) && (@feld[y][x]==false))
          buffer_array << [y,x,true]
        end

        # => Lebende Zellen mit weniger als zwei lebenden Nachbarn sterben in der Folgegeneration an Einsamkeit.
        if((counter < 2) && (@feld[y][x]==true))
          buffer_array << [y,x,false]
        end

        # => Eine lebende Zelle mit zwei oder drei lebenden Nachbarn bleibt in der Folgegeneration lebend.
        if(((counter == 2) || (counter ==3)) && @feld[y][x]==true)
          buffer_array << [y,x,true]
        end

        # => Lebende Zellen mit mehr als drei lebenden Nachbarn sterben in der Folgegeneration an Überbevölkerung.
        if ((counter > 3) && (@feld[y][x]==true))
          buffer_array << [y,x,false]
        end
      end
    end

    buffer_array.each{|elem_state| @feld[elem_state[0]][elem_state[1]] = elem_state[2]}

  end

  def run()
    running = true
    rmask = 0xff000000
    gmask = 0x00ff0000
    bmask = 0x0000ff00
    amask = 0x000000ff
    surface = SDL::Surface.new(SDL::HWSURFACE, 800, 600, 16, rmask, gmask, bmask, amask)

    while (running)
      while(event = SDL::Event.poll)
        case event
          when SDL::Event::Quit
            running = false;
        end
      end

      for x in (0..(@size-1))
        for y in (0..(@size-1))
          surface.draw_rect(x*10,y*10,10,10, [255,255,255,255], true) if (@feld[y][x])
        end
      end

      @screen.fillRect(0, 0, 800, 600, 0)
      SDL::Surface.blit(surface,0,0,800,600,@screen,0,0)
      surface.fillRect(0, 0, 800, 600, 0)
      @screen.flip()
      self.step()
      sleep(0.1)
    end
  end

end

game = GameOfLife.new(50)
game.run
__________________
WYSIWYG
chumbalum ist offline   Mit Zitat antworten
Alt 25.07.10, 00:31   #18 (permalink)
 
Benutzerbild von rami
 
Registriert seit: 09.02.08
rami Leistung: Facit NTK
rami eine Nachricht über ICQ schicken rami eine Nachricht über Skype™ schicken
Likes: 0
Standard

Ne Lösung zur Aufgabe "Einfach" mit zufälligem Startwert statt festprogrammiertem hab ich mal vor einiger Zeit in einem Anflug von Langeweile und fehlendem Internet umgesetzt, das poste ich hier der Vollständigkeit halber mal. Ausgabe ist auf ner Konsole (mithilfe von `clear`).

In PHP: http://github.com/raphaelm/conwaycli...gameoflife.php
In Python: http://github.com/raphaelm/conwaycli.../gameoflife.py
__________________
rami ist offline   Mit Zitat antworten
Alt 08.07.11, 16:07   #19 (permalink)
 
Registriert seit: 08.07.11
_Sakul_ Leistung: Facit NTK
Likes: 0
Standard

Hallo,

hier kommt meine Lösung für das Lebensspiel

ich habe die Grafikschnittstelle allegro für die grafische ausgabe verwendet.

Code:
//---Lebens-Simulations PROGRAMM---
/**********************************

wenn allegro verwendet wird muss zusätzlich zu "g++ DATEINAME.CPP"
noch " `allegro-config --cflags` `allegro-config --libs` angegeben werden

die Zeile im terminal sieht dan so aus:
" g++ main.cpp `allegro-config --cflags` `allegro-config --libs` "

ein dynamischer zellhaufen der in einer welt von 800 mal 600 pixel vor sich hin
vegetiert.

Die Zellen werden für die Ausgangssituation zufällig auf einem feld von 400 * 300
Pixel verteilt, welches sich in der mitte der "welt" befindet.

**********************************/

#include <allegro.h>    //include-datei für die allegrofunktionen

short cell[800][600];
short temp[800][600];
short x, y, m, a, b, cnt;
long int zykl;

int main()
{
        allegro_init();         //initialisiert allegro
        install_keyboard();     //teilt mit dass die tastatur verwendet wird
        set_color_depth(16);    //stellt die farbtiefe ein -> hier auf 16bit
        set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);          //stellt die bildschirmauflösung auf 800x600 pixel
    set_window_title("Digital Life");
    show_os_cursor(MOUSE_CURSOR_ARROW);

    BITMAP *welt;
    welt = create_bitmap(800, 600);


reset:;

    //Initialisierung der Zellen
    for(int i=0; i < 800; i++)
    {
        for(int j=0; j < 600; j++) cell[i][j] = 0;
    }

    //Verteilung der Lebenden Zellen
    srand( time(NULL) );
    m = 1000 * (rand()%100 + 1);
    a = 0;
    for(int i = 0; i < m; i++)
    {
        x = rand()%400 + 200;
        y = rand()%300 + 150;
        if(cell[x][y]==0) a++;    //Zählt wieviel Zellen verteilt werden
        cell[x][y] = 1;
    }
    b = a;
    zykl = 0;

        while(!key[KEY_ESC])
    {
        while( key[KEY_SPACE] );    //Pause solange Leertaste gedrückt
        if( key[KEY_R] ) goto reset;    //Neustart wenn r gedrückt

        clear_to_color( welt, makecol(173,230,216) );    //Hintergrundfarbe

        textprintf_ex( welt, font, 5, 15, makecol(255,0,0), -1, "Digital Life - Lebenssimulator (C) 2011 Lukas");
        textprintf_ex( welt, font, 5, 35, makecol(255,0,0), -1, "Zellen zu Beginn: %d Zellen momentan: %d", a, b );
        textprintf_ex( welt, font, 5, 45, makecol(255,0,0), -1, "Bisher berechnete Zyklen: %ld", zykl );
        textprintf_ex( welt, font, 5, 55, makecol(255,0,0), -1, "Unterbrechen: LEERTASTE,   Neustart: R,   Beenden: ESC");

        b = 0;        //Zähler für aktuelle Zellenanzahl zurücksetzen
        zykl++;        //Zykluszähler erhöhen

        //Regeln für fortbestand/tod/entstehung der zellen
        for(int i = 1; i < 799; i++)
        {
            for(int j = 1; j < 599; j++)
            {
                cnt = 0;
                if( cell[i-1][j-1] == 1 ) cnt++;
                if( cell[i-1][j] == 1 ) cnt++;
                if( cell[i-1][j+1] == 1 ) cnt++;
                if( cell[i][j-1] == 1 ) cnt++;
                if( cell[i][j+1] == 1 ) cnt++;
                if( cell[i+1][j-1] == 1 ) cnt++;
                if( cell[i+1][j] == 1 ) cnt++;
                if( cell[i+1][j+1] == 1 ) cnt++;

                if( cnt < 2 ) temp[i][j] = 0;
                if( (cnt == 2)&&(cell[i][j] > 0) ) temp[i][j] = 1;
                if( cnt == 3 ) temp[i][j] = 1;
                if( cnt > 3 ) temp[i][j] = 0;
            }
        }

        //übergabe der neuen zellpositionen
        for(int i = 0; i < 800; i++)
        {
            for(int j = 0; j < 600; j++) cell[i][j] = temp[i][j];
        }

        //ausgabe der zellpositionen
        for(int i = 0; i < 800; i++)
        {
            for(int j = 0; j < 600; j++)
            {
                switch( cell[i][j] )
                {
                    case 0: {break;}
                    case 1: {putpixel( welt, i, j, makecol(85,107,47) ); b++; break;}
                    default: {textprintf_ex( screen, font, 30, 200, makecol(255,0,0), makecol(0,0,255), "ERROR");
                          while( !key[KEY_ESC] ); break;}
                }
            }
        }
        draw_sprite(screen, welt, 0, 0);    //ausgabe der "welt" an den Bildschirm
    }

    destroy_bitmap(welt);    //Die "welt" wieder freigeben

        return 0;
}
END_OF_MAIN();          //schliesst die allegro anwendung wieder
ich habe es mit g++ unter linux compiliert,....
sollte aber genau so auch überall anders wo allegro installiert ist compilierbar sein.

lg lukas,

BTW: hallo an euch alle!! (erster post)

Geändert von CDW (08.07.11 um 18:56 Uhr) Grund: [CODE] Tags sind schöner als [QUOTE] Tags
_Sakul_ ist offline   Mit Zitat antworten
Alt 05.11.11, 22:20   #20 (permalink)
 
Registriert seit: 12.04.09
CiscoKid Leistung: Z3
Likes: 2
Standard

hier meine implementation in 5 Zeilen C-code:
Code:
# define B f[a]
char  f[2][26][82],i,j,a=0,c[]="_o",n;main(){B[3][3]=B[3][2]=B[3][1]=B[2][3]=B[1][2]=1;for
(;;){system("clear");for(i=1;i< 25;i++){for(j=1; j<81;j++){printf("%c",c[f[!a][i][j]]);n=B
[i-1][j-1]+B[i-1][j]+B[i-1][j+1]+B[i][j-1]+B[i][j+1]+B[i+1][j-1]+B[i+1][j]+B[i+1][j+1];f[!
a][i][j]=(!B[i][j]&&n==3) ||(B[i][j]&&n>1&&n<4);}puts("");}sleep(1);a=!a;}}
Hab jetzt endlich ne Sig
Tarantoga likes this.
__________________
Code:
# define B f[a]
char  f[2][26][82],i,j,a=0,c[]="_o",n;main(){B[3][3]=B[3][2]=B[3][1]=B[2][3]=B[1][2]=1;for
(;;){system("clear");for(i=1;i< 25;i++){for(j=1; j<81;j++){printf("%c",c[f[!a][i][j]]);n=B
[i-1][j-1]+B[i-1][j]+B[i-1][j+1]+B[i][j-1]+B[i][j+1]+B[i+1][j-1]+B[i+1][j]+B[i+1][j+1];f[!
a][i][j]=(!B[i][j]&&n==3) ||(B[i][j]&&n>1&&n<4);}puts("");}sleep(1);a=!a;}}
CiscoKid ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » [leicht bis mittel-schwer] Game Of Life
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61