Ok, add a new event:
System:compare tickcount=1
And move event 9 (the for each ordered) to be a sub event of that new event.
What was happening was destroyed objects still exist until the end of the frame. So there was still an odd number of cards when the for each was run.
As for being able to match different cards I suspect your condition that checks for a win may be the cause.
Try changing the expressions to just gFirstCardFrame=gSecondCardFrame