Kafelkowy Tetris

0

Ogólnie to robię prosty program na zajęcia. Program ten wyświetla panel po którym w dół spadają pojedyncze klocki i można je przesuwać w prawo w lewo, jak klocków będzie za dużo to krzyczy "game over" i czyści planszę. Oczywiscie wykładowca dał nam kawałek kodu i trzeba wszystko dorobić. parę punktów sam zrobiłem ale nie wiem jak sie zabrać za takie trzy:

1 pkt) Zmodyfikuj program w taki sposób, aby kafelek nigdy nie pojawiał się przy krawędzi planszy,
a w pozostałych kolumnach z takim samym prawdopodobieństwem.

2 pkt) Dodaj obsługę spadania kafelek (po naciśnięciu odpowiedniego przycisku kafelek z minimalnym opóźnieniem (szybka animacja) spada na sam dół - nie można nim już sterować

3 pkt) Jeśli 4 jednokolorowe kafelki utworzą kwadrat, to wszystkie one znikają a
te kafelki, które były położone nad nimi spadają na dół.
Bardzo proszę o pomoc, nie muszą to być gotowe kody a jakieś wskazówki.
Program:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Kolo_teris
{
    public partial class Form1 : Form
    {
        public bool appRunning = false;
        public Tile activeTile = null;
        Random rnd = new Random();
        //Tablica pól
        public bool[,] tilesMatrix;

        public Form1()
        {
            InitializeComponent();
            tilesMatrix = new bool[
                arenaPanel.Width / Tile.TileWidth,
                arenaPanel.Height / Tile.TileHeight];
        }


        private void startButton_Click(object sender, EventArgs e)
        {
            if (appRunning)
            {
                appRunning = false;
                startButton.Text = "START";
            }
            else
            {
                appRunning = true;
                startButton.Text = "STOP";
                timer1.Enabled = true;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (appRunning)
            {
                if (activeTile == null) //create a new tile to fall down
                {
                    // Losowanie pozycji
                    int pos = rnd.Next(tilesMatrix.GetLength(0));
                    if (tilesMatrix[pos, 0])
                    {  // end of game
                        appRunning = false;
                        MessageBox.Show("Game Over");
                        arenaPanel.Controls.Clear();
                        for (int i = 0; i < tilesMatrix.GetLength(0); ++i)
                            for (int j = 0; j < tilesMatrix.GetLength(1); ++j)
                            {
                                tilesMatrix[i, j] = false;
                            }
                        startButton.Text = "START";
                    }
                    else
                    {
                        tilesMatrix[pos, 0] = true;
                        activeTile = new Tile();
                        arenaPanel.Controls.Add(activeTile);
                        //activeTile.Size = new System.Drawing.Size(Tile.Width, Tile.Height);
                        activeTile.Location = new Point(pos * Tile.TileWidth, 0);
                        activeTile.UseVisualStyleBackColor = true;
                        activeTile.Enabled = true;

                        int kolor = rnd.Next(3);
                        switch (kolor)
                        {
                            case 0: activeTile.BackColor = Color.Yellow;
                                break;
                            case 1: activeTile.BackColor = Color.Red;
                                break;
                            case 2: activeTile.BackColor = Color.Green;
                                break;
                           
                        }



                    }
                }
                else
                { //continue falling down
                    if (activeTile.Location.Y + 2 * Tile.TileHeight >= arenaPanel.Height)
                    {  // the tile is at the bottom
                        activeTile = null;
                    }
                    else
                    {
                        int posx = activeTile.Location.X / activeTile.Width;
                        int posy = activeTile.Location.Y / activeTile.Height;

                        if (!tilesMatrix[posx, posy + 1])
                        {
                            tilesMatrix[posx, posy + 1] = true;
                            activeTile.Location = new Point(posx * Tile.TileWidth, (posy + 1) * Tile.TileHeight);
                            tilesMatrix[posx, posy] = false;
                        }
                        else
                        { //tile blocked
                            activeTile = null;
                        }

                    }
                }
            }
        }

        private void downButton_Click(object sender, EventArgs e)
        {


        }

        private void leftButton_Click(object sender, EventArgs e)
        {
            {
                int posx = activeTile.Location.X / activeTile.Width;
                int posy = activeTile.Location.Y / activeTile.Height;

                if (!tilesMatrix[posx - 1, posy])
                {
                    tilesMatrix[posx - 1, posy] = true;
                    activeTile.Location = new Point((posx - 1) * Tile.TileWidth, (posy) * Tile.TileHeight);
                    tilesMatrix[posx, posy] = false;
                }
                else
                { //tile blocked
                    activeTile = null;
                }

            }
        }

        private void rightButton_Click(object sender, EventArgs e)
        {
            {
                int posx = activeTile.Location.X / activeTile.Width;
                int posy = activeTile.Location.Y / activeTile.Height;

                if (!tilesMatrix[posx + 1, posy])
                {
                    tilesMatrix[posx + 1, posy] = true;
                    activeTile.Location = new Point((posx + 1) * Tile.TileWidth, (posy) * Tile.TileHeight);
                    tilesMatrix[posx, posy] = false;
                }
                else
                { //tile blocked
                    activeTile = null;
                }

            }
        }
    }
} 
0

1 pkt) Zmodyfikuj program w taki sposób, aby kafelek nigdy nie pojawiał się przy krawędzi planszy,
a w pozostałych kolumnach z takim samym prawdopodobieństwem.
A znalazłeś miejsce, gdzie jest losowana pozycja? Jak znajdziesz, to powinno być łatwo…

0
int pos = rnd.Next(tilesMatrix.GetLength(0)); 

Wydaje mi się że to bo randomowo wyszukuje pozycję, tylko jakby ktoś mi wyjaśnił jak działa to GetLength

0

GetLength(0) i GetLength(1) zwraca ci rozmiar zerowego i pierwszego wymiaru tablicy dwuwymiarowej (odpowiednio wysokość i szerokość, albo odwrotnie – kwestia umowna).

0

To ktoś jeszcze pomoże bo mimo iż znalazłem nie wiem jak to ustawić. Do tego pierwszego mam jakoś granicę ustawić - szerokość klocka? Jeśli tak to jak to zrobić..

0

Ja Ci pomogę jak jakoś ludzko ponazywasz te funkcje. Ja tutaj nic nie rozumiem.

0

Niestety to wykładowca dał takie nazwy i kazał nie zmieniać.Jak mówiłem w pierwszym poście to on nam dał kawałek kodu i kazał poprzerabiać dając listę poleceń. No nic czas do środy mam może sam dam radę ale jakby ktoś miał pomysł to proszę.
Żeby ułatwić daję program jaki jest w obecnej formie
http://www.sendspace.pl/file/b23df1cc75c9b0a2a19ef31

0

Dobra udało mi się sprawić by sie nie pojawiały przy krawędziach, istotnie wystarczyło dodać:

int pos = rnd.Next (1,tilesMatrix.GetLength(0)-1) 

ma ktoś pomysł na dwa pozostałe?

0

dobra z kafelkiem na dół też sobie poradziłem ale z tymi 4 potrzebuje pomocy. help plz

0

Powiedz gdzie w kodzie masz zrobione usuwanie jednego wiersza gdy jest zapełniony, bo 5 minut przeglądałem i nie znalazłem. Wtedy postaram Ci się pomóc.

0

Tego nie mam bo wykładowca wymaga usuwanie tylko czterech które utworzą kwadrat w jednym kolorze.
Ogólnie jest tutaj przesuwanie klocka w prawo w lewo, losowanie kolorów, opadanie klocka.

0

Ja bym to zrobił tak: W chwili gdy klocek zderza się z podłożem zaczałbym przeszukiwać plansze w celu znalezienia klocka 2x2. Po znalezieniu usuwał, sprawdzał czy jest coś na nim, jeśli tak to zaczynałoby się spadanie. Gdy spadną to znowu sprawdzanie klocków 2x2 i tak do sprawdzenia wszystkich elementów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1