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

📄 main.c

📁 用linuX 下的C语言 运用CURSES编写的俄罗斯方块游戏
💻 C
字号:
#include"header.c"
int
main(void)
{   	
	quit=0;	v_temp=0;temp_y=0;flag=1;score=0;
	v_score=0;x=1;y=4;v_x=1;v_y=4;temp=0;
	initscr();
	noecho();
	cbreak();
	clear_win(g_win,v_win);//初始化数组

	start_color();

//////////////////////////////////////logon 
///登录画面
win = newwin(10,40,win_y+5,win_x+10);
		box(win,0,0);
	select_mode (win,&s_flag);
	delwin(win);
	refresh();

////////////////////////////////init_data初始化窗口以及其他数据
init_data();



//////////////////////////game start方块下落的最外层循环
while( quit ==0)//quit为判断是否要退出的旗子
	{



		type=type_a;//把临时类型赋值给石头类型,目的实现提示下一个石头
		view=view_a;
		mvwprintw(win,game_win_y+stone_y+2+2,game_win_width+2+4,"score :%d",score);

		wrefresh(win);
		wrefresh(game_win);
		wrefresh(hint_win);

///////////////////////////////////////////the v_win funtion
//用以完成主操作窗口于机器窗口之间的多进程运行
		if(s_flag==1||s_flag==2)
		{
		mvwprintw(win,game_win_y+stone_y+2+3,game_win_width+2+4,"2p score :%d",v_score);
		START://///////如果虚拟窗口已满,跳到这里

 			if(v_temp==0)
			{ 
				v_type=v_type_a;
				v_view=v_view_a;
			}
			if(s_flag==1)
			{
				temp_y=traversal_v_win(v_win,&v_type,&v_view );
			//调用traversal_v_win函数对虚拟窗口进行运算,并返回临时坐标y值

			flag=0;
			}
		}//endif



////////////////////////////////game part内层循环
////////////////////////////////make_game_win用以判断石头是否叠加
	while( (t=make_game_win(stone_s,g_win,&type,&view,&x,&y))==0 )
	{
		


		del_stone(g_win,&score);/////////消层

		if(s_flag==1||s_flag==2)
		{
		del_stone(v_win,&v_score);
		mvwprintw(win,game_win_y+stone_y+2+3,game_win_width+2+4,"2p score :%d",v_score);
		show_g_stone(v_win,virtual_win);
		show_stone(stone_s,&v_type,&v_view,virtual_win,&v_x,&v_y);
		wrefresh(virtual_win);
		}
		mvwprintw(win,game_win_y+stone_y+2+2,game_win_width+2+4,"score :%d",score);
		wrefresh(win);
		show_g_stone(g_win,game_win);
		show_stone(stone_s,&type,&view,game_win,&x,&y);
		wrefresh(game_win);
		

//////////sure_sign此段代码用来确定方块数组中,有1的最右坐标,并把值保存在全局变量
 sure_sign();



////////////////////////////////////hint_fun()实现游戏中提示下一个石头的图形
hint_fun();



///////////////////////////////////for循环为每单位对方块操作的操作次数
	for(temp_i=0;temp_i<5;temp_i++)
	{


/////////////////////////////////下面语句对机器窗口的操作实现方块的变形和左右移动
////////////////////////////////////the action of v_win
		if(s_flag==1)
		{
		del_stone(v_win,&v_score);
		mvwprintw(win,game_win_y+stone_y+2+3,game_win_width+2+4,"2p score :%d",v_score);
		if(v_y<temp_y)
			v_y++;
		if(v_y>temp_y)
			v_y--;
		show_g_stone(v_win,virtual_win);
		show_stone(stone_s,&v_type,&v_view,virtual_win,&v_x,&v_y);
		wrefresh(virtual_win);
		}//endif



//////////////////////////////////iostream函数对所有方块进行操作
if((i=iostream())==1)
	goto out;



	}//endfor	
	x++;/////////石头下落,坐标加一
	if(s_flag==1||s_flag==2)/////////////////此为机器窗口部分代码
	{
		v_x++;// control the drop
///////////////////////////////////////////////////control the v_win
			for(i=0;i<12;i++)
				if(v_win[0][i]!=0||v_win[1][i]!=0)//////判断是否游戏结束
				{
				win = newwin(10,20,win_y+5,win_x+10);
				box(win,0,0);
				refresh();
				mvwprintw(win,5,2,"YOU WIN");
				wrefresh(win);
 				sleep(1);goto exit;
				}	
	if((v_t=make_game_win(stone_s,v_win,&v_type,&v_view,&v_x,&v_y))!=0)
		{
		v_temp=0;//control to hint next stone
		v_x=1;v_y=4; flag=1;
			
		goto START;	/////如果已经落底,则跳到开始的位置	
		}
	}//endif
}//endwhile内层



//////////////////////////////////ONE stone action end
		x=1;y=4;//重置x,y
		temp=0;//control to hint next stone
			for(i=0;i<12;i++)
				if(g_win[0][i]!=0)//////判断是否游戏结束
				{
				win = newwin(10,20,win_y+5,win_x+10);
				box(win,0,0);
				refresh();
				mvwprintw(win,5,2,"YOU LOSE");
				wrefresh(win);
 				quit=1;sleep(1);
				}
} //endwhile




exit:
out:	delwin(win);
	delwin(hint_win);
	delwin(game_win);
	if(s_flag==1)
	{
	delwin(virtual_win);
	delwin(vhint_win);
	}
	endwin();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -