The sound card numbers are assigned pretty much at random on init, this is unfortunately due to the way init works these days. The good news is, with ALSA you can reference sound cards by name rather than number.
First, run
cat /proc/asound/cards
you will get something like
0 [AudioPCI ]: ENS1371 - Ensoniq AudioPCI
Ensoniq AudioPCI ENS1371 at 0xd400, irq 225
1 [U0x46d0x8d9 ]: USB-Audio - USB Device 0x46d:0x8d9
USB Device 0x46d:0x8d9 at usb-0000:00:10.0-1, full speed
2 [V8237 ]: VIA8237 - VIA 8237
VIA 8237 with AD1888 at 0xe000, irq 217
the names in square brackets is what you need. Say you want V8237 to be your default card, for notification sounds and all other junk. Then you can put this into /etc/asound.conf or ~/.asoundrc:
pcm.!default
{
type hw
card V8237
}
ctl.!default
{
type hw
card V8237
}
This is the simplest case, without dmixing or anything. See
http://alsa.opensrc.org/FAQ026
Then you would configure the programs that you want to send sound to the other card, say the AudioPCI. For example in KPlayer you would go to the Audio section in the Configure KPlayer dialog, and put hw:AudioPCI into the Device field after making sure ALSA is selected as the audio output.