回复 10楼 lin5161678
赞同!但迷信的人多了,现在的编译器不得不加入了一段优化,就是将这些“利用异或交换变量”的代码片段更换为正常方法。
if ( m[new_self[0]][new_self[1]] & 0b010 )
move(m,com,new_self);
*t2 |= ( (*t1) & 0b011 ); *t1 &= 0b100;
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define W 15
#define H 15
enum COMD
{
EMPTY,
UP,
DOWN,
LEFT,
RIGHT
};
unsigned g_f = 0;
unsigned g_nf = 0;
char M[H][W] =
{
{8,8,8,8,8,8,8,8,8},
{8,8,0,0,8,8,8,8,8},
{8,8,2,0,0,0,2,0,8},
{8,8,0,4,8,4,0,0,8},
{8,8,0,8,8,8,0,8,8},
{8,0,1,4,8,4,0,8,8},
{8,0,2,0,0,0,2,8,8},
{8,8,0,8,8,0,0,8,8},
{8,8,8,8,8,8,8,8,8}
};
void find_id( char[][],int[] );
void fun( char[][], int[] );
int get_com( char[][],int[] );
int move( char[][],int[],int[] );
int judge_move (char[][],int[],int[] );
int check_win( char[][] );
void print( char[][] );
int main( void )
{
int point[2] = {0,0};
find_id(M,point);
print(M);
if (!check_win(M))
while ( !fun(M,point));
puts("恭喜过关!");
return 0;
}
void fun( char m[H][W], int self[2] )
{
int com[2] = {0,0};
int new_self[2] = {0,0};
if (get_com(M,com) == 0 )
return ;
new_self[0] = self[0] + com[0];
new_self[1] = self[1] + com[1];
if ( m[new_self[0]][new_self[1]] & 0b010 )
move(m,com,new_self);
if ( !move(m,com,self))
return ;
self[0] = new_self[0];
self[1] = new_self[1];
print(M);
return check_win(M);
}
int get_com( char m[H][W],int re_com[] )
{
static char C[256] = {0};
C['w'] = UP;
C['s'] = DOWN;
C['a'] = LEFT;
C['d'] = RIGHT;
C['W'] = UP;
C['S'] = DOWN;
C['A'] = LEFT;
C['D'] = RIGHT;
C[72] = UP;
C[80] = DOWN;
C[75] = LEFT;
C[77] = RIGHT;
int com[2] =
{0,0};
char ch = 0;
ch= getch();
unsigned flag = 1;
switch (C[ch])
{
case UP:
com[0] = -1;break;
case DOWN:
com[0] = 1;break;
case LEFT:
com[1] = -1;break;
case RIGHT:
com[1] = 1;break;
default: flag = 0;
break;
}
re_com[0] = com[0];
re_com[1] = com[1];
return flag;
}
int move( char m[H][W],int com[],int self[] )
{
int new_self[2] ={0,0};
char* t1 = NULL;
char* t2 = NULL;
if (!judge_move(m,com,self))
return 0;
new_self[0] = self[0] + com[0];
new_self[1] = self[1] + com[1];
t1=&m[self[0]][self[1]];
t2=&m[new_self[0]][new_self[1]];
*t2 |= ( (*t1) & 0b011 );
if ( *t2 == 0b110 )
++g_nf;
if ( *t1 == 0b110 )
--g_nf;
*t1 &= 0b100;
return 1;
}
int judge_move ( char m[H][W],int com[],int self[] )
{
static int j_c[20] = {1,0,0,0,1,0,0,0,0,0,0};
int new_self[2];
new_self[0] = self[0] + com[0];
new_self[1] = self[1] + com[1];
return j_c[m[new_self[0]][new_self[1]]];
}
void find_id( char m[H][W],int self[] )
{
size_t i;
size_t j;
unsigned flag = 0;
for ( i = 0; i != H; ++i )
for ( j = 0; j != W; ++ j )
if ( ( m[i][j] & 0b001 ) && flag <=1 )
{
self[0] = i;
self[1] = j;
++flag;
}
else if ( m[i][j]& 0b100 )
++g_f;
if ( flag == 1 )
return ;
else if (flag == 0 )
puts("没有起点!");
else
puts("起点不止一个");
exit(EXIT_FAILURE);
}
int check_win( char m[H][W] )
{
return g_f ==g_nf;
}
void print( char m[H][W] )
{
static char s_c[] =
{ ' ','O','@','?','X','S','$','?','#','#','#','#','#','#'};
size_t i;
size_t j;
system("cls");
for ( i = 0; i != H; ++i )
for ( j = 0; j != W + 1; ++ j ) putchar(j != W?s_c[m[i][j]]:'\n');
puts("");
}
[此贴子已经被作者于2021-5-30 23:08编辑过]

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define H 10
#define W 15
char M[H][W] =
{
{8,8,8,8,8,8,8,8,8,8,8,8},
{8,8,5,8,8,8,8,8,8,8,8,8},
{8,5,5,5,5,5,5,5,5,8,8,8},
{8,8,8,5,5,5,5,8,5,5,5,8},
{8,8,8,5,5,7,8,8,8,8,5,8},
{8,5,5,5,5,5,5,5,5,5,5,8},
{8,5,8,8,8,5,5,8,5,5,8,8},
{8,5,8,8,8,8,5,8,8,5,8,8},
{8,5,5,5,6,8,5,5,5,5,5,8},
{8,8,8,8,8,8,8,8,8,8,8,8}
};
void find_id( char[][],int*,int* );
void fun( char [][],int,int );
int judge_move( char[][],int,int,int );
void re_way( char[][],int[][],int,int );
void print( char[][] );
int main( void )
{
int x;
int y;
find_id(M,&x,&y);
fun(M,x,y);
return 0;
}
void fun( char m[H][W],int x,int y )
{
int com[4][2] =
{
{0,-1},{-1,0},{0,1},{1,0}
};
int t_x = x;
int t_y = y;
int div = 0;
int mark = 0;
int flag;
while (1)
{
const int t_div = ( div + 3 ) % 4;
const int d_x = com[t_div][0];
const int d_y = com[t_div][1];
flag = judge_move( m,x + d_x, y + d_y,t_div );
if ( flag == 0 )
{
m[x][y] = div = t_div;
x += d_x;
y += d_y;
}
else if ( flag == 1)
div = (++div % 4);
else if ( flag == 2)
{
m[x][y] = t_div;
break;
}
if ( x == t_x && y == t_y && ( ++mark == 4 ) )
break;
}
if ( flag == 2 )
re_way(m,com,t_x,t_y);
else
{
m[x][y] = 6;
print(m);
puts("没路!");
}
}
int judge_move( char m[H][W],int x,int y,int t_div )
{
#define ABS(n) ((n) >= 0 ? (n) : (-(n)))
if ( m[x][y] == 7 )
return 2;
if ( m[x][y] == 5 )
return 0;
return ( m[x][y] == 8 || ( ABS(m[x][y] - t_div) != 2 ));
#undef ABS
}
void re_way( char m[H][W],int com[4][2],int x,int y )
{
while ( m[x][y] != 7 )
{
const int t = m[x][y];
m[x][y] +=10;
x += com[t][0];
y += com[t][1];
print(m);
getch();
}
}
void print( char m[H][W] )
{
static char s_c[] =
{ ' ',' ',' ',' ','*',' ','O','X','#','$','<','^','>','v'};
size_t i;
size_t j;
system("cls");
for ( i = 0; i != H; ++i )
for ( j = 0; j != W + 1; ++ j )
putchar(j != W?s_c[m[i][j]]:'\n');
}
void find_id( char m[H][W], int* x,int* y )
{
size_t i;
size_t j;
unsigned flag = 0;
for ( i = 0; i != H; ++i )
for ( j = 0; j != W; ++ j )
if ( ( m[i][j] ==6 ) && flag <=1 )
{
*x = i;
*y = j;
++flag;
}
if ( flag == 1 )
return ;
else if (flag == 0 )
puts("没有起点!");
else
puts("起点不止一个");
exit(EXIT_FAILURE);
}
[此贴子已经被作者于2021-6-1 00:25编辑过]


