www.pudn.com > tinywidget.rar > minesweeper.c


#include"../include/tnWidgets.h"
#include
#include

struct mine {
	TN_WIDGET *button;
	TN_WIDGET *label;
	TN_WIDGET *picture;
	int x,y;
	int ismine;
	int ismarked;
	int labelvalue;
}minefield[10][10];

struct index{
	int i;
	int j;
};

int row[] = { -1,-1,0,1,1,1,0,-1};
int col[] = { 0,1,1,1,0,-1,-1,-1};
	

TN_WIDGET *main_app,*window;
GR_COLOR colors[] = { GR_RGB(0,0,0),
		      GR_RGB(0,0,255),
		      GR_RGB(0,128,0),
		      GR_RGB(255,0,0),
		      GR_RGB(0,255,255),
		      GR_RGB(255,0,255),
		      GR_RGB(255,255,0),
		      GR_RGB(128,128,0),
		      GR_RGB(128,0,128)
		   };
			      
TN_WIDGET *minepic;
void openall(void)
{
	int i,j;
	for(i=0;i<10;i++)
		for(j=0;j<10;j++)
		{
			if(minefield[i][j].button == NULL)
				continue;
			if(minefield[i][j].ismine && !minefield[i][j].ismarked)
			{
				tnDestroyWidget(minefield[i][j].button);
				minefield[i][j].button = NULL;
				minefield[i][j].picture = tnCreateWidget(TN_PICTURE,window,minefield[i][j].x,minefield[i][j].y,TN_HEIGHT,20,TN_WIDTH,20,TN_STRETCH,GR_FALSE,TN_END);
				if( (tnPictureDup(minefield[i][j].picture,minepic))== -1)
					exit(1);
				
			}
			if(!minefield[i][j].ismine && minefield[i][j].ismarked)
			{
				tnDestroyWidget(minefield[i][j].button);
				minefield[i][j].button = NULL;
				minefield[i][j].picture = tnCreateWidget(TN_PICTURE,window,minefield[i][j].x,minefield[i][j].y,TN_FILENAME,"/home/amit/TinyWidgets/demos/minehitfalse.bmp",TN_HEIGHT,20,TN_WIDTH,20,TN_STRETCH,GR_FALSE,TN_END);
			}
			if(minefield[i][j].button)
				tnSetEnabled(minefield[i][j].button,GR_FALSE);
		}
	return;
}

void openzero(int i,int j)
{
	int k;
	int i1,j1;
	char s[2];
	tnDestroyWidget(minefield[i][j].button);
	minefield[i][j].button = NULL;
	for(k=0; k < 8; k++)
	{
		i1 = i + row[k];
		j1 = j + col[k];
		if(i1 >= 0 && i1 < 10 && j1 >= 0 && j1 < 10)
		{
			
			if(minefield[i1][j1].button == NULL)
				continue;
			if(minefield[i1][j1].labelvalue == 0)
				openzero(i1,j1);
			else
			{
				tnDestroyWidget(minefield[i1][j1].button);
				minefield[i1][j1].button = NULL;
				s[0] = minefield[i1][j1].labelvalue + '0';
				s[1] = '\0';
				minefield[i1][j1].label = tnCreateWidget(TN_LABEL,window,minefield[i1][j1].x,minefield[i1][j1].y,TN_CAPTION,s,TN_FONTNAME,"impact",TN_HEIGHT,20,TN_WIDTH,20,TN_FGCOLOR,colors[minefield[i1][j1].labelvalue],TN_END);
			}
		}
	}
	return;
}
					
					
					
	
	
					
	

void minefunc(TN_WIDGET *button,DATA_POINTER dptr)
{
	int cb = tnGetButtonPressed(button);
	struct index *p = (struct index *)dptr;
	char s[2];
	int i = p->i;
	int j = p->j;
	if(!(minefield[i][j].ismarked) && cb & GR_BUTTON_L)
	{
		if(minefield[i][j].ismine)
			openall();
		else
		{
			tnDestroyWidget(button);
			minefield[i][j].button = NULL;
			if(minefield[i][j].labelvalue == 0)
				openzero(i,j);
			else
			{
				s[0] = minefield[i][j].labelvalue + '0';
				s[1] = '\0';
				minefield[i][j].label = tnCreateWidget(TN_LABEL,window,minefield[i][j].x,minefield[i][j].y,TN_CAPTION,s,TN_FONTNAME,"impact",TN_HEIGHT,20,TN_WIDTH,20,TN_FGCOLOR,colors[minefield[i][j].labelvalue],TN_END);
			}
		}
	}
	if(cb & GR_BUTTON_R)
	{
		if(!(minefield[i][j].ismarked))
		{
			tnSetButtonPixmap(button,"/home/amit/TinyWidgets/demos/mineflag.bmp");
			minefield[i][j].ismarked = GR_TRUE;
		}
		else
		{
			tnRemoveButtonPixmap(button);
			minefield[i][j].ismarked = GR_FALSE;
		}
		
	}
	return;
}

int main(int argc, char *argv[])
{
	int i,j,k,l;
	long int r;
	struct index *p;
		srandom(time(NULL));
	for(i=0;i<10;i++)
		for(j=0;j<10;j++)
		{
			minefield[i][j].ismine = GR_FALSE;
			minefield[i][j].labelvalue = 0;
		}
	
	for(k=0;k<20;k++)
	{
		r = random();
		r = r%100;
		i = r /10;
		j = r % 10;					
		if(minefield[i][j].ismine)
		{
			k--;
			continue;
		}
		minefield[i][j].ismine = GR_TRUE;
		for(l=0;l<8;l++)
			if((i + row[l]) >= 0 && (i + row[l]) < 10 && (j+col[l]) >=0 && (j+col[l]) < 10)
				minefield[i+row[l]][j+col[l]].labelvalue += 1;
	}
				
			
				
		
		
	main_app = tnAppInitialize(argc,argv);
	window = tnCreateWidget(TN_WINDOW,main_app,50,50,TN_WIDTH,200,TN_HEIGHT,250,TN_CAPTION,"MineSweeper",TN_APPWIN,GR_TRUE,TN_END);
	minepic = tnCreateWidget(TN_PICTURE,window,50,50,TN_WIDTH,20,TN_HEIGHT,20,TN_FILENAME,"/home/amit/TinyWidgets/demos/minebomb.bmp",TN_VISIBLE,GR_FALSE,TN_END);
	for(i=0;i<10;i++)
		for(j=0;j<10;j++)
		{
			minefield[i][j].button = tnCreateWidget(TN_BUTTON,window,j*20,i*20+50,TN_WIDTH,20,TN_HEIGHT,20,TN_END);
			minefield[i][j].x = j*20;
			minefield[i][j].y = i*20+50;
			p = (struct index *)malloc(sizeof(struct index));
			p->i = i;
			p->j = j;
				
			tnRegisterCallBack(minefield[i][j].button,CLICKED,minefunc,p);
		}
	tnMainLoop();
	return 0;
}