Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2014, 20:18   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию простой тетрис на С++

Мой знакомый программист задал мне задачку написать простой тетрис, используя двумерные массивы и функции.
С чего посоветуете начать? Возможно у кого-то есть идеи.
Особенно интересует, как "заставить" фигуры падать.
marenko.lilia вне форума Ответить с цитированием
Старый 11.09.2014, 20:35   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Что-то начали писать?
Начните с того, чем у вас будут представляться фигуры и поле, по которому они движутся.

Потом напишите функции:
- проверки того, что фигура уперлась в дно (или то, что лежит на дне)
- смещение фигуры вниз, вправо, влево, по диагонали влево/вправо
- поворота фигуры
Ну и все - тетрис почти готов.
rrrFer вне форума Ответить с цитированием
Старый 11.09.2014, 21:04   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

У каждой фигуры есть координаты. Меняем координаты - фигура движется.
Каждая фигура выдает координаты своих "кусочков" относительно своей основной координаты. Каждую координату проверяем на предмет возможности передвижения - свободна ли нижняя клетка. Ну и само игровое поле - двухмерных массив состояний, типа свободно/занято/занято_такой_то фигурой. Проверяем заполнен ли весь ряд и если да, удаляем, все осталыные елементы "проваливаются" вниз.

Как-то так.
waleri вне форума Ответить с цитированием
Старый 11.09.2014, 21:10   #4
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Нет, я еще не начала писать эту программу )) Мне интересно узнать разные подходы разных людей. Вроде бы представляю себе немного, как и что делать. Но как-то еще все очень сложно для меня.
marenko.lilia вне форума Ответить с цитированием
Старый 11.09.2014, 21:11   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Код:
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>

using namespace std;

char getch(){
    char buf=0;
    struct termios old={0};
    fflush(stdout);
    if(tcgetattr(0, &old)<0)
        perror("tcsetattr()");
    old.c_lflag&=~ICANON;
    old.c_lflag&=~ECHO;
    old.c_cc[VMIN]=1;
    old.c_cc[VTIME]=0;
    if(tcsetattr(0, TCSANOW, &old)<0)
        perror("tcsetattr ICANON");
    if(read(0,&buf,1)<0)
        perror("read()");
    old.c_lflag|=ICANON;
    old.c_lflag|=ECHO;
    if(tcsetattr(0, TCSADRAIN, &old)<0)
        perror ("tcsetattr ~ICANON");
    printf("%c\n",buf);
    return buf;
}

enum CellType { Empty, Figure, Bottom };

void draw(CellType **field, int n, int m) {
  for (int i = 0;i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      switch (field[i][j]) {
	case Empty:
	  cout << " ";
	  break;
	case Figure:
	  cout << "*";
	  break;
	case Bottom:
	  cout << "#";
	  break;
      }
    }
    cout << endl;
  }
}

bool moveRight(CellType **a, int n, int m) {
  for (int j = m - 1; j >= 0; --j) {
    for (int i = 0; i < n; ++i) {
      if (a[i][j] == Figure) {
	if (j == (m - 1)) return false; // плохой код, ты ведь пишешь isFigureCanMove
	a[i][j] = Empty;
	a[i][j + 1] = Figure;
      }
    }
  }
  return true;
}
  

int main() {

  CellType **field;
  
  const int n = 10, m = 20;
  
  field = new CellType* [n];
  for (int i = 0;i < n; ++i) {
    field[i] = new CellType[m];
    for (int j = 0; j < m; ++j) {
      field[i][j] = Empty;
    }
  }
  
  // как-то добавляешь фигуру
  field[2][2] = Figure;
  field[2][3] = Figure;
  field[3][2] = Figure;
  
  bool canMove = true;
  do {
    system("clear");
    draw(field, n, m);
    canMove = moveRight(field, n, m);
    system("sleep 1");
  } while (canMove);
  
      
}
Тут фигура движется вправо. Смещается на одну клетку в секунду.

Я писал под линуксом, но тебе под виндой не нужен getch (подключи conio.h - там уже встроен getch).

Ну и system("clear"), надо заменить на system("cls"); - это очистка консоли в windows

system("sleep 1") - заменить на Sleep(1000) и "windows.h" подключить - это даст задержку на одну секунду
rrrFer вне форума Ответить с цитированием
Старый 11.09.2014, 22:23   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

marenko.lilia, а сможете нарисовать несколько картинок? Ваши фигуры же буду состоять из букв, значков и цифр? Я, если честно, вообще не представляю, как это будет выглядеть
8Observer8 вне форума Ответить с цитированием
Старый 11.09.2014, 22:36   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

8Observer8
из звездочек у нее будут состоять фигуры (как в моей программе)
Код:
  ***
    *

  # ##
##  #
### ##
Типа того. Звездочками фигура - которая двигается, решетками дно игрового поля, которое кривое, т.к. там что-то лежит
rrrFer вне форума Ответить с цитированием
Старый 11.09.2014, 23:12   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Меня автор темы вдохновил на написание своего тетриса! Взял за основу пример, где кубик летает по окну, ударяется и отскакивает от стенок: ссылка

Пока мой кубик просто медленно двигается вниз. Стрелками я могу его перемещать влево и вправо. Он медленно улетает вниз



P.S. Просто поделился информацией. Тему загаживать не буду.
8Observer8 вне форума Ответить с цитированием
Старый 12.09.2014, 09:35   #9
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

rrrFer, ты мне задал эту задачу, ты мне и помог (наконец-то)
у меня правда, еще слишком мало знаний, чтобы что-то такое самостоятельно написать. Буду разбираться сейчас с твоим кодом.

8Observer8, рада Вас вдохновлять ))) Но это не моя идея - написать свой тетрис. Ее мне подкинул rrrFer
marenko.lilia вне форума Ответить с цитированием
Старый 12.09.2014, 10:14   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Лилия, ваша программа уже что-нибудь выводит?
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C тетрис Цукер Помощь студентам 0 21.11.2011 22:53
Тетрис на си фыф123 Помощь студентам 1 22.06.2011 10:48
Тетрис Александр123456 Общие вопросы C/C++ 1 02.12.2010 23:15
Тетрис k1r1ch Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 02.01.2010 12:20
массив и тетрис sid Паскаль, Turbo Pascal, PascalABC.NET 2 04.04.2007 14:41