Показано с 1 по 4 из 4

Тема: Пример использования макросов на Си (ТЕТРИС)

  1. #1
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,838

    По умолчанию ТЕТРИС в панели СП3хх.

    Старый добрый ТЕТРИС для СП310
    Может кто-то помнит такой тетрис на ПВМ, когда мониторы были только текстовыми
    ВИДЕО:

    Захват-1.png
    Игра написана на Си, секция "main" оформлена одноименным макросом
    Захват-3.png

    Остальные функции находятся в Глобальном макросе
    Захват-4.png

    Старт игры происходит при вызове макроса "main" ф.кнопкой
    Захват-6.png

    Первая ф.область - отключает звук нажатия кнопок
    Вторая - задает начальный адрес "экранного буфера" и включает латинскую раскладку клавиатуры.

    Во вложении, в архивах, проекты для СП307 и СП310 для старой версии конфигуратора и для новой
    Захват-7.png

    Если этот пост не удалят, то могу более подробно описать работу проекта.
    Вложения Вложения
    Последний раз редактировалось petera; 31.05.2021 в 09:57.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #2

    По умолчанию

    Как это чудо прошло мимо меня?
    Очень круто =)))

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

  3. #3
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,838

    По умолчанию

    Цитата Сообщение от glazastik Посмотреть сообщение
    Как это чудо прошло мимо меня?
    Очень круто =)))

    Честно никогда не использовал макросы в этих панелях, но вы заставили меня взглянуть на них с другой стороны, огромное вам спасибо за это.
    Ха!
    Так ещё раньше с крестиков ноликов начинал https://owen.ru/forum/showthread.php?t=26783
    Скрытый текст:

    Собственно игра
    Код:
    #define SPACE ' '
    char matr[3][3] = { 
    {SPACE, SPACE, SPACE},
    {SPACE, SPACE, SPACE},
    {SPACE, SPACE, SPACE}
    } ;
    char done;
    int t;
    
    initial();
    memcpy(matrix, matr, sizeof(matr));
    done = SPACE;
    
    PRINTF("This is the game of Tic-Tac-Toe.\n");
    PRINTF("You will be playing against the OWEN's SP3xx.\n");
    PRINTF("\n\n\nPress any key to start GAME ");
    GETCH();
    CLRSCR();
    PRINTF("You start first, your figure is a cross - (X)\n");
    
    do {
    disp_matrix();
    get_player_move(); 
    done = check(); 
    if (done!=SPACE) break; 
    t = get_computer_move(); 
    done=check(); 
    } while((done==SPACE) && (t == 0));
    CLRSCR();
    if (t != 0) PRINTF("Draw!!!\n");
    	else if(done=='X') PRINTF("You won!!!\n");
    		else PRINTF("OWEN SP3xx won!!!\n");
    disp_matrix();
     
    PRINTF("\n--- G A M E  O W E R ----\n");
    PRINTF("Press any key to Exit ");
    GETCH();
    GOTOXY(0, lTotal);
    t = 10;
    while(t--) {
        PUTCHAR('\n');
        Delay(100);
    }   
    GOTOXY(0,8);
    PRINTF("Bye-bye take care of yourself!!!\n");
    PRINTF("               :)");
    И
    Глобальные макросы, т.е. пользовательские функции
    В частности ввод с клавиатуры и вывод на экран(т.е. функции консоли)
    Код:
    #include <stdarg.h>
    //--------------To Console ----------------
    void INITIAL(void);
    void CLRSCR(void);
    void GOTOXY(int xpos, int ypos);
    int GETCH(void);
    int GETCHE(void);
    int PUTCHAR(int cb);
    int PRINTF(char *format, ...);
    //--------  To GAME ----------------------
    #define SPACE ' '
    int get_computer_move(void);
    void get_player_move(void);
    void disp_matrix(void);
    char check (void);
    char matrix[3][3];
    
    void get_player_move(void)
    {
    	int x, y;
    	char ch[2];
    	ch[1] = 0;
    	PRINTF("Enter coordinates for your X.\n");
    	PRINTF("Row? ");
    //	scanf ("%d", &x);
    	ch[0] = GETCHE();
    	x = atoi(ch);
    	PRINTF("\nColumn? ");
    //	scanf("%d", &y);
    	ch[0] = GETCHE();
    	y = atoi(ch);
    	PRINTF("\n");
    	x--; y--;
    	if (x<0 || y<0 || x>2 || y>2 || matrix[x] [y] !=SPACE) {
    		PRINTF("Invalid move, try again.\n");
    		get_player_move();
    	}
    	else matrix[x][y]='X';
    	return;
    }
    
    
    int get_computer_move(void)
    {
    	register int t;
    	char *p;
    	CLRSCR();
    	PRINTF("It is SP3xx responding move\n");
    	p = (char *) matrix;
    	for (t=0; *p!=SPACE && t<9; ++t) p++;
    	if(t==9)
    	{
    		return t; 
    	}
    	else *p = 'O';
    	return 0;
    }
    
    void disp_matrix(void)
    {
    	int t;
    	PRINTF(" 1   2   3\n");
    	for(t=0; t<3; t++) {
    		PRINTF("%d %c | %c | %c", t+1,matrix[t][0], matrix[t][1], matrix[t][2]);
    		if(t!=2) PRINTF("\n ---|---|---\n");
    	}
    	PRINTF("\n");
    	return;
    }
    
    char check(void)
    {
    	int t;
    	char *p;
    	for(t=0; t<3; t++) { 
    		p = &matrix[t] [0];
    		if (*p==* (p+1) && * (p+1)==*(p+2)) return *p;
    	}
    	for(t=0; t<3; t++) { 
    		p = &matrix[0][t];
    		if(*p==*(p+3) && *(p+3)==*(p+6)) return *p;
    	}
    	if(matrix[0] [0]==matrix [1] [1] && matrix[1] [1]==matrix [2] [2] )
    		return matrix[0][0];
    	if(matrix[0][2]==matrix[1][1] && matrix[1][1]==matrix[2] [0])
    		return matrix[0][2];
    	return SPACE;
    }
    //-------------------------------------------------------------------------------
    //--------------To Console ----------------
    
    #define Input       PSW[136]              
    #define dwInput     *(DWORD*)(PSW + 136)
    #define BuffScr      PSW[ScrAddr]   
    
    //----------------------
    #define KbdStatus   PSW[135] 
    #define ReversBit(reg, bitno) ((reg) ^= (1 << (bitno)))
    #define GetKbdStatus(bitno)   ((KbdStatus) & (1 << (bitno)))
    #define ResetKbdStatus(bitno) ((KbdStatus) &= ( ~ (1 << ((bitno)))))
    #define SetKbdStatus(bitno)   ((KbdStatus) |= ( 1 << ((bitno))))
    //---------------------------- 
    #define Shift           0       
    #define Ctrl            1       
    #define Repead          2       
    #define Caps            3       
    #define ru              4       
    #define en              5       
    #define ClrScreen       6
    #define ReversPSB(PSB_No)     PSB[(PSB_No) / 8] ^= (1 << ((PSB_No) % 8))
      
    const int lTotal = 18;          
    const int cTotal = 80;          
    const int tabs = 8;
    const int SIZE_Scr = lTotal * cTotal;
    static int cCount, lCount;
    static char savMark;
    static BOOL init;
    static BYTE *pBuffScr;
    static int ScrAddr;
    //------------------------------------
    void initial(void)
    {
        init = TRUE;
        KbdStatus = 32;
        dwInput = 0;    
        ScrAddr = PSW[10] - SIZE_Scr/2;
        PSW[138] = ScrAddr;
        CLRSCR();
        return;
    }
    //------------------------------------------------
    void CLRSCR(void)
    {
        memset(&BuffScr, ' ', cTotal * lTotal);  //
        lCount = cCount = 0;
        pBuffScr = (BYTE *)&BuffScr;
        savMark = ' ';    
        return;
    }
    //---------------------------------------------
    void GOTOXY(int xpos, int ypos)
    {
        lCount = Min(Max(ypos, 0), (lTotal - 1));
        cCount = Min(Max(xpos, 0), (cTotal - 1));
        *pBuffScr = savMark = ' ';
        pBuffScr = (BYTE *)&BuffScr + lCount * cTotal + cCount;
        savMark = *pBuffScr;
        return;
    }
    //------------------------------------- 
    int GETCH(void)
    {
    	register int ch;
        do {
           Delay(5);
           ch = dwInput;
           if (GetPSBStatus(4)) *pBuffScr = '_';           //   
           else                 *pBuffScr = savMark;       //
        } while(ch == NULL);
        if (GetKbdStatus(Ctrl) && isalpha(ch) && (ch <= 0xFF)) ch = ch & 0x1F;
        else {
    		if (GetKbdStatus(Caps) && (ch <= 0xFF)) {
    			if ((ch >= 0xE0) || isalpha(ch)) ReversBit(ch, 5);
    			else if (ch == 0xB8) ReversBit(ch, 4);
    		}
    		if (GetKbdStatus(Shift) && (ch <= 0xFF)) {
                if (isupper(ch)) ch = tolower(ch);
    			else if (islower(ch)) ch = toupper(ch);
                else if ((ch == 0xB8) || (ch == 0xA8))  ReversBit(ch, 4);
                else if (ch >= 0xC0) ReversBit(ch, 5);
    			else if (ch == '1') ch = '!';
                else if ((ch == '2') && GetKbdStatus(ru)) ch = '\"';
                else if (ch == '2') ch = '@';
                else if ((ch == '3') && GetKbdStatus(ru)) ch = 0xB9;
                else if (ch == '3') ch = '#';
                else if ((ch == '4') && GetKbdStatus(ru)) ch = ';';
                else if (ch == '4') ch = '$';
                else if (ch == '5') ch = '%';
                else if ((ch == '6') && GetKbdStatus(ru)) ch = ':';
                else if (ch == '6') ch = '^';
                else if ((ch == '7') && GetKbdStatus(ru)) ch = '?';
                else if (ch == '7') ch = '&';
                else if (ch == '8') ch = '*';
                else if (ch == '9') ch = '(';
                else if (ch == '0') ch = ')';
                else if (ch == '-') ch = '_';
                else if (ch == '=') ch = '+';
                else if (ch == '\'') ch = '\"';
    			else if (ch == '[') ch = '{';
                else if (ch == ']') ch = '}';
                else if (ch == '\\') ch = '|';
                else if (ch == ';') ch = ':';
                else if ((ch == '/') && GetKbdStatus(en)) ch = '?';
                else if ((ch == ';') && GetKbdStatus(en)) ch = ':';
                else if (ch == ',') ch = '<';
                else if ((ch == '.') && GetKbdStatus(ru)) ch = ',';
                else if (ch == '.') ch = '>';
                else if (ch == '`') ch = '~';
            }
        }
        if (! GetKbdStatus(Repead)) {   
    		dwInput = 0;                
            ResetKbdStatus(Ctrl);       
            ResetKbdStatus(Shift);      
         }
         else Delay(100);
         *pBuffScr = savMark;
    	return ch;
    }
    
    //-------------------------------------------
    int GETCHE(void)
    {
        int ch;
        ch = GETCH();
        PUTCHAR(ch);
        return ch;
    }
    
    //-------------------------------------------
    int PUTCHAR(int cb)
    {
        union pw {
    		int i;
    		char ch[4];
    	};
        register int count, tmp, i;
        union pw blck;
        
        blck.i = cb;
        count = strlen(blck.ch);
    if ((count == 3) && (blck.ch[0] == 0x1B)) {    //Escape
            *pBuffScr = savMark;          
            tmp = MAKEWORD(blck.ch[2], blck.ch[1]);
            switch (tmp) {
                case 0x5B41:    //Up
                    if (lCount != 0) {
                        lCount--;
                        pBuffScr = pBuffScr - cTotal;
                    }
                    break;
                case 0x5B42:    //Down
                    if (lCount != lTotal -1) {
                        lCount++;
                        pBuffScr = pBuffScr + cTotal;
                    }
                    break;
                case 0x5B44:    //Left
                    if (cCount != 0) {
                        cCount--;
                        pBuffScr --;
                    }
                    break;
                case 0x5B43:    //Right
                    if (cCount != cTotal - 1) {
                        cCount++;
                        pBuffScr++;
                    }
                    break;
                case 0x5B48:    //Home
                    lCount = 0;
                    cCount = 0;
                    pBuffScr = (BYTE *)&BuffScr;
                    break;
                case 0x5B4B:    //End
                    *pBuffScr = ' ';
                    memset(pBuffScr, ' ', cTotal - cCount);
                    break;
            }
            savMark = *pBuffScr;
    }
    else  {    
        for (i=0; i<count; i++) {
            *pBuffScr = savMark;        
            switch (blck.ch[i]) {
                case 0x07:          //Bell - (ctrl+G) 
                    Beep();
                    break;
                case 0x8:          //backspace - (ctrl+H /Delete)
                    if (cCount != 0) {
                        cCount--;
                        pBuffScr--;
                    }
                    break;
                case 0x9:          //Tab - (ctrl+I)
                    if (cCount < (cTotal - tabs)) {
                        tmp = tabs - cCount % tabs;
                        cCount = cCount + tmp;
                        pBuffScr = pBuffScr + tmp;
                    }
                    else {
                        tmp = cTotal -1 - cCount;
                        cCount = cTotal-1;
                        pBuffScr = pBuffScr + tmp;
                    }
                    break;
                case 0xA:        //LF - line feed (ctrl+J)
    				lCount++;
                    pBuffScr = pBuffScr + cTotal - cCount;
                    cCount = 0;
                    break;
                case 0xD:        //CR - carriage return (ctrl+M /Enter)
                    pBuffScr = pBuffScr - cCount;                
                    cCount = 0;
                    break;
                case 0x03:        //ETX - end of text (ctrl+C) 
                case 0x04:        //EOT - end of transmission (ctrl+D)
                case 0x1A:        //ctrl+Z (SUB -substitute)
                default:
                    *pBuffScr = blck.ch[i];
                    pBuffScr++;
                    cCount++;
                    break;
            }
            savMark = *pBuffScr;
        }
    }
    
    if (cCount >= cTotal) {
        cCount =0;
        lCount++;
    }
    if (lCount >= lTotal) {
        memmove(&BuffScr, &BuffScr + cTotal/2, ((lTotal-1) * cTotal));
        lCount=lTotal-1;
        memset(&BuffScr+(lTotal-1) * cTotal/2, ' ', cTotal);
        savMark = ' ';
        pBuffScr = (BYTE *)&BuffScr + lCount * cTotal + cCount;
    }
        return cb;
    }
    
    //--------------------------------
    int PRINTF(char *format, ...)
    {
        char buf[1440];
        char *p;
        int len;
        va_list ptr;
        va_start(ptr, format);
        len = vsnprintf (buf, sizeof(buf) - 1, format, ptr);
        va_end(ptr);
        buf[len] = '\0';
        p = buf;
        for (; *p; p++) PUTCHAR(*p);
        return len;
    }
    Последний раз редактировалось petera; 28.05.2021 в 15:07.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #4

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Старый добрый ТЕТРИС для СП310
    Может кто-то помнит такой тетрис на ПВМ, когда мониторы были только текстовыми
    ВИДЕО:

    Захват-1.png
    Игра написана на Си, секция "main" оформлена одноименным макросом
    Захват-3.png

    Остальные функции находятся в Глобальном макросе
    Захват-4.png

    Старт игры происходит при вызове макроса "main" ф.кнопкой
    Захват-6.png

    Первая ф.область - отключает звук нажатия кнопок
    Вторая - задает начальный адрес "экранного буфера" и включает латинскую раскладку клавиатуры.

    Во вложении, в архивах, проекты для СП307 и СП310 для старой версии конфигуратора и для новой
    Захват-7.png

    Если этот пост не удалят, то могу более подробно описать работу проекта.
    Это просто огонь! счастью и смеху не было предела, когда увидел данное произведение

Похожие темы

  1. Работа CTN внутри макросов
    от melky в разделе Среда программирования OWEN Logic
    Ответов: 32
    Последнее сообщение: 14.08.2020, 21:22
  2. Локальная база макросов.
    от SF_Axel в разделе Среда программирования OWEN Logic
    Ответов: 40
    Последнее сообщение: 05.03.2017, 21:54
  3. Ответов: 0
    Последнее сообщение: 23.01.2017, 15:24
  4. Отображение имён входов у макросов
    от Владимир Ситников в разделе Среда программирования OWEN Logic
    Ответов: 15
    Последнее сообщение: 06.04.2016, 18:40
  5. Пример использования ПЛК100
    от Dmitrij в разделе ПЛК1хх
    Ответов: 0
    Последнее сообщение: 14.01.2009, 14:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •