俄罗斯方块
一共三个文件实现得很恶心,很多代码没效率
SCR.c
#include "SCR.h"typedef enum mode_t {CHARACTER = 3,BACKGROUND = 4} mode_t;static struct termios orig;static unsigned int term_init = 0;void clear(void){fprintf(stderr, "\033 = 1;ret = tcsetattr(STDIN_FILENO, TCSANOW, &ttystat);if (ret != 0) { perror("tcsetattr"); return -1;}printf("\033[?25l\033[?1c");return 0;}int rtty(void){int ret;if (term_init == 0) { return 0;}ret = tcsetattr(STDIN_FILENO, TCSANOW, &orig);if (ret != 0) { perror("tcsetattr"); return -1;}printf("\033[?25h\033[?0c");return 0;}int get_input(int expected){char seq = {0};int ret;while (1) { ret = read(STDIN_FILENO, seq, 8); if (ret < 0 && errno != EINTR) { perror("read"); return -1; } if ((expected & UP) && ret == 3 && seq == '\033' && seq == '[' && seq == 'A') { return UP; } if ((expected & DOWN) && ret == 3 && seq == '\033' && seq == '[' && seq == 'B') { return DOWN; } if ((expected & RIGHT) && ret == 3 && seq == '\033' && seq == '[' && seq == 'C') { return RIGHT; } if ((expected & LEFT) && ret == 3 && seq == '\033' && seq == '[' && seq == 'D') { return LEFT; } if ((expected & ESC) && ret == 1 && seq == '\033') { return ESC; } if ((expected & ENTER) && ret == 1 && seq == '\n') { return ENTER; } if ((expected & KEY_Q) && ret == 1 && (seq == 'q' || seq == 'Q')) { return KEY_Q; } if ((expected & KEY_S) && ret == 1 && (seq == 's' || seq == 'S')) { return KEY_S; } if ((expected & KEY_H) && ret == 1 && (seq == 'h' || seq == 'H')) { return KEY_H; } if ((expected & KEY_J) && ret == 1 && (seq == 'j' || seq == 'J')) { return KEY_J; } if ((expected & KEY_K) && ret == 1 && (seq == 'k' || seq == 'K')) { return KEY_K; } if ((expected & KEY_L) && ret == 1 && (seq == 'l' || seq == 'L')) { return KEY_L; }}return 0;}void move_curs(int x, int y){printf("\033[%d;%dH", y, x);}void draw_rec(rec_t *rec){int i, j;printf("\033[%d%d;%d%dm", BACKGROUND, rec->background, CHARACTER, rec->foreground);for (i = 0; i < rec->h; ++i) { printf("\033[%d;%dH", rec->y + i, rec->x); for (j = 0; j < rec->w; ++j) { printf("%c", rec->ch); }}printf("\033[0m");fflush(NULL);return;}
SCR.h
#ifndef _SCR_H_#define _SCR_H_#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/time.h>#include <signal.h>#include <sys/ioctl.h>#include <termios.h>#include <errno.h>#include <math.h>typedef enum ch_t {UP = 0x00000001,DOWN = 0x00000002,RIGHT = 0x00000004,LEFT = 0x00000008,ESC = 0x00000010,ENTER = 0x00000020,KEY_Q = 0x00000040,KEY_S = 0x00000080,KEY_H = 0x00000100,KEY_J = 0x00000200,KEY_K = 0x00000400,KEY_L = 0x00000800} ch_t;typedef enum color_t {COLOR_MIN = 0,BLACK = 0,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE,COLOR_MAX = WHITE} color_t;typedef struct rec_t {int x;int y;int w;int h;char ch;color_t background;color_t foreground;} rec_t;void clear(void);int stty(void);int rtty(void);int start_iaction(int sec, int usec, void (*)(int));int stop_iaction(void);int get_winsz(int *row, int *col);int get_input(int expected);void move_curs(int x, int y);void draw_rec(rec_t *);#endif
TETRIS.c
#include "SCR.h"enum {SEC = 0,USEC = 500000};int A={{0,0,0,0}, {0,1,1,0}, {0,1,1,0}, {0,0,0,0}};int B={{0,0,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,1,0}};int C={{0,1,0,0}, {0,1,1,0}, {0,1,0,0}, {0,0,0,0}};int D={{0,0,0,0}, {0,1,1,0}, {0,0,1,1}, {0,0,0,0}};int E={{0,0,0,0}, {0,0,1,1}, {0,1,1,0}, {0,0,0,0}};int F={{0,0,0,0}, {0,1,1,0}, {0,0,1,0}, {0,0,1,0}};int G={{0,0,0,0}, {0,1,1,0}, {0,1,0,0}, {0,1,0,0}};int w_col;int w_row;#define up 2#define down 23#define right22#define left 4int N,top=0;int tmp_k;int x,y;int matrix;int __rec_tmp;int color;rec_t bg;rec_t __rec;void ___draw_frame(int x,int y){rec_t __frame;__frame.x=x;__frame.y=y+1;__frame.w = 2;__frame.h = 20;__frame.ch = ' ';__frame.background = RED;__frame.foreground = RED;draw_rec(&__frame);__frame.x=x;__frame.y=y;__frame.w = 24;__frame.h = 1;__frame.ch = ' ';__frame.background = RED;__frame.foreground = RED;draw_rec(&__frame);__frame.x=x+22;__frame.y=y+1;__frame.w = 2;__frame.h = 20;__frame.ch = ' ';__frame.background = RED;__frame.foreground = RED;draw_rec(&__frame);__frame.x=x;__frame.y=y+21;__frame.w = 24;__frame.h = 1;__frame.ch = ' ';__frame.background = RED;__frame.foreground = RED;draw_rec(&__frame);}void ___draw_bg(){ int i=0;int j=0;rec_t tmp;for(i=0;i<20;i++){ for(j=0;j<10;j++){ tmp.x=(j+2)*2; tmp.y=i+3; tmp.w = 2; tmp.h = 1; tmp.ch = ' '; tmp.background = color; tmp.foreground = color; draw_rec(&tmp); }}___draw_frame(2,2);}void ___draw_square(int square){ int i,j,k=0;tmp_k=4;k=0;for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(square==1){ __rec.x=(i+4)*2; __rec.y=(j+2)*1; __rec.w = 2; __rec.h = 1; __rec.ch = ' '; __rec.background = N; __rec.foreground = N; k++; } }}x=4;y=2;for(i=0;i<4;i++) for(j=0;j<4;j++) __rec_tmp=square;for(i=0;i<4;i++){ if(matrix[(__rec.x-4)/2].y-3]==1){ top=1; }}}int MAX_Y(rec_t __rec[],int count){int max=0,i;for(i=0;i<count;i++){ if(__rec.y >= max) max=__rec.y;}return max;}int MAX_X(rec_t __rec[],int count){int max=0,i;for(i=0;i<count;i++){ if(__rec.x >= max) max=__rec.x;}return max;}int MIN_X(rec_t __rec[],int count){int min=__rec.x;int i;for(i=0;i<count;i++){ if(__rec.x <= min) min=__rec.x;}return min;}int MIN_Y(rec_t __rec[],int count){int min=__rec.y;int i;for(i=0;i<count;i++){ if(__rec.y <= min) min=__rec.y;}return min;}int GameOver(){int i,j,tmp1=0,tmp2=0;for(i=0;i<20;i++){ for(j=0;j<10;j++){ tmp1 += matrix; } if(tmp1>0){ tmp2++; } if(tmp2==20 || top==1){ fprintf(stderr,"\n\tGame Over\n"); stop_iaction(); rtty(); exit(1); } tmp1=0;}return 0;}void Delete(){int i,j,m,n,tmp;for(i=0;i<20;i++){ for(j=0;j<10;j++){ tmp += matrix; } if(tmp==10){ for(n=i;n>0;n--){ for(m=0;m<10;m++){ matrix=matrix; color=color; } } } tmp=0;}}void Change(int arr[]){int i=4,j=4;int acc;for(i=0;i<4;i++)for(j=0;j<4;j++)acc=arr;for(i=0;i<4;i++)for(j=0;j<4;j++) arr=acc;}int Limit_D(rec_t __rec[],int tmp_k){int i,j,status=0;int max;int flag=0;for(i=0;i<tmp_k;i++){ flag=0; for(j=0;j<tmp_k;j++){ if(__rec.x==__rec.x){ max=(__rec.y >= __rec.y ? __rec.y : __rec.y); flag=1; } } if(flag==1){ if(matrix[(__rec.x-4)/2]==1) status=1; } if(flag==0){ if(matrix[(__rec.x-4)/2].y-2]==1) status=1; } }return status;}int Limit_R(rec_t __rec[],int tmp_k){int i,j,status=0;int max=0;int flag=0;for(i=0;i<tmp_k;i++){ flag=0; max=0; for(j=0;j<tmp_k;j++){ if(__rec.y==__rec.y){ max=(__rec.x > __rec.x ? __rec.x : __rec.x); flag=1; } } if(flag==1){ if(matrix[(max-4)/2+1].y-3]==1) status=1; } if(flag==0){ if(matrix[(__rec.x-4)/2+1].y-3]==1) status=1; } }return status;}int Limit_L(rec_t __rec[],int tmp_k){int i,j,status=0;int min;int flag=0;for(i=0;i<tmp_k;i++){ min=MAX_X(__rec,tmp_k); flag=0; for(j=0;j<tmp_k;j++){ if(__rec.y==__rec.y && min >= __rec.x){ min=__rec.x; flag=1; } } if(flag==1){ if(matrix[(min-4)/2-1].y-3]==1) return 1; } if(flag==0){ if(matrix[(__rec.x-4)/2-1].y-3]==1) return 1; } }return status;}void Transform(){int i,j,k;rec_t tmp;int tmp_m;for(i=0;i<4;i++) for(j=0;j<4;j++) tmp_m=__rec_tmp;for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=0;for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=WHITE;Change(tmp_m);k=0;for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(tmp_m==1){ tmp.x=(i+x)*2; tmp.y=(j+y)*1; tmp.w = 2; tmp.h = 1; tmp.ch = ' '; tmp.background = N; tmp.foreground = N; k++; } }}if(Limit_D(tmp,4)==0 && Limit_R(tmp,4)==0 && \ Limit_L(tmp,4)==0 && MIN_X(tmp,4)>left && \ MAX_X(tmp,4)<right && MAX_Y(tmp,4)<down && \ MIN_Y(tmp,4)>up){ for(i=0;i<4;i++) __rec=tmp; for(i=0;i<4;i++) for(j=0;j<4;j++) __rec_tmp=tmp_m;} for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=1;for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=N;}void CALL_GATE(int sig){int i=0;if((Limit_D(__rec,4)==0)&&(MAX_Y(__rec,tmp_k)<22)){ for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=0; for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=WHITE; for(i=0;i<tmp_k;i++) __rec.y++; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=1; for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=N; y++; ___draw_bg();}else if(GameOver()==0){ Delete(); N=random()%7; switch(N){ case 0: ___draw_square(A); break; case 1: ___draw_square(B); break; case 2: ___draw_square(C); break; case 3: ___draw_square(D); break; case 4: ___draw_square(E); break; case 5: ___draw_square(F); break; case 6: ___draw_square(G); break; default: break; } if(GameOver()==0&&top==0){ ___draw_bg(); }}}void Init(void){int i=0;int j=0;int ret;for(i=0;i<10;i++) for(j=0;j<20;j++) matrix=0;for(i=0;i<10;i++) for(j=0;j<20;j++) color=WHITE; ret = get_winsz(&w_row, &w_col);if(ret!=0){ fprintf(stderr,"ERROR\n"); exit(1);}clear();bg.x = 1;bg.y = 1;bg.w = w_col;bg.h = w_row;bg.ch = ' ';bg.background = WHITE;bg.foreground = WHITE;draw_rec(&bg);N=4;___draw_square(E);___draw_frame(2,2);for(i=0;i<tmp_k;i++) draw_rec(&__rec);return;}void Response(void){int out=0;int ret=0;int i=0;while (out != 1) { ret = get_input(UP | DOWN | LEFT | RIGHT | ESC); if (ret == -1) { printf("get input error!\n"); break; } switch (ret) { case LEFT: if (MIN_X(__rec,tmp_k) > left && Limit_L(__rec,4)==0) { for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=WHITE; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=0; for(i=0;i<tmp_k;i++) __rec.x -= 2; for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=N; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=1; x--; } break; case DOWN: if (MAX_Y(__rec,tmp_k) + __rec.h < down && Limit_D(__rec,4)==0){ for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=WHITE; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=0; for(i=0;i<tmp_k;i++) __rec.y += 1; for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=N; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=1; y++; } break; case UP: Transform(); break; case RIGHT: if (MAX_X(__rec,tmp_k) + __rec.w <= right && Limit_R(__rec,4)==0){ for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=WHITE; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=0; for(i=0;i<tmp_k;i++) __rec.x += 2; for(i=0;i<tmp_k;i++) color[(__rec.x-4)/2].y-3]=N; for(i=0;i<tmp_k;i++) matrix[(__rec.x-4)/2].y-3]=1; x++; } break; case ESC: out = 1; break; default: break; } ___draw_bg();}return;}int main(void){Init();stty();start_iaction(SEC, USEC, CALL_GATE);Response();stop_iaction();rtty();move_curs(1, 1);clear();return 0;}
编译输入 gcc TETRIS.c SCR.c -o TETRIS
这程序是终端下运行的 写这程序时 还不会QT
页:
[1]