如何在Visual Studio中将C++贪吃蛇代码生成可运行exe文件
解决Visual Studio社区版生成exe recipe而非可执行文件的问题
问题
使用Visual Studio社区版编写C++贪吃蛇游戏,尝试生成可执行exe文件时,得到的是exe recipe文件,无法正常运行。游戏代码如下:
#include<stdio.h> #include<Windows.h> #include<stdbool.h> #include<time.h> #include<conio.h> #include<iostream> bool gameover; const int height = 15; const int width = 80; int x, y, fruitX, fruitY, score=0; enum eDirection { STOP = 0, UP, DOWN, LEFT, RIGHT }; eDirection dir; int tailx[100], taily[100], ctail = 0; void setup() { gameover = false; x = width / 2; y = height / 2; srand(time(0)); fruitX = rand() % width + 1; fruitY = rand() % height; } void board() { system("CLS"); for (int i = 0; i < width; i++) { printf("#"); } for (int i = 0; i < height; i++) { printf("\n"); for (int j = 0; j < width; j++) { if (j == 0 || j == width - 1) printf("#"); else { if (i == fruitY && j == fruitX) printf("f"); else if (i == y && j == x) printf("o"); else { bool print = false; for (int k = 0; k < ctail; k++) { if (i == taily[k] && j == tailx[k]) { printf("o"); print = true; } } if (!print) printf(" "); } } } } printf("\n"); for (int i = 0; i < width; i++) { printf("#"); } printf("\n x is %d y is %d", fruitX, fruitY); printf("\n\n the score is %d\n\n",score); } void input() { if(_kbhit()) switch (_getch()) { case 'w':dir = UP; break; case 's':dir = DOWN; break; case 'a':dir = LEFT; break; case 'd':dir = RIGHT; break; default:break; } } void logic() { int prevx = tailx[0]; int prevy = taily[0]; tailx[0] = x; taily[0] = y; int prev2x, prev2y; for (int i = 1; i < ctail; i++) { prev2x = tailx[i]; prev2y = taily[i]; tailx[i] = prevx; taily[i] = prevy; prevx = prev2x; prevy = prev2y; } switch (dir) { case UP:y--; break; case DOWN:y++; break; case LEFT:x--; break; case RIGHT:x++; break; default:break; } if (x<0 || x>width ) gameover = true; if (y<0-1 || y>height) gameover = true; for (int i = 0; i < ctail; i++) { if (x == tailx[i] && y == taily[i]) gameover = true; } if (x == fruitX && y == fruitY) { score += 10; fruitX = rand() % (width-1) + 1; fruitY = rand() % height; ctail++; } } int main() { setup(); while (!gameover) { board(); input(); logic(); Sleep(5); } return 0; }
解决方案
1. 确认项目类型
确保创建的是控制台应用(Windows)或控制台应用(.NET Framework),而非CMake项目或其他类型。CMake项目会生成recipe文件而非直接生成exe,建议新建常规控制台项目后重新添加代码。
2. 调整生成配置
- 顶部工具栏选择Debug或Release模式,不要选择
CMakeLists.txt等非生成选项。 - 右键项目 → 属性 → 配置属性 → 常规,确认平台工具集为当前VS版本对应的工具集(比如VS2022对应v143),避免工具集不匹配导致生成异常。
- 右键项目 → 重新生成(或按
Ctrl+Shift+B),不要仅编译单个文件,确保完整生成整个项目。
3. 检查输出路径与权限
右键项目 → 属性 → 配置属性 → 链接器 → 输出文件,确认输出路径合法且当前用户有写入权限。生成完成后,前往对应路径(通常为项目根目录/x64/Debug/项目名.exe)找到可执行文件运行。
代码优化建议
原代码存在几个影响体验的小问题,修正后可正常运行:
setup()函数中添加dir = STOP;,避免游戏一开始蛇自动移动。- 将
Sleep(5)改为Sleep(100),降低蛇的移动速度,提升操作体验。 - 修正边界判断:
if (x<=0 || x>=width-1)、if (y<0 || y>=height),避免蛇提前触发游戏结束。
修正后的关键代码片段:
void setup() { gameover = false; dir = STOP; // 初始方向设为停止 x = width / 2; y = height / 2; srand(time(0)); fruitX = rand() % (width-2) + 1; // 水果不超出边界 fruitY = rand() % (height-1); } int main() { setup(); while (!gameover) { board(); input(); logic(); Sleep(100); // 调整移动速度 } printf("Game Over! Final Score: %d\n", score); // 新增游戏结束提示 return 0; }
内容的提问来源于stack exchange,提问作者artur anikin
相关产品推荐
相关产品推荐

