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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2014, 09:41   #81
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Зачем там винапи? - для очистки экрана? - читай тему внимательно.
Читал я всё очень внимательно, но ничего не понял. Не хочу возвращаться и тратить время. Скинь exe с игрой в доказательство своей компетентности. Без этого не вижу смысла пытаться понять, что ты хотел сказать.
8Observer8 вне форума Ответить с цитированием
Старый 14.09.2014, 09:48   #82
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Скинь exe с игрой в доказательство своей компетентности. Без этого не вижу смысла пытаться понять, что ты хотел сказать.
пост №40 читай.

Для особо одаренных танкистов (сегодня день танкиста - ваш день, ребят). Я повторять не буду. Жди пол года - может быть ТС таки напишет тебе тетрис, а я не компетентный.

Цитата:
Читал я всё очень внимательно, но ничего не понял.
Что ты пытался понять то?
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 11:27   #83
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

rrrFer, ты же говорил, что сможешь написать меньше чем за два часа. Слабо?
8Observer8 вне форума Ответить с цитированием
Старый 14.09.2014, 11:48   #84
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

прочитай пост #40
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 11:58   #85
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

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

Весь тетрис, писать не стал, он мне не интересен, интересно было с таймером повозиться в консольном варианте.

Код:
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<dos.h>
#define T_ZDR 10 // Время задержки таймера
using namespace std;

int main()
{
  char key = 0;
  // Задаём параметры таймера задержки
  struct time tm;
  gettime(&tm);
  int m_sec = int(tm.ti_hund);
  int m_sec_pr = m_sec;
  int zdr = T_ZDR;
  // создаём и очищаем массив
  char arr[20][10];
  for(int i=0; i<20; i++)
    for(int j=0; j<10; j++)
      arr[i][j] = '.';

  system("cls");
  while(key != 27)
  {
    gettime(&tm);
    int m_sec = int(tm.ti_hund);
    if(m_sec != m_sec_pr)// пропускаем текущую милисекунду
    {
      m_sec_pr = m_sec;// задаём текущую милисекунду
      if(zdr-- == 0)
      {
        if(kbhit()) key = getch();
        else key = 0;
//**************************************************
        // Здесь, основной цикл игры

        system("cls");
        for(int i=0; i<20; i++)
        {
          cout << "\t";
          for(int j=0; j<10; j++)
             cout << arr[i][j] << " ";
          cout << "\n";
        }
//*************************************************
        zdr = T_ZDR;
      }
    }
  }
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 14.09.2014 в 15:03.
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.09.2014, 12:18   #86
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
прочитай пост #40
Понятно: "сам не знам, но вам объясням". Ты бы попробовал, для начала, сам сделать, а потом бы других этому учил. Завёл бы девушку в тёмный лес, а потом бы только понял, что не туда пришли и бросил её там. Как можно пытаться тянуть до своего уровня, находясь в самом начале... Давать задачу, которую сам не можешь решить
8Observer8 вне форума Ответить с цитированием
Старый 14.09.2014, 13:39   #87
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Что за писькомерство тут развели? TDD, OpenGL,... Объем темы перевалил уже за объем кода простенького тетриса
Полчаса поисков и разбирательств с тем как на WinAPI создать окно и как с GDI выводить прямоугольники разноцветные. Еще немного времени на разборки с таймерами и обработкой нажатий клавиатуры.
За день без опыта и с головой на плечах это пишется в современных условиях.
И не парьте вы мозг начинающим всеми этими паттернами и технологиями.
pu4koff вне форума Ответить с цитированием
Старый 14.09.2014, 15:08   #88
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вот, кто мне подскажет, как перейти к первой строке консоли не очищая её командой system("cls");?

Код:
#include<Windows.h>

COORD position;                                    // Объявление необходимой структуры
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Получение дескриптора устройства стандартного вывода
position.X = 0;                                    // Установка координаты X
position.Y = 0;                                    // Установка координаты Y
SetConsoleCursorPosition(hConsole, position);      // Перемещение каретки по заданным координатам
Нашел вот такой код. Но, вопрос остаётся открытым. Как это сделать, не используя
#include<Windows.h>?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 14.09.2014 в 17:14.
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.09.2014, 18:30   #89
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Нашел вот такой код. Но, вопрос остаётся открытым. Как это сделать, не используя
#include<Windows.h>?
curses можно использовать.
Но я бы использовать system("cls") - зачем парица?

Цитата:
Что за писькомерство тут развели? TDD, OpenGL,... Объем темы перевалил уже за объем кода простенького тетриса
Потому что форум - это тот же базар. Обсервер вот прочитал про опенгл, теперь пытается вкрутить его везде где нужно и не нужно. Челенджер прочитал какую-то книгу (он тут писал какую именно) про кольца защиты в ОС - все нам тут рассказал про это.

Конструктив был первые полторы страницы - там еще обсервер обещал не засирать тему, но потом таки засрал.

Цитата:
Завёл бы девушку в тёмный лес, а потом бы только понял, что не туда пришли и бросил её там.
Я не ты. Научись читать, чувак, я тыщу раз тебе это писал.
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 18:46   #90
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

rrrFer, одно твоё пятое сообщение чего стоит. Это сразу отбило всякое желание у новичка писать тетрис.

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
#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" подключить - это даст задержку на одну секунду
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