Klassiska programmeringsproblem

Diskutera artiklarna

Klassiska programmeringsproblem

Inläggav Jonas Nilsson » 28 augusti 2015, 19:57

Här kan du kommentera/diskutera artikelns innehåll.
Användarvisningsbild
Jonas Nilsson
Administratör
 
Inlägg: 289
Blev medlem: 2 november 2011, 09:47

Re: Klassiska programmeringsproblem

Inläggav Xylas » 6 juli 2017, 13:17

Denna fråga kanske inte är helt relaterad till artikeln, men jag postar den ändå här eftersom att Game Of Life är ganska likt.

Jag håller på med ett litet projekt som heter Forrest Fire och som namnet antyder ska programmet simulera en skogsbrand. Jag har en int array på 50*20 och varje "cell" har antingen värdet 0, 1 eller 2.

0 är tomruta, 1 är träd, och 2 är brinnande träd.

p = chansen för att ett träd uppstår i en tomruta.
f = risken att ett träd antänder även fast det inte är några grannar som brinner.

Om ett träd har en granne som brinner ska trädet börja brinna.

Jag har kommit en bit på vägen, men när branden kommer in blir allting kaos. Detta är min kod:

Kod: Markera allt
class ForestFire
{
    const double f = 0.003; // risk of burning
    const double p = 0.05; // chance of new tree

    static Random rnd = new Random();

    static int[,] data = new int[50, 20];
    // 0 = empty
    // 1 = tree
    // 2 = burning

    static void Main()
    {
        DrawData();

        while (true)
        {
            for (int y = 0; y < data.GetLength(1); y++)
            {
                for (int x = 0; x < data.GetLength(0); x++)
                {
                    //if (data[x, y] == 2) data[x, y] = 0; // Make burning tree empty
                    if (data[x,y] == 1 && rnd.NextDouble() <= f) // Sudden fire
                    {
                        data[x, y] = 2;
                    }
                    if (GetBurningNeighbours(x, y) >= 1) data[x, y] = 2;
                    if (data[x,y] == 0 && rnd.NextDouble() <= p) // New tree
                    {
                        data[x, y] = 1;
                    }
                }
            }

            // Refreshing
            Console.ReadKey();
            Console.Clear();
            DrawData();
        }
    }

    static void DrawData()
    {
        for (int y = 0; y < data.GetLength(1); y++)
        {
            for (int x = 0; x < data.GetLength(0); x++ )
            {
                if (data[x, y] == 0) Console.Write(".");
                else if (data[x, y] == 1) Console.Write("#");
                else if (data[x, y] == 2) Console.Write("*");
                else Console.Write("0");
            }
            Console.WriteLine();
        }
    }

    static int GetBurningNeighbours(int xPos, int yPos)
    {
        int burningNeighbours = 0;
       
        for (int y = yPos - 1; y <= yPos + 1; y++)
        {
            for (int x = xPos - 1; x <= xPos + 1; x++ )
            {
                if (x == -1 || x == data.GetLength(0) ||
                    y == -1 || y == data.GetLength(1) || (x == xPos && y == yPos)) continue;

                if (data[x, y] == 2) burningNeighbours++;
            }
        }

        return burningNeighbours;
    }
}


Tack på förhand,
Xylas


EDIT:
Löste problemet och detta är min färdiga kod om någon vill se:
Kod: Markera allt
using System;
using System.Collections.Generic;
using System.Threading;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Net.Sockets;
using System.Net;

class ForestFire
{
    const double f = 0.001; // risk of burning
    const double p = 0.05; // chance of new tree

    static Random rnd = new Random();

    static int[,] data = new int[35, 20];
    // 0 = empty
    // 1 = tree
    // 2 = burning

    static void Main()
    {
        DrawData();

        while (true)
        {
            int[,] newData = data;

            for (int y = 0; y < data.GetLength(1); y++)
            {
                for (int x = 0; x < data.GetLength(0); x++)
                {
                    if (data[x, y] == 2) newData[x, y] = 0; // Make burning tree empty
                    if (data[x, y] == 1 && GetBurningNeighbours(x, y) >= 1) newData[x, y] = 2; // Neighbor fire
                    if (data[x,y] == 1 && rnd.NextDouble() <= f) // Sudden fire
                    {
                        newData[x, y] = 2; // New field could be useful
                    }
                    if (data[x,y] == 0 && rnd.NextDouble() <= p) // New tree
                    {
                        newData[x, y] = 1;
                    }
                }
            }

            data = newData;

            // Refreshing
            Console.ReadKey();
            Console.Clear();
            DrawData();
        }
    }

    static void DrawData()
    {
        for (int y = 0; y < data.GetLength(1); y++)
        {
            for (int x = 0; x < data.GetLength(0); x++ )
            {
                if (data[x, y] == 0)
                {
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.Write("  ");
                }
                else if (data[x, y] == 1)
                {
                    Console.BackgroundColor = ConsoleColor.Green;
                    Console.Write("  ");
                    Console.BackgroundColor = ConsoleColor.Black;
                }
                else if (data[x, y] == 2)
                {
                    Console.BackgroundColor = ConsoleColor.Red;
                    Console.Write("  ");
                    Console.BackgroundColor = ConsoleColor.Black;
                }
                else Console.Write("0");
            }
            Console.WriteLine();
        }
    }

    static int GetBurningNeighbours(int xPos, int yPos)
    {
        int burningNeighbours = 0;
       
        for (int y = yPos - 1; y <= yPos + 1; y++)
        {
            for (int x = xPos - 1; x <= xPos + 1; x++ )
            {
                if (x == -1 || x == data.GetLength(0) ||
                    y == -1 || y == data.GetLength(1) || (x == xPos && y == yPos)) continue;

                if (data[x, y] == 2) burningNeighbours++;
            }
        }

        return burningNeighbours;
    }
}
Xylas
 
Inlägg: 9
Blev medlem: 14 december 2014, 18:25


Återgå till Artiklar

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster

cron