📄 tetris.c
字号:
for(x=0; x<10; x++) //sleep 0.1 second
usleep(10000);
screen_redraw(main, container, points, lines);
}
blk.x = 0;
blk.y = CONY/2+1;
blk.flag = nextblk.flag;
if(blk.flag == 17)
(blk.y)--;
touchwin(subwin);
block_clear(subwin, &nextblk);
nextblk.flag = block_rand();
block_draw(subwin, &nextblk);
wrefresh(subwin);
touchwin(container);
block_draw(container, &blk);
if(block_check(&blk) == 0) {
game_end(main, container, points, lines);
keypad(container, FALSE);
touchwin(container);
wclear(container);
wrefresh(container);
delwin(container); // delete container
touchwin(subwin);
wclear(subwin);
wrefresh(subwin);
delwin(subwin); //delete sub window
touchwin(main);
wclear(main);
wrefresh(main);
delwin(main); //delete main window
return;
}
break;
/* pause */
case 'p':
noecho();
case 'P':
noecho(); // not show
pf = (!pf);
break;
/* refresh the screen */
case 'c':
noecho();
case 'C':
noecho();
if(pf == 1)
break;
screen_redraw(main, container, points, lines);
touchwin(container);
block_draw(container, &blk);
wrefresh(container);
touchwin(subwin);
box(subwin, 0, 0);
block_draw(subwin, &nextblk);
wrefresh(subwin);
touchwin(container);
break;
/* ESC for quit to menu */
case 27:
keypad(container, FALSE);
touchwin(container);
wclear(container);
wrefresh(container);
delwin(container); // delete container
touchwin(subwin);
wclear(subwin);
wrefresh(subwin);
delwin(subwin); //delete sub window
touchwin(main);
wclear(main);
wrefresh(main);
delwin(main); //delete main window
return;
break;
default :
noecho(); // not show
if(pf == 1)
break;
break;
}
}
/* fllow codes should not be accessed */
keypad(container, FALSE);
touchwin(container);
wclear(container);
wrefresh(container);
delwin(container);
touchwin(subwin);
wclear(subwin);
wrefresh(subwin);
delwin(subwin);
touchwin(main);
wclear(main);
wrefresh(main);
delwin(main);
}
void
history() {
// FILE *fp = NULL;
// if(access("user.dat",00)) {
// creat("user.dat",0644); /* 如无文件则建立新的文件 */
// fp=fopen("user.dat","r+"); /* 写入一个空记录 */
// fprintf(fp,"Number\tName\tPoints\tLines\n\n");
// fprintf(fp,"1\tbeginer\t30\t20\n");
// fclose(fp);
// }
}
void
options() {
int i = 0;
char menustr[MAXOM][30];
char tmp[MAXLEN];
WINDOW *win;
int xz = 0;
int ok = 1;
Options oldopt;
oldopt.players = opt.players;
oldopt.mode = opt.mode;
oldopt.speed = opt.speed;
oldopt.rotate = opt.rotate;
oldopt.level = opt.level;
oldopt.scale = opt.scale;
char s[10];
switch(opt.mode) {
case 0: strcpy(s, "Normal ");break;
case 1: strcpy(s, "SpeedUp ");break;
case 2: strcpy(s, "Horrible");break;
default:
strcpy(s, "Error ");break;
};
sprintf(&menustr[0][0], "Player: %d", opt.players+1);
sprintf(&menustr[1][0], "Mode: %s", s);
sprintf(&menustr[2][0], "Speed: %d", opt.speed);
sprintf(&menustr[3][0], "Level: %d", opt.level);
sprintf(&menustr[4][0], "Scale: %d", opt.scale);
switch(opt.rotate) {
case 0: strcpy(s, "Retrorse");break;
case 1: strcpy(s, "Direct ");break;
default:
strcpy(s, "Error ");break;
};
sprintf(&menustr[5][0], "Rotate: %s", s);
switch(ok) {
case 1: strcpy(s, "OK ");break;
case 0: strcpy(s, "CANCLE");break;
default:
strcpy(s, "Error ");break;
};
sprintf(&menustr[6][0], "Select: %s", s);
initscr();
win=newwin(MEUX, MEUY, (SCRX-MEUX)/2, (SCRY-MEUY)/2);
box(win, 0, 0);
keypad(win, TRUE);
for(i=0; i<2*MAXOM; i+=2) { /* 显示菜单内容 */
strcpy(tmp, &menustr[i/2][0]);
mvwprintw(win,
i+2, (MEUY-12)/2,
tmp);
}
wstandout(win); /* 开始反相显示 */
strcpy(tmp, &menustr[xz][0]);
mvwprintw(win,
2*xz+2, (MEUY-12)/2,
tmp); /* 反相显示第一个菜单 */
wstandend(win); /* 结束反相显示 */
wrefresh(win);
while(1) {
switch(wgetch(win)) { /* 读用户输入 */
case KEY_LEFT:
if(xz == 6) {
ok = !ok;
wstandout(win); /* 反白显示当前菜单 */
if(ok == 1)
strcpy(tmp, "Select: OK ");
else
strcpy(tmp, "Select: CANCLE");
strcpy(&menustr[6][0], tmp);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
tmp);
wmove(win,
1, 1);
wstandend(win);
wrefresh(win);
break;
}
row_left(xz, win, &menustr[xz][0]);
break;
case KEY_UP:
wstandend(win); /* 正常显示上一菜单 */
strcpy(tmp, &menustr[xz][0]);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
tmp);
wmove(win,
1, 1);
wstandout(win);
wrefresh(win); /* 刷新当前窗口 */
if(xz == 0)
xz = MAXOM-1;
else
xz--; /* 判断是否为第一个菜单,决定光标走向 */
wstandout(win); /* 反白显示当前菜单 */
strcpy(tmp, &menustr[xz][0]);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
tmp);
wmove(win,
1, 1);
wstandend(win);
wrefresh(win);
break; /* 刷新当前窗口 */
case KEY_RIGHT:
if(xz == 6) {
ok = !ok;
wstandout(win); /* 反白显示当前菜单 */
if(ok == 1)
strcpy(tmp, "Select: OK ");
else
strcpy(tmp, "Select: CANCLE");
strcpy(&menustr[6][0], tmp);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
tmp);
wmove(win,
1, 1);
wstandend(win);
wrefresh(win);
break;
}
row_right(xz, win, &menustr[xz][0]);
break;
case KEY_DOWN:
wstandend(win);
strcpy(tmp, &menustr[xz][0]);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
&menustr[xz][0]);
wmove(win,
1, 1);
wrefresh(win);
wstandout(win);
if(xz == MAXOM-1)
xz = 0;
else
xz++;
wstandout(win);
strcpy(tmp, &menustr[xz][0]);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
&menustr[xz][0]);
wmove(win,
1, 1);
wstandend(win);
wrefresh(win);
break;
case 10:
switch(xz) {
case 6:
if(ok == 0) {
opt.players = oldopt.players;
opt.mode = oldopt.mode;
opt.speed = oldopt.speed;
opt.rotate = oldopt.rotate;
opt.level = oldopt.level;
opt.scale = oldopt.scale;
}
keypad(win, FALSE);
touchwin(win);
wclear(win);
wrefresh(win);
delwin(win);
return;
break;
default:
row_right(xz, win, &menustr[xz][0]);
break;
}
break;
case 27:
opt.players = oldopt.players;
opt.mode = oldopt.mode;
opt.speed = oldopt.speed;
opt.rotate = oldopt.rotate;
opt.level = oldopt.level;
opt.scale = oldopt.scale;
keypad(win, FALSE);
touchwin(win);
wclear(win);
wrefresh(win);
delwin(win);
return;
break;
default:
beep();
noecho();
break;
} //end switch(wgetch(win))
} //end while(1)
} //end options()
void
row_left(int xz, WINDOW *win, char *str) {
char tmp[MAXLEN];
char s[10];
switch(xz) {
case 0:
opt.players--;
if(opt.players < 0)
opt.players = 0;
sprintf(tmp, "Player: %d", opt.players+1);
break;
case 1:
opt.mode--;
if(opt.mode < 0)
opt.mode = 1;
switch(opt.mode) {
case 0: strcpy(s, "Normal ");break;
case 1: strcpy(s, "SpeedUp ");break;
case 2: strcpy(s, "Horrible");break;
default:
strcpy(s, "Error ");break;
};
sprintf(tmp, "Mode: %s", s);
break;
case 2:
opt.speed--;
if(opt.speed < 0)
opt.speed = 9;
sprintf(tmp, "Speed: %d ", opt.speed);
break;
case 3:
opt.level--;
if(opt.level < 0)
opt.level = 12;
sprintf(tmp, "Level: %d ", opt.level);
break;
case 4:
opt.scale--;
if(opt.scale < 1)
opt.scale = 1;
sprintf(tmp, "Scale: %d ", opt.scale);
break;
case 5:
opt.rotate--;
if(opt.rotate < 0)
opt.rotate = 1;
switch(opt.rotate) {
case 0: strcpy(s, "Retrorse");break;
case 1: strcpy(s, "Direct ");break;
default:
strcpy(s, "Error ");break;
};
sprintf(tmp, "Rotate: %s", s);
break;
default:
return;
break;
};
strcpy(str, tmp);
wstandout(win);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
tmp);
wmove(win,
1, 1);
wstandend(win);
wrefresh(win);
wstandend(win);
return;
}
void
row_right(int xz, WINDOW *win, char *str) {
char tmp[MAXLEN];
char s[10];
switch(xz) {
case 0:
opt.players++;
if(opt.players > 0)
opt.players = 0;
sprintf(tmp, "Player: %d", opt.players+1);
break;
case 1:
opt.mode++;
if(opt.mode > 1)
opt.mode = 0;
switch(opt.mode) {
case 0: strcpy(s, "Normal ");break;
case 1: strcpy(s, "SpeedUp ");break;
case 2: strcpy(s, "Horrible");break;
default:
strcpy(s, "Error ");break;
};
sprintf(tmp, "Mode: %s", s);
break;
case 2:
opt.speed++;
if(opt.speed > 9)
opt.speed = 0;
sprintf(tmp, "Speed: %d ", opt.speed);
break;
case 3:
opt.level++;
if(opt.level > 12)
opt.level = 0;
sprintf(tmp, "Level: %d ", opt.level);
break;
case 4:
opt.scale++;
if(opt.scale > 1000)
opt.scale = 1000;
sprintf(tmp, "Scale: %d ", opt.scale);
break;
case 5:
opt.rotate++;
if(opt.rotate > 1)
opt.rotate = 0;
switch(opt.rotate) {
case 0: strcpy(s, "Retrorse");break;
case 1: strcpy(s, "Direct ");break;
default:
strcpy(s, "Error ");break;
};
sprintf(tmp, "Rotate: %s", s);
break;
default:
return;
break;
};
strcpy(str, tmp);
wstandout(win);
mvwaddstr(win,
2*xz+2, (MEUY-12)/2,
tmp);
wmove(win,
1, 1);
wstandend(win);
wrefresh(win);
wstandend(win);
return;
}
int
main(int argc, char **argv) {
menu();
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -