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

📄 five.c

📁 可以移植到带有FB的任何嵌入式平台下的小游戏
💻 C
字号:
#include "gaimfive.h"BeforeBox ReturnBox[400];BOOL WIN;                                  //确定玩者是否赢BOOL Recycle=TRUE;BOOL TempRecycle=TRUE;int Level=2;BOOL OpenGame;                             //响应变菜单处理int LastX,LastY;                           //用户最后一次下子对应ChessBox 参数int i,j,LeftMan;                           //棋盘未下子个数   int BackPictureCode=0;Setxy Bmpxy;int ActionNumber=0;int x1,y1,x2,y2;ChessMan Action;ChessMan ChessBox[20][20];DealDialog GameStyle;static unsigned char background_color[4]={255, 255, 255, 0};static unsigned char line_clolr[4]={0, 0, 0, 0};static unsigned char player_color[4]={80, 120, 80, 0};static unsigned char computer_color[4]={170, 130, 170, 250};const  char *save_filename="five_data.dat";Setxy Getxy(int x,int y){	int i,j;	Setxy xy;	for(i=1;i<=19;i++)    if (x>=i*20-10 && x<i*20+10)			xy.x=i*20;	for(j=1;j<=17;j++)    if (y>=j*20-10 && y<j*20+10)			xy.y=j*20;	return xy;}void InitGame()                      {	ActionNumber=0;	GameStyle=normal;	WIN=FALSE;	OpenGame=TRUE;	Action=WhiteMan;	LeftMan=323;	for(i=0;i<=19;i++)		for(j=0;j<=19;j++)			*(*(ChessBox+i)+j)=NoMan;	for(i=0;i<200;i++)	{		ReturnBox[i].player.x=0;		ReturnBox[i].player.y=0;		ReturnBox[i].com.x=0;		ReturnBox[i].com.y=0;	}}BOOL OppositeRecycle(BOOL style){	if (style==TRUE) 		return FALSE;	else 		return TRUE;}ChessMan Opposite(ChessMan man)             {	switch(man)	{		case WhiteMan: 			return BlackMan;		case BlackMan: 			return WhiteMan;		default: 			return NoMan;	}}BOOL CheckFive(int it,int jt)                   //判断五子是否连线 {	int m1=1,m2=1,n1=1,n2=1,a=1,b=1,total=1;	for(;;)	{		if (a==1 && it-m1>=1 && *(*(ChessBox+it-(m1++))+jt)==Action) 			total++;		else 			a=0;		if (b==1 && it+m2<=19 && *(*(ChessBox+it+(m2++))+jt)==Action) 			total++;		else 			b=0;		if (a==0 && b==0 || total>=5) 			break;	}	if (total>=5) 		return TRUE;		m1=1;n1=1;m2=1;n2=1;a=1;b=1;total=1;	for(;;)	{		if (a==1 && jt-n1>=1 && *(*(ChessBox+it)+jt-(n1++))==Action) 			total++;		else 			a=0;		if (b==1 && jt+n2<=19 && *(*(ChessBox+it)+jt+(n2++))==Action) 			total++;		else 			b=0;		if (a==0 && b==0 || total>=5) 			break;	}	if (total>=5) 		return TRUE;		m1=1;n1=1;m2=1;n2=1;a=1;b=1;total=1;	for(;;)	{		if (a==1 && it-m1>=1 && jt-n1>=1 && *(*(ChessBox+it-(m1++))+jt-(n1++))==Action) 			total++;		else 			a=0;		if (b==1 && it+m2<=19  && jt+n2<=17 && *(*(ChessBox+it+(m2++))+jt+(n2++))==Action) 			total++;		else 			b=0;		if (a==0 && b==0 || total>=5) 			break;	}	if (total>=5) 		return TRUE;		m1=1;n1=1;m2=1;n2=1;a=1;b=1;total=1;	for(;;)	{		if (a==1 && it+m1<=19 && jt-n1>=1 && *(*(ChessBox+it+(m1++))+jt-(n1++))==Action) 			total++;		else 			a=0;		if (b==1 && it-m2>=1 && jt+n2<=19 && *(*(ChessBox+it-(m2++))+jt+(n2++))==Action) 			total++;		else 			b=0;		if (a==0 && b==0 || total>=5) 			break;	}	if (total>=5) 		return TRUE;	return FALSE;}int GetManNum(ChessMan style,int it,int jt)        //得到该位置最大连线子个数{	int lasttotal=1;	int m1=1,m2=1,n1=1,n2=1,a=1,b=1;	int total=1;	for(;;)	{		if (a==1)		{			if(it-m1>=1 && *(*(ChessBox+it-(m1++))+jt)==style) 				total++;			else if(*(*(ChessBox+it-(m1++))+jt)==Opposite(style)) 			{				total-=1;				a=0;			}			else 				a=0;		}		if (b==1)		{			if (it+m2<=19 && *(*(ChessBox+it+(m2++))+jt)==style) 				total++;			else if( *(*(ChessBox+it+(m2++))+jt)==Opposite(style)) 			{				total-=1;				b=0;			}			else 				b=0;		}		if (a==0 && b==0) 			break;	}	if (total>=lasttotal) 		lasttotal=total;			m1=1,m2=1,n1=1,n2=1,a=1,b=1;	total=1;	for(;;)	{		if (a==1)		{			if(jt-n1>=1 && *(*(ChessBox+it)+jt-(n1++))==style) 				total++;			else if(*(*(ChessBox+it)+jt-(n1++))==Opposite(style)) 			{				total-=1;				a=0;			} 			else a=0;		}				if (b==1 && jt+n2<=17 && *(*(ChessBox+it)+jt+(n2++))==style) 			total++;		else if(*(*(ChessBox+it)+jt+(n2++))==Opposite(style)) 		{			b=0;			total-=1;		}		else 			b=0;		if (a==0 && b==0) 			break;	}	if (total>=lasttotal) 		lasttotal=total;			m1=1,m2=1,n1=1,n2=1,a=1,b=1;	total=1;	for(;;)	{		if (a==1)		{			if (it-m1>=1 && jt-n1>=1 && *(*(ChessBox+it-(m1++))+jt-(n1++))==style) 				total++;			else if (*(*(ChessBox+it-(m1++))+jt-(n1++))==Opposite(style)) 			{				total-=1;				a=0;			}			else 				a=0;		}		if (b==1)		{			if (it+m2<=19  && jt+n2<=17 && *(*(ChessBox+it+(m2++))+jt+(n2++))==style) 				total++;			else if(*(*(ChessBox+it+(m2++))+jt+(n2++))==Opposite(style)) 			{				total-=1;				b=0;			}			else 				b=0;		}		if (a==0 && b==0) 			break;	}	if (total>=lasttotal) 		lasttotal=total;			m1=1,m2=1,n1=1,n2=1,a=1,b=1;	total=1;	for(;;)	{		if (a==1)		{			if(it+m1<=19 && jt-n1>=1 && *(*(ChessBox+it+(m1++))+jt-(n1++))==style) 				total++;			else if (*(*(ChessBox+it+(m1++))+jt-(n1++))==Opposite(style)) 			{				total-=1;				a=0;			}			else 				a=0;		}		if (b==1)		{			if(it-m2>=1 && jt+n2<=17 && *(*(ChessBox+it-(m2++))+jt+(n2++))==style) 				total++;			else  if(*(*(ChessBox+it-(m2++))+jt+(n2++))==Opposite(style)) 			{				total-=1;				b=0;			}			else 				b=0;		}		if (a==0 && b==0) 			break;	}	if (total>=lasttotal) 		lasttotal=total;	return lasttotal;}Setxy GetMaxMan(ChessMan man)                {	int it,jt;	int temp,total=1;	Setxy xy;	for(it=1;it<=19;it++)	{		for(jt=1;jt<=19;jt++)		{			if (*(*(ChessBox+it)+jt)==NoMan)			{				temp=GetManNum(man,it,jt);				if (total<=temp)		    {					total=temp;		      xy.x=it;xy.y=jt;				}			}		}	}	return xy;}void Savedat()          {	FILE  *fp=NULL;	static char SaveDat[402]="";	int k = 0;;	fp = fopen(save_filename, "wb");	assert(fp);	for(j=0;j<20;j++)	{		for(i=0;i<20;i++)		{			if (ChessBox[i][j]==WhiteMan)				SaveDat[k++]='1';			else if (ChessBox[i][j]==BlackMan)				SaveDat[k++]='2';			else 				SaveDat[k++]='0';		}	}	if (Level==1) 		SaveDat[401]='1';	else if (Level==2) 		SaveDat[401]='2';	else 		SaveDat[401]='3';	fwrite((void *)SaveDat, 402, 1, fp);}BOOL Loaddat()           {	char LoadDat[402]="";	FILE	*fp = NULL;	int k=0, LeftMan=0;	fp = fopen(save_filename, "rb");	assert(fp);	fread((void *)LoadDat, 402, 1, fp);	for(k=0;k<400;k++)	{		i=k/20;		j=k%20;		if (LoadDat[k]=='1')			ChessBox[i][j]=WhiteMan;		else if (LoadDat[k]=='2')			ChessBox[i][j]=BlackMan;		else		{			ChessBox[i][j]=NoMan;			LeftMan++;		}	}	if (LoadDat[401]=='1') 		Level=1;	else if (LoadDat[401]=='2') 		Level=2;	else 		Level=3;	return TRUE;}void  user_play(int x, int y){	int i=x, j=y;	if (Action==WhiteMan && LeftMan>=1 && x>=0 && x<=19 && y>=0 && y<=19			&& OpenGame==TRUE && *(*(ChessBox+x)+y)==NoMan)	{		ActionNumber++;		LastX=x;		LastY=y;		*(*(ChessBox+x)+y)=WhiteMan;		LeftMan--;		fb_draw_chess(player_color, 200+10+x*17, 200+10+y*17);		ReturnBox[ActionNumber].player.x=x;		ReturnBox[ActionNumber].player.y=y;		if (CheckFive(x,y)==TRUE)		{			Action=NoMan;			WIN=TRUE;		}		else 			Action=BlackMan;		if (LeftMan==0 && WIN==FALSE)		{			//message title		}	}}void	computer_play(){	if (Action==BlackMan && OpenGame==TRUE && LeftMan>=1)	{		Setxy xy,Whitexy,Blackxy;		Blackxy=GetMaxMan(BlackMan);		Whitexy=GetMaxMan(WhiteMan);		switch(Level)		{			case LEVEL_EASE:				if (GetManNum(WhiteMan,Whitexy.x,Whitexy.y)>GetManNum(BlackMan,Blackxy.x,Blackxy.y)-2)					xy=Whitexy;				else					xy=Blackxy;				break;			case LEVEL_NORMAL:				if (GetManNum(WhiteMan,Whitexy.x,Whitexy.y)>GetManNum(BlackMan,Blackxy.x,Blackxy.y)-1)					xy=Whitexy;				else					xy=Blackxy;				break;			case LEVEL_HARD:				if (GetManNum(WhiteMan,Whitexy.x,Whitexy.y)>GetManNum(BlackMan,Blackxy.x,Blackxy.y))					xy=Whitexy;				else					xy=Blackxy;				break;		}		*(*(ChessBox+xy.x)+xy.y)=BlackMan;		LeftMan--;		LastX=xy.x;		LastY=xy.y;		fb_draw_chess(computer_color, 200+10+LastX*17, 200+10+LastY*17);		ReturnBox[ActionNumber].com.x=LastX;		ReturnBox[ActionNumber].com.y=LastY;		if (CheckFive(xy.x,xy.y)==TRUE)		{			Action=NoMan;			WIN=FALSE;		}		else			Action=WhiteMan;	}}void  redraw_gui(){	background_init();	for(i=1;i<=19;i++)	{		for(j=1;j<=19;j++)		{			if (*(*(ChessBox+i)+j)==WhiteMan)			{				fb_draw_chess(player_color, 200+10+i*17, 200+10+j*17);			}			if (*(*(ChessBox+i)+j)==BlackMan)			{  				fb_draw_chess(computer_color, 200+10+i*17, 200+10+j*17);			}		}	}}void	background_init(){	int i=0;	fb_draw_rect(background_color, 200, 200, 20*17+20, 20*17+20);	fb_draw_horizontal_line(line_clolr, 200+10, 200+10, 20*17, 2);	fb_draw_horizontal_line(line_clolr, 200+10, 200+10+(20*17), 20*17+1, 2);                                                                                                                             	fb_draw_vertical_line(line_clolr, 200+10, 200+10, 20*17, 2);	fb_draw_vertical_line(line_clolr, 200+10+(17*20), 200+10, 20*17, 2);	for (i=1; i<=19; i++)	{		fb_draw_horizontal_line(line_clolr, 200+10, 200+10+(17*i), 20*17, 1);		fb_draw_vertical_line(line_clolr, 200+10+(17*i), 200+10, 20*17, 1);	}}int main(){	char pchar=0;	int  k=0, m=0;	printf("\033[H\033[J");	fflush(stdout);	fb_mmap_buffer();	background_init();	InitGame();		user_play(10, 10);	computer_play();	user_play(13, 13);	computer_play();	user_play(2, 2);	computer_play();	user_play(7, 7);	computer_play();	user_play(7, 16);	computer_play();	user_play(4, 4);	computer_play();/*		while (1)	{		pchar = getchar();		switch (pchar)		{			case '8':				k = k - 1;				if (k<0)					k= 0;				break;			case '2':				k = k + 1;				if (k>19)					k = 19;				break;			case '4':				m = m + 1;				if (m>19)					m = 19;				break;			case '6':				m = m - 1;				if (m < 0)					m = 0;				break;			case '5':				user_play(m, k);				computer_play();				break;		}	}*/	return 1;}

⌨️ 快捷键说明

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