[已关闭]第一个在C++中的应用程序

gdrx4gfi  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(109)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

十年前就关门了。
Improve this question
我只是想问你一件事。我不指望你给我任何代码。我想做一个蛇游戏。我的想法是制作一个数组,用GetAsyncKeyState()函数控制蛇。我还没有决定如何移动蛇,但我正在考虑使用链表将蛇的身体坐标保存在数组中的想法。
我有两个问题:1.你喜欢我使用链表的想法吗?2.我需要以某种方式清除控制台并重新输出表。但如果我使用
system(“CLS”)
,屏幕会 Flink 。有没有更好的方法可以不 Flink 地清除控制台?
任何其他想法将不胜感激:)
下面是我的代码。

  1. #include<iostream>
  2. #include<windows.h>
  3. using namespace std;
  4. int matrix[20][40];
  5. void FillMatrix()
  6. {
  7. for(int i = 0; i < 20; i++)
  8. for(int j = 0; j < 40; j++)
  9. matrix[i][j] = 0;
  10. }
  11. void Show()
  12. {
  13. COORD pos = {0, 0};
  14. SetConsoleCursorPosition(cout, pos);
  15. for(int i = 0; i < 20; i++)
  16. {
  17. for(int j = 0; j < 40; j++)
  18. {
  19. if(i == 0 || j == 0 || i == 19 || j == 39) cout << "#";
  20. else if(matrix[i][j] == 0) cout << " ";
  21. else cout << ".";
  22. }
  23. cout << endl;
  24. }
  25. }
  26. void Change(int i, int j)
  27. {
  28. matrix[i][j] = 1;
  29. }
  30. int main()
  31. {
  32. FillMatrix();
  33. int x, y;
  34. x = 4;
  35. y = 4;
  36. while(!GetAsyncKeyState(VK_ESCAPE))
  37. {
  38. Sleep(100);
  39. //system("cls");
  40. if(GetAsyncKeyState(VK_LEFT))
  41. {
  42. y = y-1;
  43. Change(x, y);
  44. }
  45. else
  46. if(GetAsyncKeyState(VK_UP))
  47. {
  48. x = x-1;
  49. Change(x, y);
  50. }
  51. else
  52. if(GetAsyncKeyState(VK_RIGHT))
  53. {
  54. y = y+1;
  55. Change(x, y);
  56. }
  57. else
  58. if(GetAsyncKeyState(VK_DOWN))
  59. {
  60. x = x+1;
  61. Change(x, y);
  62. }
  63. Show();
  64. }
  65. system("pause");
  66. return 0;
  67. }

字符串

xzlaal3s

xzlaal3s1#

使用链表几乎总是一个糟糕的主意。在这种情况下,似乎没有理由甚至考虑使用一个链表。使用链表的主要原因是当你需要在列表中间插入或删除项目时(并且,为了获得更多,已经有指向列表中需要进行插入/删除的特定位置的东西)。
因为你显然使用的是Win32,所以我根本不会清除屏幕,而是使用WriteConsoleOutput将新的输出写入屏幕,删除之前的任何内容。
虽然这不是一个蛇游戏 * 本身 *,这里的代码实现了约翰康威的生命游戏使用WriteConsoleOutput来产生屏幕输出。它还包括一个ClrScr函数来清除屏幕,如果你决定你真的 * 必须 * 这样做(但你可能不会)。

  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include <conio.h>
  7. #include <io.h>
  8. #define ROWS 50
  9. #define COLS 80
  10. // The total number of generations is really double this number.
  11. int generations = 1000;
  12. int civ1[ROWS+2][COLS+2], civ2[ROWS+2][COLS+2];
  13. CHAR_INFO disp[ROWS][COLS];
  14. HANDLE console;
  15. COORD size = { COLS, ROWS };
  16. COORD src = { 0, 0};
  17. SMALL_RECT dest = { 0, 0, COLS, ROWS };
  18. void ClrScrn(char attrib) {
  19. COORD pos = { 0, 0};
  20. DWORD written;
  21. unsigned size;
  22. size = ROWS * COLS;
  23. FillConsoleOutputCharacter(console, ' ', size, pos, &written);
  24. FillConsoleOutputAttribute(console, attrib, size, pos, &written);
  25. SetConsoleCursorPosition(console, pos);
  26. }
  27. void fill_edges(int civ1[ROWS+2][COLS+2]) {
  28. int i, j;
  29. for (i=1; i<=ROWS; ++i) {
  30. civ1[i][0] = civ1[i][COLS];
  31. civ1[i][COLS+1] = civ1[i][1];
  32. }
  33. for (j=1; j<=COLS; ++j) {
  34. civ1[0][j] = civ1[ROWS][j];
  35. civ1[ROWS+1][j] = civ1[1][j];
  36. }
  37. civ1[0][0] = civ1[ROWS][COLS];
  38. civ1[ROWS+1][COLS+1] = civ1[1][1];
  39. civ1[0][COLS+1] = civ1[ROWS][1];
  40. civ1[ROWS+1][0] = civ1[1][COLS];
  41. }
  42. void update_generation(int old_gen[ROWS+2][COLS+2],
  43. int new_gen[ROWS+2][COLS+2])
  44. {
  45. int i, j, count;
  46. for (i = 1; i <= ROWS; ++i)
  47. {
  48. for (j = 1; j <= COLS; ++j)
  49. {
  50. count = old_gen[i - 1][j - 1] +
  51. old_gen[i - 1][j] +
  52. old_gen[i - 1][j + 1] +
  53. old_gen[i][j - 1] +
  54. old_gen[i][j + 1] +
  55. old_gen[i + 1][j - 1] +
  56. old_gen[i + 1][j] +
  57. old_gen[i + 1][j + 1];
  58. switch(count)
  59. {
  60. case 2:
  61. new_gen[i][j] = old_gen[i][j];
  62. break;
  63. case 3:
  64. new_gen[i][j] = 1;
  65. disp[i-1][j-1].Char.AsciiChar = '*';
  66. break;
  67. default:
  68. new_gen[i][j] = 0;
  69. disp[i-1][j-1].Char.AsciiChar = ' ';
  70. break;
  71. }
  72. }
  73. }
  74. WriteConsoleOutput(console, (CHAR_INFO *)disp, size, src, &dest);
  75. fill_edges(new_gen);
  76. }
  77. void initialize(void)
  78. {
  79. int i, j;
  80. ClrScrn(0x71);
  81. srand(((unsigned int)time(NULL))|1);
  82. for (i = 1; i <= ROWS; ++i)
  83. {
  84. for (j = 1; j <= COLS; ++j)
  85. {
  86. civ1[i][j] = (int)(((__int64)rand()*2)/RAND_MAX);
  87. disp[i-1][j-1].Char.AsciiChar = civ1[i][j] ? '*' : ' ';
  88. disp[i-1][j-1].Attributes = 0x71;
  89. }
  90. }
  91. WriteConsoleOutput(console, (CHAR_INFO *)disp, size, src, &dest);
  92. fill_edges(civ1);
  93. }
  94. int main(int argc, char **argv) {
  95. int i;
  96. if ( argc != 1)
  97. generations = atoi(argv[1]);
  98. console = GetStdHandle(STD_OUTPUT_HANDLE);
  99. initialize();
  100. for (i = 0; i <generations; ++i)
  101. {
  102. update_generation(civ1, civ2);
  103. update_generation(civ2, civ1);
  104. }
  105. return EXIT_SUCCESS;
  106. }

字符串

展开查看全部
pengsaosao

pengsaosao2#

除非你能用一些合理化的方法来证明,否则听起来你选择了链表,因为你以前听过这个名字。
至于屏幕 Flink ,终端不会双缓冲,所以这就是它的方式,直到你使用像ncurses这样的库来移动光标,而不是反复清理屏幕,从头开始。

相关问题