//加入人走过的路径
struct sokomap * addPersonWalkPath(struct sokomap *map)
{
	struct sokomap *current_map = map;
	struct sokomap *nxt_map = NULL;
	struct sokomap *tmp_map1 = NULL,*tmp_map2 = NULL;
	while(current_map)
	{
		nxt_map = current_map -> next;
		if(nxt_map != NULL)
		{
			struct mappos * pos = personWalkPath(current_map,nxt_map);
			pos = pos -> next;
			while(pos)
			{
				//复制一个地图
				tmp_map1 = copyMap(current_map);
				tmp_map2 = current_map -> next;
				current_map -> next = tmp_map1;
				tmp_map1 -> parent = current_map;
				tmp_map1 -> next = tmp_map2;
				tmp_map2 -> parent = tmp_map1;
				setPerson_xy(tmp_map1,pos->x,pos->y);
				
				current_map = tmp_map1;
				pos = pos -> next;
			}
			freeMappos(pos);
		}
		current_map = nxt_map;
	}
}
Beispiel #2
0
GLColorMap& GLColorMap::setColors(GLsizei newNumEntries,const GLColorMap::Color* newEntries)
	{
	/* Copy entry array: */
	copyMap(newNumEntries,newEntries,min,max);
	
	return *this;
	}
//计算地图的列表
struct sokomap * caculatePath(struct sokomap *map)
{
	struct sokomap *current,*currentHeader;//当前各个地图列表,failHeader失败的列表
	struct sokomap *retSokomap = NULL;//要返回的列表
	struct sokomap *currentTail;
	int box_count,wall_count,person_count,dest_count;
	mapProperyCount(map,&wall_count,&box_count,&person_count,&dest_count);//计算箱子的个数
	struct mappos * boxPos = (struct mappos*) malloc(sizeof(struct mappos)*box_count);
	//生成头节点
	currentHeader = copyMap(map);
	//进行循环的操作
	current = currentHeader;
	currentTail = current;
	//循环的操作	
	int flag = 0;
	while(current)
	{
		if(isMapSuccess(current))
		{
			flag = 1;
			break;
		}
		addNxtStep(currentHeader,&currentTail,current,boxPos,box_count);
		current = current -> next;
	}
	if(flag)
	{
		//成功的地图,进行一些必要的保存步骤的操作
		struct sokomap * tmpSokoPtr = NULL;
		while(current)
		{
			retSokomap = copyMap(current);
			retSokomap -> parent = NULL;
			retSokomap->next = tmpSokoPtr;
			//设置父亲节点 
			if(tmpSokoPtr)
			{
				tmpSokoPtr -> parent = retSokomap;
			}
			tmpSokoPtr = retSokomap;
			current = current -> parent;
		}
	}
	//清除内存的操作
	freeMap(currentHeader);
	return retSokomap;
}
Beispiel #4
0
GLColorMap& GLColorMap::operator=(const GLColorMap& source)
	{
	if(this!=&source)
		{
		/* Copy entry array: */
		copyMap(source.numEntries,source.entries,source.min,source.max);
		}
	
	return *this;
	}
Beispiel #5
0
// copies the data from the given bitvector to this bitvector.
// returns true if this results in a change in this bitvector or false otherwise
// (change = among the variables mapped by bitvector src)
// if there's a variable in srcMap that is not in this, this variable's mapping is copied to this
// if there's a variable in this that is not in srcMap, it is unchanged
bool VarBitVector::copy(VarBitVector& src)
{
//              cout <<"copy()  src="<<src<<"\n";       

        bool modified = !this->initialized ||
                        (this->initialized != src.initialized);
        
        this->initialized = src.initialized;
        bool modifiedCopy = copyMap(src.varMap);
        
        return modified || modifiedCopy;
}
Beispiel #6
0
// computes the union of this bitvector and the given bitvector, updating this bitvector to be that union
bool VarBitVector::unionUpdate(VarBitVector &other)
{
        VarBitVector *vecUnion = unionVec(other);
        // if the union is different from this bitvector's initial value
        if ((*this) != (*vecUnion))
        {
                // copy the new union into the current bitvector
                copyMap(vecUnion->varMap);
                delete vecUnion;
                return true; // inform the caller that this bitvector has changed
        }
        else
                return false; // inform the caller that this bitvector has not changed
}
Beispiel #7
0
// computes the intersection of this bitvector and the given bitvector, updating this bitvector to be that intersection
bool VarBitVector::intersectUpdate(VarBitVector &other)
{
        VarBitVector *inter = intersectVec(other);
        // if the intersection is different from this bitvector's initial value
        if ((*this) != (*inter))
        {
                // copy the new intersection into the current bitvector
                copyMap(inter->varMap);
                delete inter;
                return true; // inform the caller that this bitvector has changed
        }
        else
                return false; // inform the caller that this bitvector has not changed
}
int gameoflife()
{
    int row, col;
    char ans;
    init();
    while(1)
    {
        outputMap();
        for(row = 0; row < MAXROW; row++)
        {
            for(col = 0; col < MAXCOL; col++)
            {
                switch (neighbors(row, col))
                {
                case 0:
                case 1:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                    newmap[row][col] = DEAD;
                    break;
                case 2:
                    newmap[row][col] = map[row][col];
                    break;
                case 3:
                    newmap[row][col] = ALIVE;
                    break;
                }
            }
        }
        copyMap();
        printf("\nContinue next Generation ? ");
        getchar();
        ans = toupper(getchar());
        if(ans != 'Y') break;
    }

    return 0;
}
Beispiel #9
0
void mirrorMap()
   {
//--------------------------------------------------------------
// mirror map
//--------------------------------------------------------------
//     normalMirroring()

   int swapXa = pickFrom2(-1,1, 1,advancedMirrorOK_G);
   int swapYa = pickFrom2(-1,advancedMirrorOK_G, 1,1);
   int swapXb = pickFrom2(-1,advancedMirrorOK_G, 1,1);
   int swapYb = pickFrom2(-1,1, 1,advancedMirrorOK_G);

   switch (mirrorTypeG)
      {
      case NORMALMIRROR: //four quadrants
         //ABCBA
         //DEFED
         //GHIHG
         //DEFED
         //ABCBA
         copyMap(mapCornerMaxG, 0, swapXa, swapYa);
         copyMap(0, mapCornerMaxG, swapXb, swapYb);
         copyMap(mapCornerMaxG, mapCornerMaxG, swapXa*swapXb, swapYa*swapYb);
         break;
      case XOFFSETMIRROR: //Like normal, but one half is moved horizontally by 1/4 totalmapsize
         //ABABABABA
         //DEFGHGFED
         //CDCDCDCDC
         //FGHGFEDEF
         //ABABABABA
         if (swapYa == -1) //ensures fairness
            swapXb = -1;
         copyMap(mapCornerMaxG, 0, 1, swapYa);
         copyMap(mapCornerMaxG/2, mapCornerMaxG, swapXb, swapYb);
         copyMap(mapCornerMaxG*3/2, mapCornerMaxG, swapXb, swapYa*swapYb);
         break;
      case YOFFSETMIRROR: //Like normal, but one half is moved vertically by 1/4 totalmapsize
         if (swapXb == -1) //ensures fairness
            swapYa = -1;
         copyMap(mapCornerMaxG, mapCornerMaxG/2, swapXa, swapYa);
         copyMap(0, mapCornerMaxG, swapXb, 1);
         copyMap(mapCornerMaxG, mapCornerMaxG*3/2, swapXa*swapXb, swapYa);
         break;
      case MAXDISTMIRROR: //Allows maximum distance between starting points
      default:
         //ABCDCBA
         //E*GHIJE
         //HIJE*GH
         //DCBABCD
         //HG*EJIH
         //EJIHG*E
         //ABCDCBA

         copyMap(mapCornerMaxG, 0, 1, -1);
         copyMap(0, mapCornerMaxG, -1, 1);
         copyMap(mapCornerMaxG, mapCornerMaxG, -1, -1);
      }
   }
Beispiel #10
0
//增加下一个地图的步骤
void addNxtStep(struct sokomap *header,struct sokomap **currentTail,struct sokomap *current,struct mappos * boxPos,int boxCount)
{
	
	//计算人所在的列表
	if(current->pos==NULL)
	{
		current->pos = personCanWalkPoint(current);
	}
	getBoxList(current,boxPos);
	//进行循环判断箱子可以移动的方向
	for(int i=0;i < boxCount;i++)
	{
		int x = boxPos[i].x;
		int y = boxPos[i].y;
		//向上推的操作
		if(isCanPushUp(current,x,y))
		{	
			if(isInMappos(current->pos,boxPos[i].x,boxPos[i].y+1))
			{
				struct sokomap * tmpMap = copyMap(current);
				tmpMap ->parent = current;
				pushUp(tmpMap,x,y);
				//判断地图是否已经棍了,没棍的话就加入到尾步
				if(isMapDead(tmpMap,x,y+1,UP))
				{
					freeMap(tmpMap);
				}else if(isInSokoMap(header,tmpMap))//已经在列表中,就把这个新地图删除
				{
					freeMap(tmpMap);
				}else
				{
					(*currentTail)->next = tmpMap;
					*currentTail = tmpMap;
				}
			}
		}
		//向下推的操作
		if(isCanPushDown(current,boxPos[i].x,boxPos[i].y))
		{
			if(isInMappos(current->pos,boxPos[i].x,boxPos[i].y - 1))
			{
				struct sokomap * tmpMap = copyMap(current);
				tmpMap ->parent = current;
				pushDown(tmpMap,x,y);
				//判断地图是否已经棍了,没棍的话加入到尾部
				if(isMapDead(tmpMap,x,y-1,DOWN))
				{
					freeMap(tmpMap);
				}else if(isInSokoMap(header,tmpMap))//已经在列表中,就把这个新地图删除
				{
					freeMap(tmpMap);
				}else
				{
					(*currentTail)->next = tmpMap;
					*currentTail = tmpMap;
				}
			}
		}
		//向左推的操作
		if(isCanPushLeft(current,boxPos[i].x,boxPos[i].y))
		{
			if(isInMappos(current->pos,boxPos[i].x + 1,boxPos[i].y))
			{
				struct sokomap * tmpMap = copyMap(current);
				tmpMap ->parent = current;
				pushLeft(tmpMap,x,y);
				//判断地图是否已经棍了,没棍的话加入到尾部
				if(isMapDead(tmpMap,x - 1,y,LEFT))
				{
					freeMap(tmpMap);
				}else if(isInSokoMap(header,tmpMap))//已经在列表中,就把这个新地图删除
				{
					freeMap(tmpMap);
				}else
				{
					(*currentTail)->next = tmpMap;
					*currentTail = tmpMap;
				}
			}
		}
		//向右推的操作
		if(isCanPushRight(current,boxPos[i].x,boxPos[i].y))
		{
			if(isInMappos(current->pos,boxPos[i].x - 1,boxPos[i].y))
			{
				struct sokomap * tmpMap = copyMap(current);
				tmpMap ->parent = current;
				pushRight(tmpMap,x,y);
				//判断地图是否已经棍了,没棍的话加入到尾部
				if(isMapDead(tmpMap,x + 1,y,RIGHT))
				{
					freeMap(tmpMap);
				}else if(isInSokoMap(header,tmpMap))//已经在列表中,就把这个新地图删除
				{
					freeMap(tmpMap);
				}else
				{
					(*currentTail)->next = tmpMap;
					*currentTail = tmpMap;
				}
			}
		}
	}
}
Beispiel #11
0
GLColorMap::GLColorMap(const GLColorMap& source)
	:numEntries(0),entries(0)
	{
	/* Copy entry array: */
	copyMap(source.numEntries,source.entries,source.min,source.max);
	}
Beispiel #12
0
GLColorMap::GLColorMap(GLsizei sNumEntries,const GLColorMap::Color* sEntries,GLdouble sMin,GLdouble sMax)
	:numEntries(0),entries(0),min(sMin),max(sMax)
	{
	/* Copy entry array: */
	copyMap(sNumEntries,sEntries,sMin,sMax);
	}
Beispiel #13
0
void vblank(void) {
	#ifdef WIN
		drawFramebuffer();
	#endif
	
	#ifdef PS4
		void readController(void);
		readController();
		
		extern unsigned int buttons;
		keys.c = (unsigned char)buttons;
		
		sceKernelUsleep(1000000 / 60);
	#endif
	
	#ifdef DS
		// The Game Boy and DS use the same key layout, how convenient :)
		keys.c = (unsigned char)REG_KEYINPUT;
		
		// Support scrolling
		copyMap();
	#endif
	
	#ifdef GC
		VIDEO_WaitVSync();
	#endif
	
	#ifdef DS3
		hidScanInput();
		u32 kHeld = hidKeysHeld();
		
		keys.keys1 = 0x0f;
		keys.keys2 = 0x0f;
		
		if(kHeld & KEY_B) keys.b = 0;
		if(kHeld & KEY_A) keys.a = 0;
		if(kHeld & KEY_START) keys.start = 0;
		if(kHeld & KEY_SELECT) keys.select = 0;
		if(kHeld & KEY_UP) keys.up = 0;
		if(kHeld & KEY_DOWN) keys.down = 0;
		if(kHeld & KEY_LEFT) keys.left = 0;
		if(kHeld & KEY_RIGHT) keys.right = 0;
		
		//gfxFlushBuffers();
		gspWaitForVBlank();
		gfxSwapBuffers();
		
		if(!aptMainLoop() || ((kHeld & KEY_START) && (kHeld & KEY_SELECT) && (kHeld & KEY_L) && (kHeld & KEY_R))) quit();
	#endif
	
	#ifdef LIN
		drawFramebuffer();
	#endif
	
	#ifdef PSP
		SceCtrlData pad;
		sceCtrlReadBufferPositive(&pad, 1);
		
		keys.keys1 = 0x0f;
		keys.keys2 = 0x0f;
		
		if(pad.Buttons & PSP_CTRL_SQUARE) keys.b = 0;
		if(pad.Buttons & PSP_CTRL_CROSS) keys.a = 0;
		if(pad.Buttons & PSP_CTRL_START) keys.start = 0;
		if(pad.Buttons & PSP_CTRL_SELECT) keys.select = 0;
		if(pad.Buttons & PSP_CTRL_UP) keys.up = 0;
		if(pad.Buttons & PSP_CTRL_DOWN) keys.down = 0;
		if(pad.Buttons & PSP_CTRL_LEFT) keys.left = 0;
		if(pad.Buttons & PSP_CTRL_RIGHT) keys.right = 0;
		
		sceDisplayWaitVblankStart();
	#endif
	
	interrupt.master = 0;
	writeShortToStack(registers.pc);
	registers.pc = 0x40;
	
	ticks += 12;
}