私はビット単位の操作をいじっていて、キツネ (オオカミ)、ニワトリ (ガチョウ)、穀物 (トウモロコシ)、そして川を渡ろうとしている人がいる単純なロジック パズルを実装したいと考えていました。それぞれの最初の 4 ビットを使用して、川のどちら側にいるかを表しています。
ロジックを実装するのに少し苦労しています。
2 つのビットが 1 または 0 であり、1 と 0 ではないことを確認するにはどうすればよいですか?
int game()
{
int state = 0;
int done = 0;
while (!done)
{
int input = 0;
input = move();
/*
0000 0000
|||\_grain
||\__chicken
|\___fox
\____person
0 = left side of the river
1 = right side
*/
if (input == 3)// Moves person and grain
{
// Move the grain if the person is on the same side.
if (!(state & 1 << 3 ^ state & 1<< 0))
{
state ^= 1 << 3;
state ^= 1 << 0;
}
else
{
// Always switch the person no matter what
state ^= 1 << 3;
}
}
else if (input == 2) // Moves person and chicken
{
// Move Chicken only if person is on the same side
if (!(state & 1 << 3 ^ state & 1<< 1))
{
state ^= 1 << 3;
state ^= 1 << 1;
}
else
{
// Always switch the person no matter what
state ^= 1 << 3;
}
}
else if (input == 1)// Moves person and fox
{
// Move the fox if the person is on the same side.
if (!(state & 1 << 3 ^ state & 1<< 2))
{
state ^= 1 << 3;
state ^= 1 << 2;
}
else
{
// Always switch the person no matter what
state ^= 1 << 3;
}
}
// Fox and Chicken on one side and person on the other = lost
if ((state & 1 << 2 && state & 1 << 1) && ~(state & 1 << 3))
{
printf("Failed\n");
}
}
return 1;
}
ビットごとのチェックはよりエレガントなコードになると思いますが、それはもっと面倒なようです。ビットごとのロジックで頭を壁にぶつけてうんざりすると、いつもこれをやってしまいます。
int game()
{
int state = 0;
int done = 0;
while (!done)
{
int input = 0;
input = move();
/*
0000 0000
| | | \_grain
| | \__chicken
| \___fox
\____person
0 = left side of the river
1 = right side
*/
if (input == 3)// Moves person and grain
{
// Are they on the same side?
if (state == 9 || state == 11 || state == 13 || state == 15 ||
state == 0 || state == 2 || state == 4 || state == 6)
{
// Move the person and grain
state ^= 1 << 3;
state ^= 1 << 0;
}
else
{
state ^= 1 << 3;
}
}
else if (input == 2) // Moves person and chicken
{
// Are they on the same side?
if (state == 10 || state == 11 || state == 14 || state == 15 ||
state == 0 || state == 1 || state == 4 || state == 5)
{
// Move the person and chicken
state ^= 1 << 3;
state ^= 1 << 1;
}
else
{
state ^= 1 << 3;
}
}
else if (input == 1)// Moves person and fox
{
// Are they on the same side?
if (state == 12 || state == 13 || state == 14 || state == 15 ||
state == 0 || state == 1 || state == 2 || state == 3)
{
// Move the person and fox
state ^= 1 << 3;
state ^= 1 << 2;
}
else
{
state ^= 1 << 3;
}
}
else
{
// Always switch the person no matter what
state ^= 1 << 3;
}
//Check if you won or lost
if (state == 3 || state == 6 || state == 8 || state == 9 || state == 12) // Lost
{
return 0;
}
if (state == 15) // Won
{
return 1;
}
}
return 1;
}