鱼C论坛

 找回密码
 立即注册
查看: 34|回复: 1

贪吃蛇代码

[复制链接]
发表于 昨天 14:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MC.Steve 于 2026-2-10 14:54 编辑

今天的主题是:贪吃蛇!(加强版明天发布)(不定期会出python的游戏)

贪吃蛇的程序语言:C语言C++

保证鱼油能够在C语言、C++中玩到贪吃蛇

C语言:
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <windows.h>
  4. #include <stdlib.h>

  5. #define WIDTH 20
  6. #define HEIGHT 15

  7. int x, y, fruitX, fruitY, score;
  8. int tailX[100], tailY[100];
  9. int nTail;
  10. enum eDirection { STOP, LEFT, RIGHT, UP, DOWN };
  11. enum eDirection dir;

  12. void Setup() {
  13.     dir = STOP;
  14.     x = WIDTH / 2;
  15.     y = HEIGHT / 2;
  16.     fruitX = rand() % WIDTH;
  17.     fruitY = rand() % HEIGHT;
  18.     score = 0;
  19.     nTail = 0;
  20. }

  21. void Draw() {
  22.     system("cls");
  23.     for (int i = 0; i < WIDTH + 2; i++) printf("#");
  24.     printf("\n");

  25.     for (int i = 0; i < HEIGHT; i++) {
  26.         for (int j = 0; j < WIDTH; j++) {
  27.             if (j == 0) printf("#");
  28.             if (i == y && j == x) printf("O");
  29.             else if (i == fruitY && j == fruitX) printf("F");
  30.             else {
  31.                 int print = 0;
  32.                 for (int k = 0; k < nTail; k++) {
  33.                     if (tailX[k] == j && tailY[k] == i) {
  34.                         printf("o");
  35.                         print = 1;
  36.                     }
  37.                 }
  38.                 if (!print) printf(" ");
  39.             }
  40.             if (j == WIDTH - 1) printf("#");
  41.         }
  42.         printf("\n");
  43.     }

  44.     for (int i = 0; i < WIDTH + 2; i++) printf("#");
  45.     printf("\nScore:%d", score);
  46. }

  47. void Input() {
  48.     if (_kbhit()) {
  49.         switch (_getch()) {
  50.             case 'a': dir = LEFT; break;
  51.             case 'd': dir = RIGHT; break;
  52.             case 'w': dir = UP; break;
  53.             case 's': dir = DOWN; break;
  54.             case 'x': dir = STOP; break;
  55.         }
  56.     }
  57. }

  58. void Logic() {
  59.     int prevX = tailX[0];
  60.     int prevY = tailY[0];
  61.     int prev2X, prev2Y;
  62.     tailX[0] = x;
  63.     tailY[0] = y;

  64.     for (int i = 1; i < nTail; i++) {
  65.         prev2X = tailX[i];
  66.         prev2Y = tailY[i];
  67.         tailX[i] = prevX;
  68.         tailY[i] = prevY;
  69.         prevX = prev2X;
  70.         prevY = prev2Y;
  71.     }

  72.     switch (dir) {
  73.         case LEFT: x--; break;
  74.         case RIGHT: x++; break;
  75.         case UP: y--; break;
  76.         case DOWN: y++; break;
  77.     }

  78.     if (x >= WIDTH) x = 0; else if (x < 0) x = WIDTH - 1;
  79.     if (y >= HEIGHT) y = 0; else if (y < 0) y = HEIGHT - 1;

  80.     for (int i = 0; i < nTail; i++)
  81.         if (tailX[i] == x && tailY[i] == y)
  82.             dir = STOP;

  83.     if (x == fruitX && y == fruitY) {
  84.         score += 10;
  85.         nTail++;
  86.         fruitX = rand() % WIDTH;
  87.         fruitY = rand() % HEIGHT;
  88.     }
  89. }

  90. int main() {
  91.     Setup();
  92.     while (dir != STOP) {
  93.         Draw();
  94.         Input();
  95.         Logic();
  96.         Sleep(100); // 控制速度
  97.     }
  98.     return 0;
  99. }
复制代码


C++:
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <unistd.h> // for sleep

  6. #ifdef _WIN32
  7. #include <conio.h>
  8. #else
  9. #include <ncurses.h>
  10. #endif

  11. const int WIDTH = 20, HEIGHT = 15;

  12. struct Point { int x, y; };

  13. int main() {
  14.     #ifndef _WIN32
  15.     initscr();
  16.     cbreak();
  17.     noecho();
  18.     keypad(stdscr, TRUE);
  19.     nodelay(stdscr, TRUE);
  20.     #endif

  21.     srand(time(0));
  22.     Point snake[100] = {{WIDTH/2, HEIGHT/2}};
  23.     int n = 1;
  24.     Point fruit = {rand() % WIDTH, rand() % HEIGHT};
  25.     int dx = 1, dy = 0; // 初始向右
  26.     int score = 0;

  27.     while (true) {
  28.         // 绘制
  29.         #ifndef _WIN32
  30.         clear();
  31.         #else
  32.         system("cls");
  33.         #endif

  34.         for (int i = 0; i < WIDTH + 2; i++) std::cout << "#";
  35.         std::cout << "\n";

  36.         for (int y = 0; y < HEIGHT; y++) {
  37.             std::cout << "#";
  38.             for (int x = 0; x < WIDTH; x++) {
  39.                 bool isBody = false;
  40.                 for (int i = 1; i < n; i++)
  41.                     if (snake[i].x == x && snake[i].y == y)
  42.                         { std::cout << "o"; isBody = true; }
  43.                 if (!isBody) {
  44.                     if (snake[0].x == x && snake[0].y == y) std::cout << "O";
  45.                     else if (fruit.x == x && fruit.y == y) std::cout << "F";
  46.                     else std::cout << " ";
  47.                 }
  48.             }
  49.             std::cout << "#\n";
  50.         }

  51.         for (int i = 0; i < WIDTH + 2; i++) std::cout << "#";
  52.         std::cout << "\nScore: " << score;

  53.         // 输入处理
  54.         #ifdef _WIN32
  55.         if (_kbhit()) {
  56.             switch (_getch()) {
  57.                 case 'a': dx = -1; dy = 0; break;
  58.                 case 'd': dx = 1; dy = 0; break;
  59.                 case 'w': dx = 0; dy = -1; break;
  60.                 case 's': dx = 0; dy = 1; break;
  61.             }
  62.         }
  63.         #else
  64.         int ch = getch();
  65.         switch (ch) {
  66.             case KEY_LEFT: dx = -1; dy = 0; break;
  67.             case KEY_RIGHT: dx = 1; dy = 0; break;
  68.             case KEY_UP: dx = 0; dy = -1; break;
  69.             case KEY_DOWN: dx = 0; dy = 1; break;
  70.         }
  71.         #endif

  72.         // 逻辑更新
  73.         for (int i = n - 1; i > 0; i--)
  74.             snake[i] = snake[i - 1];
  75.         
  76.         snake[0].x = (snake[0].x + dx + WIDTH) % WIDTH;
  77.         snake[0].y = (snake[0].y + dy + HEIGHT) % HEIGHT;

  78.         // 检测碰撞
  79.         for (int i = 1; i < n; i++)
  80.             if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)
  81.                 goto game_over;

  82.         // 吃食物
  83.         if (snake[0].x == fruit.x && snake[0].y == fruit.y) {
  84.             n++;
  85.             score += 10;
  86.             fruit = {rand() % WIDTH, rand() % HEIGHT};
  87.         }

  88.         usleep(100000); // 100ms
  89.     }

  90. game_over:
  91.     #ifndef _WIN32
  92.     endwin();
  93.     #endif
  94.     std::cout << "\nGame Over! Final Score: " << score << std::endl;
  95.     return 0;
  96. }
复制代码


游客,本帖隐藏的内容需要积分高于 20 才可浏览,您当前积分为 0
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 14:32 | 显示全部楼层
以下为C语言和C++的贪吃蛇基础版代码,代码已修正蛇身存储问题,确保可以正确运行。两个版本都使用了简单的控制台图形,通过键盘WASD控制方向,X键退出游戏。

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <windows.h>
  4. #include <stdlib.h>

  5. #define WIDTH 20
  6. #define HEIGHT 15

  7. int x, y, fruitX, fruitY, score;
  8. int tailX[100], tailY[100];
  9. int nTail;
  10. enum eDirection { STOP, LEFT, RIGHT, UP, DOWN };
  11. enum eDirection dir;

  12. void Setup() {
  13.     dir = STOP;
  14.     x = WIDTH / 2;
  15.     y = HEIGHT / 2;
  16.     fruitX = rand() % WIDTH;
  17.     fruitY = rand() % HEIGHT;
  18.     score = 0;
  19.     nTail = 0;
  20. }

  21. void Draw() {
  22.     system("cls");
  23.     for (int i = 0; i < WIDTH + 2; i++) printf("#");
  24.     printf("\n");

  25.     for (int i = 0; i < HEIGHT; i++) {
  26.         for (int j = 0; j < WIDTH; j++) {
  27.             if (j == 0) printf("#");
  28.             if (i == y && j == x) printf("O");
  29.             else if (i == fruitY && j == fruitX) printf("F");
  30.             else {
  31.                 int print = 0;
  32.                 for (int k = 0; k < nTail; k++) {
  33.                     if (tailX[k] == j && tailY[k] == i) {
  34.                         printf("o");
  35.                         print = 1;
  36.                     }
  37.                 }
  38.                 if (!print) printf(" ");
  39.             }
  40.             if (j == WIDTH - 1) printf("#");
  41.         }
  42.         printf("\n");
  43.     }

  44.     for (int i = 0; i < WIDTH + 2; i++) printf("#");
  45.     printf("\nScore:%d", score);
  46. }

  47. void Input() {
  48.     if (_kbhit()) {
  49.         switch (_getch()) {
  50.             case 'a': dir = LEFT; break;
  51.             case 'd': dir = RIGHT; break;
  52.             case 'w': dir = UP; break;
  53.             case 's': dir = DOWN; break;
  54.             case 'x': dir = STOP; break;
  55.         }
  56.     }
  57. }

  58. void Logic() {
  59.     int prevX = tailX[0];
  60.     int prevY = tailY[0];
  61.     int prev2X, prev2Y;
  62.     tailX[0] = x;
  63.     tailY[0] = y;

  64.     for (int i = 1; i < nTail; i++) {
  65.         prev2X = tailX[i];
  66.         prev2Y = tailY[i];
  67.         tailX[i] = prevX;
  68.         tailY[i] = prevY;
  69.         prevX = prev2X;
  70.         prevY = prev2Y;
  71.     }

  72.     switch (dir) {
  73.         case LEFT: x--; break;
  74.         case RIGHT: x++; break;
  75.         case UP: y--; break;
  76.         case DOWN: y++; break;
  77.     }

  78.     if (x >= WIDTH) x = 0; else if (x < 0) x = WIDTH - 1;
  79.     if (y >= HEIGHT) y = 0; else if (y < 0) y = HEIGHT - 1;

  80.     for (int i = 0; i < nTail; i++)
  81.         if (tailX[i] == x && tailY[i] == y)
  82.             dir = STOP;

  83.     if (x == fruitX && y == fruitY) {
  84.         score += 10;
  85.         nTail++;
  86.         fruitX = rand() % WIDTH;
  87.         fruitY = rand() % HEIGHT;
  88.     }
  89. }

  90. int main() {
  91.     Setup();
  92.     while (dir != STOP) {
  93.         Draw();
  94.         Input();
  95.         Logic();
  96.         Sleep(100);
  97.     }
  98.     return 0;
  99. }
复制代码


C++版本(使用cout等C++特性):

  1. #include <iostream>
  2. #include <conio.h>
  3. #include <windows.h>
  4. #include <cstdlib>
  5. using namespace std;

  6. const int WIDTH = 20;
  7. const int HEIGHT = 15;

  8. int x, y, fruitX, fruitY, score;
  9. int tailX[100], tailY[100];
  10. int nTail;
  11. enum eDirection { STOP, LEFT, RIGHT, UP, DOWN };
  12. eDirection dir;

  13. void Setup() {
  14.     dir = STOP;
  15.     x = WIDTH / 2;
  16.     y = HEIGHT / 2;
  17.     fruitX = rand() % WIDTH;
  18.     fruitY = rand() % HEIGHT;
  19.     score = 0;
  20.     nTail = 0;
  21. }

  22. void Draw() {
  23.     system("cls");
  24.     for (int i = 0; i < WIDTH + 2; i++) cout << "#";
  25.     cout << endl;

  26.     for (int i = 0; i < HEIGHT; i++) {
  27.         for (int j = 0; j < WIDTH; j++) {
  28.             if (j == 0) cout << "#";
  29.             if (i == y && j == x) cout << "O";
  30.             else if (i == fruitY && j == fruitX) cout << "F";
  31.             else {
  32.                 bool print = false;
  33.                 for (int k = 0; k < nTail; k++) {
  34.                     if (tailX[k] == j && tailY[k] == i) {
  35.                         cout << "o";
  36.                         print = true;
  37.                     }
  38.                 }
  39.                 if (!print) cout << " ";
  40.             }
  41.             if (j == WIDTH - 1) cout << "#";
  42.         }
  43.         cout << endl;
  44.     }

  45.     for (int i = 0; i < WIDTH + 2; i++) cout << "#";
  46.     cout << endl << "Score:" << score << endl;
  47. }

  48. void Input() {
  49.     if (_kbhit()) {
  50.         switch (_getch()) {
  51.             case 'a': dir = LEFT; break;
  52.             case 'd': dir = RIGHT; break;
  53.             case 'w': dir = UP; break;
  54.             case 's': dir = DOWN; break;
  55.             case 'x': dir = STOP; break;
  56.         }
  57.     }
  58. }

  59. void Logic() {
  60.     int prevX = tailX[0];
  61.     int prevY = tailY[0];
  62.     int prev2X, prev2Y;
  63.     tailX[0] = x;
  64.     tailY[0] = y;

  65.     for (int i = 1; i < nTail; i++) {
  66.         prev2X = tailX[i];
  67.         prev2Y = tailY[i];
  68.         tailX[i] = prevX;
  69.         tailY[i] = prevY;
  70.         prevX = prev2X;
  71.         prevY = prev2Y;
  72.     }

  73.     switch (dir) {
  74.         case LEFT: x--; break;
  75.         case RIGHT: x++; break;
  76.         case UP: y--; break;
  77.         case DOWN: y++; break;
  78.     }

  79.     if (x >= WIDTH) x = 0; else if (x < 0) x = WIDTH - 1;
  80.     if (y >= HEIGHT) y = 0; else if (y < 0) y = HEIGHT - 1;

  81.     for (int i = 0; i < nTail; i++)
  82.         if (tailX[i] == x && tailY[i] == y)
  83.             dir = STOP;

  84.     if (x == fruitX && y == fruitY) {
  85.         score += 10;
  86.         nTail++;
  87.         fruitX = rand() % WIDTH;
  88.         fruitY = rand() % HEIGHT;
  89.     }
  90. }

  91. int main() {
  92.     Setup();
  93.     while (dir != STOP) {
  94.         Draw();
  95.         Input();
  96.         Logic();
  97.         Sleep(100);
  98.     }
  99.     return 0;
  100. }
复制代码


说明:
- 游戏界面宽度 WIDTH 和高度 HEIGHT 可修改。
- 蛇头用 O 表示,食物用 F 表示,蛇身用 o 表示。
- 通过 Sleep(100) 控制游戏速度,数值越大速度越慢。
- 注意:代码使用了 Windows 特有的头文件(如 windows.h 和 conio.h),如果在其他系统编译,可能需要替换相关函数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-11 08:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表