C程序的窗口大小调整会影响元素位置

问题描述

我想在c中创建一个扫雷生成器,并且每当我运行该程序时,要么窗口出现奇怪的形状,从而将元素的位置更改为看起来不正确,要么是我用来生成图块的函数错误生成了它们。我该如何解决这两个问题?我的代码在这里

#include <windows.h> /* for HANDLE type,and console functions */
#include <stdio.h> /* standard input/output */
#include <stdlib.h> /* included for rand */


#define WIDTH 70
#define HEIGHT 35
#define BOMBS 20

HANDLE wHnd; /* write (output) handle */
HANDLE rHnd; /* read (input handle */

void SetGrid(int grid[WIDTH][HEIGHT])
{
  int bomb[2] = {abs(rand() % WIDTH),abs(rand() % HEIGHT)};

  for (int i = 0; i < BOMBS; i++)
  {
     while (grid[bomb[0]][bomb[1]] < -1)
     {
        bomb[0] = abs(rand() % WIDTH);
        bomb[1] = abs(rand() % HEIGHT);
     }

     grid[bomb[0]][bomb[1]] = -9;

     grid[bomb[0]+1][bomb[1]+1]++;
     grid[bomb[0]-1][bomb[1]-1]++;
     grid[bomb[0]-1][bomb[1]+1]++;
     grid[bomb[0]+1][bomb[1]-1]++;
     grid[bomb[0]-1][bomb[1]]++;
     grid[bomb[0]+1][bomb[1]]++;
     grid[bomb[0]][bomb[1]-1]++;
     grid[bomb[0]][bomb[1]+1]++;
  }

}

int main(void)
{

  srand(time(0));

  SMALL_RECT windowSize = {0,WIDTH - 1,HEIGHT - 1};

  COORD bufferSize = {WIDTH,HEIGHT};

  COORD characterBufferSize = {WIDTH,HEIGHT};
  COORD characterPosition = {0,0};
  SMALL_RECT consoleWriteArea = {0,HEIGHT - 1};

  CHAR_INFO consoleBuffer[WIDTH][HEIGHT];

  wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
  rHnd = GetStdHandle(STD_INPUT_HANDLE);

  SetConsoleTitle("Our shiny new title!");

  SetConsoleWindowInfo(wHnd,TRUE,&windowSize);
  SetConsoleScreenBufferSize(wHnd,bufferSize);

  int startGrid[WIDTH][HEIGHT] = {0};
  SetGrid(startGrid);

  for (int x = 0; x < WIDTH; ++x)
  {
    for (int y = 0; y < HEIGHT; ++y)
    {

      if(startGrid[x][y] > 0)
      {
         consoleBuffer[x][y].Char.AsciiChar = '0' + startGrid[x][y];
         consoleBuffer[x][y].Attributes = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
      }
      else
      {
         consoleBuffer[x][y].Char.AsciiChar = (unsigned char)219;
         consoleBuffer[x][y].Attributes = (startGrid[x][y] < 0 ? FOREGROUND_RED : FOREGROUND_BLUE) | FOREGROUND_INTENSITY;
      }

    }

  }

  WriteConsoleOutputA(wHnd,consoleBuffer,characterBufferSize,characterPosition,&consoleWriteArea);
  getchar();
}

解决方法

您需要处理几个边界问题。

  1. 四个角默认为-4
  2. 除了四个角之外,边框为-6(尽管您没有使用它们)
  3. 重要:边界处的增加会考虑是否超出边界。

代码如下:

href="./assets/form.css"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...