⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tetris.c

📁 该程序是在linux下运行的俄罗斯方块游戏的原代码
💻 C
📖 第 1 页 / 共 3 页
字号:
					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 + -