关于#c语言#的问题:字符离开当前位置后使得当前的位置符号变回原来的符号例如:F向下移动后,F的原本位置变成空白或者变成x,F原本位置的t重新出现

如何实现交换位置后,字符离开当前位置后使得当前的位置符号变回原来的符号
例如:F向下移动后,将t覆盖了,F的原本位置变成空白或者变成x,然后F在向下移动,F原本位置的t重新出现,F把~覆盖了。
w , s, a ,d的代码应该如何改
代码如下:

#include 
#include 
#define ROW 11                 //游戏区行数
#define COL 11                 //游戏区列数     

char map[ROW][COL] = {
    {'F', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x'},   //x为草坪
    {'t', '~', '~', '~', '~', '~', '~', '~', '~', '~'},   //~为水流
    {'~', '~', '~', '~', '~', '~', '~', 't', '~', '~'},   //o为终点
    {'~', '~', '~', '~', '~', '~', '~', '~', '~', '~'},      //T为乌龟的位置
    {'~', 't', '~', '~', '~', '~', 't', '~', '~', '~'},
    {'~', '~', '~', '~', '~', '~', '~', '~', '~', '~'},
    {'~', '~', '~', '~', '~', '~', '~', '~', '~', '~'},
    {'~', '~', '~', 't', '~', 't', '~', '~', 't', '~'},
    {'~', '~', '~', '~', '~', '~', '~', 't', '~', '~'},
    {'~', '~', '~', '~', '~', '~', '~', '~', '~', '~'},
    {'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'o', 'x'}
};

int main() {
    int i, j;
    int x = 0, y = 0;
    char c, q;
    while (1) {
        for (i = 0; i < ROW; i++) {
            for (j = 0; j < COL; j++) {
                printf("%c ", map[i][j]);     //生成游戏界面
            }
            printf("\n");
        }
        printf("请输入操作:\n");
        scanf("%c", &c);                     //w s a d
        getchar();                           //防止重复出现的二维数组
        system("cls");                      //清理屏幕

        if (c == 'w') {
            q = map[x - 1][y];
            map[x - 1][y] = map[x][y];
            map[x][y] = q;
            x = x - 1;

        }

        else if (c == 's') {
            q = map[x + 1][y];
            map[x + 1][y] = map[x][y];
            map[x][y] = q;
            x = x + 1;

        }

        else if (c == 'a') {

            q = map[x][y - 1];
            map[x][y - 1] = map[x][y];
            map[x][y] = q;
            y = y - 1;

        }

        else if (c == 'd') {

            q = map[x][y + 1];
            map[x][y + 1] = map[x][y];
            map[x][y] = q;
            y = y + 1;

        }

        else if (c == 'l') {
            int a, b;
            printf("添加浮木:请输入浮木放置的横坐标和纵坐标\n");//添加浮木
            scanf("%d%d", &a, &b);
            getchar();
            map[a][b] = 'L';

        }

        else if (c == 'k') {
            int a, b;
            printf("清除浮木:请输入需要清除浮木的横坐标和纵坐标\n");//清除浮木
            scanf("%d%d", &a, &b);
            getchar();
            if (map[a][b] == 'L') {
                map[a][b] = '~';
            } else if (map[a][b] == '~' || map[a][b] == 'F' || map[a][b] == 't' || map[a][b] == 'x') {
                printf("该位置没有浮木");
            }
        }



        else if (c == 'b') {
            int a, b;
            printf("请输入臭虫放置的横坐标和纵坐标\n");           //添加臭虫
            scanf("%d%d", &a, &b);
            getchar();
            if (map[a][b] == 'L') {
                map[a][b] = 'B';
            } else if (map[a][b] == '~' || map[a][b] == 'F' || map[a][b] == 't' || map[a][b] == 'x')
                printf("臭虫没有放在浮木上\n");
        }


    }
    return 0;
}

img

img

如何实现不是简单的交换位置

那你不能直接修改这个数组
你应该分为两部分,一个数组是作为底图的,它永远不变,或者至少是基本不变,另一个是把各种可移动物体叠加上去之后的样子
最终显示的是数组2
而每次移动后,你需要重新用数组1和可移动物体生成数组2
否则你的可移动物体把底图信息给覆盖了就找不回来了

仅供参考:

#include <windows.h>
#include <stdio.h>

void ConPrint(char *CharBuffer, int len);
void ConPrintAt(int x, int y, char *CharBuffer, int len);
void gotoXY(int x, int y);
void ClearConsole(void);
void ClearConsoleToColors(int ForgC, int BackC);
void SetColorAndBackground(int ForgC, int BackC);
void SetColor(int ForgC);
void HideTheCursor(void);
void ShowTheCursor(void);

int main(int argc, char* argv[])
{
   HideTheCursor();
   ClearConsoleToColors(15, 1);
   ClearConsole();
   gotoXY(1, 1);
   SetColor(14);
   printf("This is a test...\n");
   Sleep(5000);
   ShowTheCursor();
   SetColorAndBackground(15, 12);
   ConPrint("This is also a test...\n", 23);
   SetColorAndBackground(1, 7);
   ConPrintAt(22, 15, "This is also a test...\n", 23);
   gotoXY(0, 24);
   SetColorAndBackground(7, 1);
   return 0;
}

//This will clear the console while setting the forground and
//background colors.
void ClearConsoleToColors(int ForgC, int BackC)
{
   WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //not used but we need to capture this since it will be
   //written anyway (passing NULL causes an access violation).
   DWORD count;

   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   SetConsoleTextAttribute(hStdOut, wColor);
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

//This will clear the console.
void ClearConsole()
{
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //   not used but we need to capture this since it will be
   //   written anyway (passing NULL causes an access violation).
   DWORD count;
   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

//This will set the position of the cursor
void gotoXY(int x, int y)
{
   //Initialize the coordinates
   COORD coord = {x, y};
   //Set the position
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

//This will set the forground color for printing in a console window.
void SetColor(int ForgC)
{
   WORD wColor;
   //We will need this handle to get the current background attribute
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   CONSOLE_SCREEN_BUFFER_INFO csbi;

   //We use csbi for the wAttributes word.
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //Mask out all but the background attribute, and add in the forgournd color
      wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
      SetConsoleTextAttribute(hStdOut, wColor);
   }
}

//This will set the forground and background color for printing in a console window.
void SetColorAndBackground(int ForgC, int BackC)
{
   WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
}

//Direct console output
void ConPrint(char *CharBuffer, int len)
{
   DWORD count;
   WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL);
}

//Direct Console output at a particular coordinate.
void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
   DWORD count;
   COORD coord = {x, y};
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(hStdOut, coord);
   WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}

//Hides the console cursor
void HideTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}

//Shows the console cursor
void ShowTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}