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

📄 renju.c

📁 嵌入式linux下面五子棋游戏代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		mode =(unsigned char) (connect_result>>4)&0xf;
		ret_value += mode_value[mode];
		switch((connect_result>>18)&3)
		{
		case 3: ret_value |= 0x8000; multi++; break;
		case 2: ret_value |= 0x4000; multi++; break;
		case 1: if( chess_object->level != 1 && chess_object->particular == 1 )
				{ //handle particular case:o+o+o+o
					ret_value |= 0x2000;             //
					chess_object->particular = 0;
				}
			multi ++;
			break;
		default:
			if(mode<=5) multi++;
		}
	}
	
	if(connect_result&0x10000000l)
	{
		mode =(unsigned char) connect_result&0xf;
		ret_value += mode_value[mode];
		switch((connect_result>>16)&3)
		{
		case 3: ret_value |= 0x8000; multi++; break;
		case 2: ret_value |= 0x4000; multi++; break;
		case 1: if( chess_object->level != 1 && chess_object->particular == 1 )
				{ //handle particular case:o+o+o+o
					ret_value |= 0x2000;             //
					chess_object->particular = 0;
				}
			multi ++;
			break;
		default:
			if(mode<=5) multi++;
		}
	}
	
	if(multi>=2) ret_value |= 0x2000;
	return ret_value;
}


static unsigned long Renju_Connect(unsigned short int  x, unsigned short int  y, unsigned char who)
{
	CALOG_ENT();	//added by calog

	unsigned char enemy;
	short int i, j, left, right;
	unsigned long board_pattern, pattern_temp, ret_value;
	
	if(chess_object->map[y][x]!=0)
		return 0x08000000l;
	
	chess_object->map[y][x]=who;
	enemy = (who==MAN)? MACHINE : MAN;    	/* enemy = (~who) & 3; */
	ret_value = 0l;
	
	// Up <-> Down
	pattern_temp = 0;
	for(j=y-1,right=0;j>=0&&right<4;right++,j--)
		if(chess_object->map[j][x]==enemy) break;
		if(j>=0&&chess_object->map[j][x]!=enemy)
		{
			if(chess_object->map[j][x]==who)
				pattern_temp |= 0xc000;
			else
				pattern_temp |= 0x8000;
		}
		for(j=y+1,left=0;j<CHESS_LEN_Y&&left<4;left++,j++)
			if(chess_object->map[j][x]==enemy) break;
			if(j<CHESS_LEN_Y&&chess_object->map[j][x]!=enemy)
			{
				if(chess_object->map[j][x]==who)
					pattern_temp |= 0x3000;
				else
					pattern_temp |= 0x2000;
			}
			if(right+left+1>=5)
			{
				ret_value |= 0x80000000l;
				board_pattern = 0;
				for(j=y-right;j<=y+left;j++)
				{
					board_pattern <<= 1;
					if(chess_object->map[j][x]==who) board_pattern |= 1;
				}
				board_pattern |= pattern_temp;
				i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
				if(i&0x10)
					ret_value &= 0x7fffffffl;
				else
				{
					if(i&0x80)
						ret_value |= 0x00c00000l;
					else if(i&0x40)
						ret_value |= 0x00800000l;
					else if(i&0x20)
						ret_value |= 0x00400000l;
					ret_value |= (((unsigned long)i)&0xf)<<12;
				}
			}
			
			// Up.right <-> Down.left
			pattern_temp = 0;
			for(i=x-1,j=y+1,right=0;i>=0&&j<CHESS_LEN_Y&&right<4;right++,i--,j++)
				if(chess_object->map[j][i]==enemy) break;
				if(i>=0&&j<CHESS_LEN_Y&&chess_object->map[j][i]!=enemy)
				{
					if(chess_object->map[j][i]==who)
						pattern_temp |= 0xc000;
					else
						pattern_temp |= 0x8000;
				}
				for(i=x+1,j=y-1,left=0;i<CHESS_LEN_X&&j>=0&&left<4;left++,i++,j--)
					if(chess_object->map[j][i]==enemy) break;
					if(i<CHESS_LEN_X&&j>=0&&chess_object->map[j][i]!=enemy)
					{
						if(chess_object->map[j][i]==who)
							pattern_temp |= 0x3000;
						else
							pattern_temp |= 0x2000;
					}
					if(right+left+1>=5)
					{
						ret_value |= 0x40000000l;
						board_pattern = 0;
						for(i=x-right,j=y+right;i<=x+left;i++,j--)
						{
							board_pattern <<= 1;
							if(chess_object->map[j][i]==who) board_pattern |= 1;
						}
						board_pattern |= pattern_temp;
						i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
						if(i&0x10)
							ret_value &= 0xbfffffffl;
						else
						{
							if(i&0x80)
								ret_value |= 0x00300000l;
							else if(i&0x40)
								ret_value |= 0x00200000l;
							else if(i&0x20)
								ret_value |= 0x00100000l;
							ret_value |= (((unsigned long)i)&0xf)<<8;
						}
					}
					
					// right <-> left
					pattern_temp = 0;
					for(i=x-1,right=0;i>=0&&right<4;right++,i--)
						if(chess_object->map[y][i]==enemy) break;
						if(i>=0&&chess_object->map[y][i]!=enemy)
						{
							if(chess_object->map[y][i]==who)
								pattern_temp |= 0xc000;
							else
								pattern_temp |= 0x8000;
						}
						for(i=x+1,left=0;i<CHESS_LEN_X&&left<4;left++,i++)
							if(chess_object->map[y][i]==enemy) break;
							if(i<CHESS_LEN_X&&chess_object->map[y][i]!=enemy)
							{
								if(chess_object->map[y][i]==who)
									pattern_temp |= 0x3000;
								else
									pattern_temp |= 0x2000;
							}
							if(right+left+1>=5)
							{
								ret_value |= 0x20000000l;
								board_pattern = 0;
								for(i=x-right;i<=x+left;i++)
								{
									board_pattern <<= 1;
									if(chess_object->map[y][i]==who) board_pattern |= 1;
								}
								board_pattern |= pattern_temp;
								i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
								if(i&0x10)
									ret_value &= 0xdfffffffl;
								else
								{
									if(i&0x80)
										ret_value |= 0x000c0000l;
									else if(i&0x40)
										ret_value |= 0x00080000l;
									else if(i&0x20)
										ret_value |= 0x00040000l;
									ret_value |= (i&0xf)<<4;
								}
							}
							
							// Down.right <-> Up.left
							pattern_temp = 0;
							for(i=x-1,j=y-1,right=0;i>=0&&j>=0&&right<4;right++,i--,j--)
								if(chess_object->map[j][i]==enemy) break;
								if(i>=0&&j>=0&&chess_object->map[j][i]!=enemy)
								{
									if(chess_object->map[j][i]==who)
										pattern_temp |= 0xc000;
									else
										pattern_temp |= 0x8000;
								}
								for(i=x+1,j=y+1,left=0;i<CHESS_LEN_X&&j<CHESS_LEN_Y&&left<4;left++,i++,j++)
									if(chess_object->map[j][i]==enemy) break;
									if(i<CHESS_LEN_X&&j<CHESS_LEN_Y&&chess_object->map[j][i]!=enemy)
									{
										if(chess_object->map[j][i]==who)
											pattern_temp |= 0x3000;
										else
											pattern_temp |= 0x2000;
									}
									if(right+left+1>=5)
									{
										ret_value |= 0x10000000l;
										board_pattern = 0;
										for(i=x-right,j=y-right;i<=x+left;i++,j++)
										{
											board_pattern <<= 1;
											if(chess_object->map[j][i]==who) board_pattern |= 1;
										}
										board_pattern |= pattern_temp;
										i =(short int) Renju_ConnectSub((unsigned char)left, (unsigned char)right, (unsigned short int)board_pattern);
										if(i&0x10)
											ret_value &= 0xefffffffl;
										else
										{
											if(i&0x80)
												ret_value |= 0x00030000l;
											else if(i&0x40)
												ret_value |= 0x00020000l;
											else if(i&0x20)
												ret_value |= 0x00010000l;
											ret_value |= i&0xf;
										}
									}
									
									chess_object->map[y][x]=0;
									return ret_value;
}


static unsigned char Renju_ConnectSub(unsigned char left, unsigned char right, unsigned short int  board_pattern)
{
	CALOG_ENT();	//added by calog

	static const unsigned char connect_pattern[]=
	{
		0x1f,                          // 5  --  1  [0]
			0x0f, 0x17, 0x1b, 0x1d, 0x1e,  // 4  --  5  [ 1] ~ [ 5]
			0x07, 0x0b, 0x0d, 0x0e,        // 3  --  4  [ 6] ~ [ 9]
			0x03, 0x05, 0x06,              // 2  --  2  [10] ~ [12]
			0x5d
	};
	short int i, j;
	unsigned char begin, end;
	unsigned short int  temp;
	
	if( chess_object->level != 1 )
	{
		temp = board_pattern & 0x00ff;
		if( temp == 0x005d || temp == 0xdd || temp == 0xba || temp == 0xbb )
		{
			chess_object->particular = 1;
			return 0x2d;
		}
	}
	
	begin = 0; end = left + right - 4;             // Pattern 0 ~ 5
	for(j=0; j<=5; j++)
	{
		for(i=begin;i<=end;i++)
		{
			temp = connect_pattern[j] << i;
			if((board_pattern&temp) == temp)
			{
				if(i-1<0 || i>left+right-4)
					temp = 0;
				else if(board_pattern&(0x21<<(i-1)))
					temp = 0;
				else
					temp = 0x40;
				break;
			}
		}
		if(i<=end) break;
	}
	if(j==0)
		return 0x80;
	else if(j<=5)
		return j | temp;
	
	if(left>3) begin++; if(right>3) end--; end++;// Pattern 6 ~ 9
	for(j=6; j<=9; j++)
	{
		for(i=begin;i<=end;i++)
		{
			temp = connect_pattern[j] << i;
			if((board_pattern&temp) == temp)
			{
				if(i-1<0 || i>left+right-4)
					temp = 0;
				else if(board_pattern&(0x21<<(i-1)))
					temp = 0;
				else
					temp = 0x20;
				break;
			}
		}
		if(i<=end) break;
	}
	if(j<=9) return j | temp;
	
	if(left>2) begin++; if(right>2) end--; end++;// Pattern 10 ~ 12
	for(j=10; j<=12; j++)
	{
		for(i=begin;i<=end;i++)
		{
			temp = connect_pattern[j] << i;
			if((board_pattern&temp) == temp) break;
		}
		if(i<=end) break;
	}
	if(j<=12) return (unsigned char)j;
	return 0x1f;
}



/************************************************************************
功能说明: 产生一个0-max之间的随机整数.
接口说明:
调用格式: short rand(short max)
参数说明:
max 一个整数,产生的随机数的最大值不能超过max.
输出说明: 返回产生的随机数.
数据说明:
函数调用: 无
*************************************************************************/
int Renju_rndom(int max)
{
	CALOG_ENT();	//added by calog

	static long a=100001L;
	int			rand_number;
	float		b,x,t1=0.0;
	
	//GetDateTime(&SystemTime);
	//rand_number=SystemTime.tm_sec;
	//t1=(float)rand_number/60L;
	a = ( a * 125 ) % 2796203L;
	b = ( float ) a / 2796203L;
	b = b + t1;
	x = b - ( short ) b;
	rand_number = ( unsigned short )( x * ( max ) );
	
	return rand_number;
}

⌨️ 快捷键说明

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