Как заставить Тетрис клонироваться?

Что мне помогло, я попытался извлечь и загрузить последний выбранный файл, используя цикл, вместо того, чтобы очищать очередь, и это сработало. Вот код.

for (int i = 0; i <= Request.Files.Count-1; i++)
{
 HttpPostedFileBase uploadfile = files[i];
 Stream fs = uploadfile.InputStream;
 BinaryReader br = new BinaryReader(fs);
 Byte[] imageBytes = br.ReadBytes((Int32)fs.Length);
}

Надеюсь, это может помочь некоторым.

14
задан Brock Woolf 1 April 2009 в 12:04
поделиться

8 ответов

После того как блок неподвижен, нет ничего, что отличает его от любого другого блока, который теперь неподвижен. В том отношении я думаю, что оно имеет большую часть смысла сохранить всю сетку как матрицу, где каждый квадрат или заполняется или не (наряду с цветом блока, если это).

я чувствую, что матрица имеет много преимуществ. Это сделает обнаружение коллизий простым (не имеющий необходимость соответствовать нескольким объектам, просто местоположения на матрице). При хранении его, поскольку матрица также поможет определить, когда сплошная линия будет создана. Вдобавок ко всему, Вы не должны волноваться о соединении неподвижного Тетромино, когда строка исчезает. И когда каждый делает, можно просто сместить всю матрицу вниз одним махом.

20
ответ дан 1 December 2019 в 07:40
поделиться

Это пахнет как домашняя работа, но мое взятие на объектно-ориентированном подходе для Тетриса должно было бы иметь каждый отдельный квадрат быть объектом, и оба "блока" (tetrominos) и сама сетка будут наборами тех же квадратных объектов.

объекты Блока справляются с вращением и положением падающих квадратов, и дескрипторы сетки, отображающие их и detroying, завершили строки. Каждый блок имел бы цвет или структуру связанными с ним, который будет обеспечен исходным объектом блока, из которого что это прибыло, но иначе квадраты в основе сетки не будут иметь никакого другого признака, что они были когда-либо частью того же исходного блока.

Для разработки при создании нового объекта блока он создает ряд 4 квадратов с тем же цветом/структурой на сетке. Сетка управляет их дисплеем. Таким образом, когда блок достигает низшей точки, Вы просто забываете о блоке, и квадраты остаются ссылаемыми сеткой.

Вращения и отбрасывание являются операциями, только блоку нужно соглашение с, и только одни его четыре квадрата (хотя это должно будет смочь запросить сетку, чтобы удостовериться, что вращение может соответствовать).

4
ответ дан 1 December 2019 в 07:40
поделиться

Используя массивы был бы самый легкий способ обработать Тетрис. Существует прямая корреляция между тем, что Вы видите на экране и структурах, используемых в памяти. Используя стек/очереди было бы излишество и излишне сложный.

у Вас может быть 2 копии падающего блока. Каждый будет для дисплея (Альфа), и другой будет перемещением (Бета).

Вам будет нужна структура как


class FallingBlock
{
  int pos_grid_x;
  int pos_grid_y;
  int blocks_alpha[4][4];
  int blocks_beta[4][4];

  function movedDown();
  function rotate(int direction();
  function checkCollision();
  function revertToAlpha();
  function copyToBeta()
};

, массив _beta был бы перемещением или повернутый и проверенный против управления по коллизиям. Если существует коллизия, вернитесь она к _alpha, в противном случае скопируйте _beta на _alpha.

И если бы существует коллизия на movedDown (), жизнь блока закончена, и _alpha сетка имела бы к скопированному на игровую доску и объект FallingBlock удаленный.

плата должна была бы, конечно, быть другой структурой как:


class Board
{
  int gameBoard[10][20];

  //some functions go here
}

я использовал интервал для представления блока, каждое значение (как 1,2,3) представление различной структуры или цвета (0 будет означать пустое место).

, После того как блок является частью gameboard, этому только был бы нужен идентификатор структуры/цвета, который будет отображен.

2
ответ дан 1 December 2019 в 07:40
поделиться

Я на самом деле просто сделал это несколько дней назад кроме WPF, а не XNA. Вот то, что я сделал:

Редактирование: Кажется, что я определяю "Блок" по-другому, чем другие люди. Что я определяю, поскольку Блок является одной из 4 ячеек, которые составляют Тетромино и самого фактического Тетромино как Часть.

Имеют Блок как структуру, которая имела X, Y координаты и Цвет. (Я позже добавил bool IsSet, чтобы указать, было ли это в плавающей части или на фактической плате, но это было просто, потому что я хотел отличить их визуально)

Как методы на Блоке, я Уехал, Право, Вниз, и Вращаюсь (Центр блока), который возвратил новый смещенный Блок. Это позволило мне поворачивать или передвигать любую фигуру, не зная форму или ориентацию части.

у меня был универсальный объект Части, который имел Список всех блоков, которые он содержал и индекс Блока, который был центром, который используется в качестве центра вращения.

я затем сделал PieceFactory, который мог произвести все различные части, и с Частью, не бывшей должной знать, какой частью это было, я мог (и сделал), легко добавляют изменение Частей, состоящих из более или менее, чем 4 Блока, не будучи должен создать любые новые классы

, Совет состоял из Словаря, который был всеми блоками, которые в настоящее время были на плате, а также размерах платы, которая настраивалась. Можно использовать Матрицу точно также, вероятно, но со Словарем я только должен был выполнить итерации через Блоки без пробелов.

2
ответ дан 1 December 2019 в 07:40
поделиться

Мое Решение (дизайн), с примерами в Python как хорошая замена для псевдо кода.

Используйте сетку 20 x 10, что tetrominoes падают.

Tetrominoes составлены из блоков, которые имеют атрибуты координаты (x, y) и цвет.

Так, например, T-форма tetrominoe похожа на это...

     . 4 5 6 7 8 .
  .
  19     # # #
  20       #
  .   

Таким образом T-форма является набором блоков с проводами (5,19), (6,19), (7,19), (6,20).

Перемещение формы является вопросом применения простого преобразования ко всем проводам в группе. например, спускать форму добавляют (0,1), оставленный (-1,0) или право (1,0) ко всем проводам в наборе, которые делают форму.

Это также позволяет Вам использовать некоторых простых аккуратный для вращения формы на 90 градусов. Правило состоит в том, что при вращении 90 градусов относительно источника, затем (x, y) становится равным (-y, x).

Вот пример для объяснения этого. При взятии T-формы сверху, используйте (6,19) в качестве блока центра для вращения вокруг. Для простоты сделайте это первой координатой в наборе, таким образом...

 t_shape = [ [6,19], [5,19], [7,19], [6,20] ]

Затем вот простая функция для вращения того набора координат на 90 градусов

def rotate( shape ):
    X=0      # for selecting the X and Y coords
    Y=1

    # get the middle block
    middle = shape[0]   

    # work out the coordinates of the other blocks relative to the
    # middle block
    rel = []
    for coords in shape:
        rel.append( [ coords[X]-middle[X], coords[Y]-middle[Y] ] )

    # now rotate 90-degrees; x,y = -y, x
    new_shape = []
    for coords in rel:
        new_shape.append( [ middle[X]-coords[Y], middle[Y]+coords[X] ] )

    return new_shape

Теперь, если Вы применяете эту функцию к нашему набору координаты для T-формы...

    new_t_shape = rotate( t_shape )

    new_t_shape
    [[6, 19], [6, 18], [6, 20], [5, 19]]

Планируйте это в системе координат, и она похожа на это...

     . 4 5 6 7 8 .
  .
  18       #
  19     # #
  20       #
  .   

Это было самым твердым битом для меня, надежда, это помогает кому-то.

2
ответ дан 1 December 2019 в 07:40
поделиться

Следует иметь в виду, что предыдущий победитель Запутываемого Конкурса Кода C реализовал довольно хорошую игру Тетриса (для терминалов VT100 на Unix BSD) меньше чем в 512 байтах запутываемого C:

long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
"\033[%dm  "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen(
"stty -cbreak echo stop \023;cat - HI|sort -rn|head -20>/tmp/$;mv /tmp/$ HI\
;cat HI","w");fprintf(d,"%4d on level %1d by %s\n",w,l,getlogin());pclose(d);}

http://www.ioccc.org/1989/tromp.hint

1
ответ дан 1 December 2019 в 07:40
поделиться

Не делающие блоки на самом деле похожи на автономные блоки, - по-моему - большой сбой многих клонов Тетриса. Я приложил специальные усилия к обеспечению , мой клон всегда выглядел правильным, является ли блок все еще "в игре" или отброшенный. Это означало идти немного вне простой матричной структуры данных и придумывать что-то, что поддерживало понятие "соединения" между частями блока.

у меня был класс, названный BlockGrid, который используется в качестве базового класса и для Block и для Board. BlockGrid имеет краткий обзор (чистый виртуальный в C++) метод, названный AreBlockPartsSameBlock, который подклассы должны переопределить, чтобы определить, принадлежат ли две различных части блока тому же блоку. Для реализации в Block, это просто возвращается true, если существуют части блока в обоих местах. Для реализации в Board, это возвращается true, если оба места содержат тот же Block.

BlockGrid класс использует эту информацию для "заполнения" деталей в представленных блоках, так, чтобы они на самом деле были похожи на блоки.

3
ответ дан 1 December 2019 в 07:40
поделиться

Я ни в коем случае не эксперт Тетриса, но как Вы описали 10x20, матрица походит на естественный выбор мне.

Это сделает это очень легким, когда время настанет к проверке при завершении строки или нет, и контакт с ним. Просто выполняя итерации по 2-му массиву, смотрящему на булевы значения каждого положения, чтобы видеть, составляют ли они в целом 10 положений блока.

Однако у Вас будет некоторая ручная уборка, чтобы сделать, если будет завершенная строка. Необходимость сместить все вниз. Все, хотя это не является настолько большим из соглашения, когда это сводится к нему.

1
ответ дан 1 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: