Dev-C++ 可直接运行的 C++ 小游戏代码合集
发布时间:2026/9/30 9:37:57来源:尧图网络
1. 先聊清楚为什么用 Dev-C 写小游戏这件事还值得做Dev-C 这个 IDE 有多老用过的人都清楚——最后一次官方更新停留在十几年前界面朴素得像是上个时代的产物。但你要是去搜 C 小游戏代码会发现一个很有意思的现象绝大部分能直接复制、粘贴、一按 F11 就跑起来的小游戏代码都是在 Dev-C 这个环境里验证过的。原因也很简单它自带 MinGW 编译器装完就能用不需要你配环境变量不需要你折腾 CMakeLists甚至不需要联网。对于一个刚摸到cin和cout的初学者来说这种零配置的体验比什么智能提示都值钱。这篇内容我打算干一件事把几个能直接复制进 Dev-C 就能运行的 C 小游戏代码完整摊开讲不只是给你代码还要告诉你每一行为什么这么写、哪些地方新手一定会踩坑、以及怎么把这些代码改成你自己的版本。从最简单的猜数字到需要处理按键和光标定位的控制台贪吃蛇再到带一点点算法味道的井字棋人机对战最后附一个几行就能出效果的动态爱心。每一段代码我都实际跑过参数是调过的不是从别处抄来的半成品。适合谁看如果你刚学完 C 的基本语法知道for、while、数组和函数大概是怎么回事但还没正经写过超过五十行的程序那这篇正好卡在你的水平线上。如果你已经写过一些东西了可以直接跳到第 3 章和第 4 章贪吃蛇和井字棋里的思路对你理解状态机和递归搜索这两个概念是有帮助的。至于完全零基础的朋友建议先把第 2 章的猜数字吃透那个是后面所有代码的地基。还有一点提前说明所谓可直接复制前提是你的 Dev-C 能正常编译。如果你的软件本身有问题——比如新建工程就报错、编译提示找不到iostream——那再好的代码粘进去也是白搭。所以第 6 章我会专门讲编译环境和报错排查那是很多人卡住的真正地方不是代码写错是环境没对。2. 入门第一课猜数字游戏二十行搞懂输入循环2.1 完整代码直接复制就能跑这是我认为最适合作为第一个 C 小游戏的题目。逻辑简单到一句话能说清程序随机想一个数你来猜每次告诉你大了还是小了。但它把 C 里最核心的几件事全用上了——变量、条件判断、循环、随机数、输入输出。#include iostream #include cstdlib #include ctime using namespace std; int main() { srand((unsigned)time(0)); // 用当前时间做随机种子 int secret rand() % 100 1; // 生成 1~100 的随机数 int guess 0; int count 0; // 记录猜了几次 cout 我想好了一个 1 到 100 之间的整数你来猜。 endl; while (true) { cout 请输入你的猜测; if (!(cin guess)) { // 输入的不是数字 cin.clear(); // 清掉错误状态 cin.ignore(10000, \n); // 丢掉这一行剩下的内容 cout 这好像不是个数字重新来。 endl; continue; } count; if (guess secret) { cout 大了。 endl; } else if (guess secret) { cout 小了。 endl; } else { cout 猜对了你一共用了 count 次。 endl; break; } } system(pause); return 0; }复制到 Dev-C 里按 F11 编译运行就能玩。2.2 逐段拆解三个新手最容易忽略的细节第一个细节是随机种子。很多人写rand() % 100 1之后发现每次运行结果都一样问题就出在没调srand()。计算机里的rand()本质是一个固定的递推数列你不给它一个变化的起点它每次都从同一个位置开始算。time(0)返回的是从某个固定时间点到现在经过的秒数每一秒都在变拿它当种子最省事。注意要包含ctime否则 Dev-C 会报time未声明。第二个细节是rand() % 100 1这个式子的范围。rand()返回的是 0 到一个很大数之间的整数对 100 取余得到的是 0 到 99再加 1 就是 1 到 100。这个取余加偏移的写法你必须记牢因为它决定了所有游戏里随机位置的生成方式。后面贪吃蛇的食物坐标、井字棋的先手判断用的都是同一套。第三个细节是输入校验。我特意加了if (!(cin guess))这一段因为这是新手最常翻车的地方。如果你在提示请输入数字的时候手滑打了个字母cin会进入错误状态之后所有的输入操作全部失效程序会陷入死循环疯狂打印大了或者小了。网络上一大半的猜数字代码都没处理这个问题你只要输错一次就得强关窗口。cin.clear()是把错误标志位清掉cin.ignore(10000, \n)是把缓冲区里那行垃圾数据扔掉两个配合才能恢复正常输入。这段代码看着别扭但它是真正区分能跑的代码和玩具代码的地方。2.3 把这段代码改成你自己的版本学完基础别急着走改一改才能真正记住。我给你几个改法从易到难。最简单的改动是调整范围。把100改成1000游戏立刻变难改成10就变成给小孩玩的版本。与之配套的是提示语里的数字和总次数别忘了同步改。进阶一点加一个最多猜 7 次的限制。1 到 100 之间的数用二分法最多 7 次必中所以设定 7 次是个合理难度。做法是把while (true)改成while (count 7)然后在循环结束后判断guess是不是等于secret不是的话就公布答案。这里要注意一件事如果循环因为次数用完而退出guess里存的是最后一次输入值可能正好猜中所以判断顺序得想清楚。再难一点把每局的成绩记录下来。用一个数组存每次猜的次数一局结束后问要不要继续继续就再来一轮退出时把所有成绩打印出来算个平均值。这个改动会把你带到数组 外层循环的组合用法上是后面写贪吃蛇的必要铺垫。我当初就是靠着类似的练习把循环嵌套搞明白的光看教程永远差一口气。3. 进阶一档控制台贪吃蛇把按键、光标和数组串起来3.1 完整代码注意头文件一个都不能少贪吃蛇是控制台游戏的经典题目它比猜数字复杂的地方在于三个新东西实时按键检测、屏幕指定位置输出、用一个数组维护一整条蛇的身体。这三个点吃透了你就能写绝大多数控制台小游戏。#include iostream #include conio.h #include windows.h #include cstdlib #include ctime using namespace std; const int W 30; // 场地宽度 const int H 20; // 场地高度 int sx[600], sy[600]; // 蛇身坐标sx[0]、sy[0] 是蛇头 int len; // 当前蛇长 int fx, fy; // 食物坐标 int dir; // 方向0 上1 下2 左3 右 int score; // 得分 bool over; // 是否结束 // 把光标移到屏幕坐标 (x, y) void gotoxy(int x, int y) { COORD c; c.X (SHORT)x; c.Y (SHORT)y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); } // 画四周的围墙 void drawBorder() { for (int i 0; i W 1; i) { gotoxy(i, 0); cout #; gotoxy(i, H 1); cout #; } for (int i 0; i H 1; i) { gotoxy(0, i); cout #; gotoxy(W 1, i); cout #; } } // 随机放一个食物不能落在蛇身上 void newFood() { while (true) { fx rand() % W 1; fy rand() % H 1; bool ok true; for (int i 0; i len; i) { if (sx[i] fx sy[i] fy) { ok false; break; } } if (ok) return; } } // 初始化整局游戏 void initGame() { len 3; sx[0] 8; sy[0] 10; sx[1] 7; sy[1] 10; sx[2] 6; sy[2] 10; dir 3; score 0; over false; srand((unsigned)time(0)); system(cls); drawBorder(); newFood(); gotoxy(fx, fy); cout *; for (int i 0; i len; i) { gotoxy(sx[i], sy[i]); cout (i 0 ? O : o); } } void showInfo() { gotoxy(1, H 3); cout 得分: score 操作: W A S D 控制方向 ; } int main() { initGame(); showInfo(); while (!over) { // 有按键才处理没按键蛇继续按原方向走 if (kbhit()) { int ch getch(); if ((ch w || ch W) dir ! 1) dir 0; else if ((ch s || ch S) dir ! 0) dir 1; else if ((ch a || ch A) dir ! 3) dir 2; else if ((ch d || ch D) dir ! 2) dir 3; } int tailX sx[len - 1]; int tailY sy[len - 1]; // 身体依次向前挪一格 for (int i len - 1; i 0; i--) { sx[i] sx[i - 1]; sy[i] sy[i - 1]; } // 蛇头按当前方向移动 if (dir 0) sy[0]--; else if (dir 1) sy[0]; else if (dir 2) sx[0]--; else sx[0]; // 撞墙判定 if (sx[0] 1 || sx[0] W || sy[0] 1 || sy[0] H) { over true; break; } // 撞自己判定 for (int i 1; i len; i) { if (sx[0] sx[i] sy[0] sy[i]) { over true; break; } } if (over) break; bool eat (sx[0] fx sy[0] fy); if (eat) { // 吃到食物尾巴原地不动长度加一 sx[len] tailX; sy[len] tailY; len; score 10; newFood(); gotoxy(fx, fy); cout *; } else { // 没吃到把原来的尾巴位置擦掉 gotoxy(tailX, tailY); cout ; } // 重新画整条蛇 for (int i 0; i len; i) { gotoxy(sx[i], sy[i]); cout (i 0 ? O : o); } showInfo(); Sleep(150); // 控制速度数字越大越慢 } gotoxy(1, H 5); cout 游戏结束最终得分: score endl; gotoxy(1, H 6); system(pause); return 0; }3.2kbhit和getch到底差在哪这两个函数都来自conio.h名字看着像双胞胎作用完全不同这是很多人第一次写贪吃蛇时最迷糊的地方。kbhit()的意思是键盘有没有被按过它只是去检查一下缓冲区里有没有等待处理的按键有就返回真没有返回假而且它不会把那个按键取走。getch()则是真正把按键读出来而且它有一个特性——不需要按回车你按下去的那个字符立刻就被读走了。这两点结合起来才有了贪吃蛇的操作手感每一帧先问一句有键吗有的话再把键读出来改方向没的话就让蛇继续按原方向爬。如果用cin ch来读方向你必须敲一次回车才生效而且程序会卡在输入那里不动整个游戏就没法实时运行了。这里还有个小坑getch()读到的方向键上下左右返回的是两个字节第一个是 224第二次才是 72、80、75、77 这样的编码。如果你想用方向键控制而不是 WASD就得连续调两次getch()第一次的那个 224 丢掉第二次才是真正的方向。代码里我用了 WASD就是为了避开这个麻烦对新手友好一些。3.3 光标定位和局部刷新闪烁的根源就在这里gotoxy这个函数是本篇最值钱的一小段代码它干的活是把输出光标直接挪到屏幕的第 x 列、第 y 行接着的cout就从那个位置开始打印。没有它你每次刷新画面都得先system(cls)清屏再重画全部内容屏幕会闪得眼睛疼因为清屏和重画之间有一个短暂的全黑时刻。有了gotoxy之后刷新思路就变成了只改变化了的那几格蛇往前走一格就在新的蛇头位置画个 O把旧的蛇头改成 o再把尾巴那一格用空格擦掉。整个屏幕绝大部分内容纹丝不动看起来就非常平滑。这里面有个容易写错的细节——擦尾巴的时机。如果吃到了食物蛇的长度要增加这时候尾巴不能擦得让尾巴留在原地当成新的身体段如果没吃到尾巴才擦掉。我在代码里用tailX、tailY把移动前的尾巴坐标先存下来就是为了在这个分叉处用。如果直接在移动后去读sx[len-1]拿到的已经是新尾巴了位置就错了。3.4 三个可以直接上手的改造方向代码跑通之后光看不动手是记不住的我建议从这三个方向改每个都不超过十行。第一个是变速。Sleep(150)里的数字就是每帧的等待毫秒数改成 80 蛇就快一倍改成 300 就慢悠悠的。玩到后面蛇变长了可以把Sleep的参数随着score递减做成越玩越快的难度曲线。注意别低于 50 毫秒否则按键响应会跟不上你会觉得操作很粘。第二个是加障碍。在场地中间固定放几堵墙撞上去也算死。做法是额外准备一个二维数组记录哪一格是障碍撞墙判定和画围墙的逻辑各加一段遍历这个数组的循环。这个改动会让你第一次体会到用数组描述地图的思路后面写扫雷、迷宫全靠它。第三个是存最高分。把历史最高分写到一个文本文件里每次开局读出来显示在角落破纪录时覆盖写回。这里要用到fstream是 C 文件操作最基础的练习写惯了控制台输入输出的人第一次碰文件流会有点陌生但语法几乎是照搬的。4. 带点智能的井字棋极小极大算法入门4.1 完整代码电脑会认真跟你下井字棋三连棋的规则简单到不用解释但加上一个人机对战之后它就变成了理解递归搜索这个概念的绝佳载体。下面这份代码里的电脑是真的在算不是随机落子你大概率赢不了它。#include iostream #include cstdlib #include ctime using namespace std; char board[3][3]; const char HUMAN X; const char COMPUTER O; void initBoard() { for (int i 0; i 3; i) for (int j 0; j 3; j) board[i][j] ; } void printBoard() { cout endl; for (int i 0; i 3; i) { cout board[i][0] | board[i][1] | board[i][2] endl; if (i 2) cout --------- endl; } cout endl; } // 返回 X、O 或 无人获胜 char checkWin() { for (int i 0; i 3; i) { if (board[i][0] ! board[i][0] board[i][1] board[i][1] board[i][2]) return board[i][0]; if (board[0][i] ! board[0][i] board[1][i] board[1][i] board[2][i]) return board[0][i]; } if (board[0][0] ! board[0][0] board[1][1] board[1][1] board[2][2]) return board[0][0]; if (board[0][2] ! board[0][2] board[1][1] board[1][1] board[2][0]) return board[0][2]; return ; } bool isFull() { for (int i 0; i 3; i) for (int j 0; j 3; j) if (board[i][j] ) return false; return true; } // 评估当前局面对电脑的价值 int evaluate() { char w checkWin(); if (w COMPUTER) return 1; if (w HUMAN) return -1; return 0; } // 极小极大搜索isComputer 为真表示轮到电脑 int minimax(bool isComputer) { int e evaluate(); if (e ! 0) return e; if (isFull()) return 0; int best isComputer ? -100 : 100; for (int i 0; i 3; i) { for (int j 0; j 3; j) { if (board[i][j] ! ) continue; board[i][j] isComputer ? COMPUTER : HUMAN; int score minimax(!isComputer); board[i][j] ; // 回溯把棋盘恢复原样 if (isComputer) { if (score best) best score; // 电脑要最大 } else { if (score best) best score; // 玩家要最小 } } } return best; } // 电脑选一个最有利的位置落子 void computerMove() { int bestScore -100; int bi -1, bj -1; for (int i 0; i 3; i) { for (int j 0; j 3; j) { if (board[i][j] ! ) continue; board[i][j] COMPUTER; int score minimax(false); board[i][j] ; if (score bestScore) { bestScore score; bi i; bj j; } } } board[bi][bj] COMPUTER; cout 电脑落在第 bi 1 行第 bj 1 列。 endl; } int main() { char again y; srand((unsigned)time(0)); while (again y || again Y) { initBoard(); cout 你是 X电脑是 O。输入行和列都是 1 到 3来落子。 endl; while (true) { printBoard(); int row, col; while (true) { cout 轮到你输入 行 列; if (cin row col row 1 row 3 col 1 col 3 board[row - 1][col - 1] ) { break; } cout 这个位置不能下再试一次。 endl; cin.clear(); cin.ignore(1000, \n); } board[row - 1][col - 1] HUMAN; char w checkWin(); if (w HUMAN) { printBoard(); cout 你赢了。 endl; break; } if (isFull()) { printBoard(); cout 平局。 endl; break; } computerMove(); w checkWin(); if (w COMPUTER) { printBoard(); cout 电脑赢了。 endl; break; } if (isFull()) { printBoard(); cout 平局。 endl; break; } } cout 再来一局(y/n); cin again; } return 0; }4.2 棋盘状态用什么结构存我用了一个三行三列的字符数组board[3][3]空格表示这个位置还能下X 和 O 表示已经落子。看着朴素但这是最直观、最省事的做法。也有人喜欢用vectorvectorchar或者一个长度 9 的一维数组一维数组在递归里传参确实更方便但二维数组的可读性高得多行和列的下标一眼就能对上调试的时候在脑子里画棋盘不会错位。新手阶段能一眼看懂的代码永远比省几行更重要。顺带说一个真实的踩坑经历。我第一版写的时候落子位置的下标忘了减 1玩家输入1 1结果落到了棋盘右下角找了半小时才反应过来。原因是数组下标从 0 开始而给玩家看的编号从 1 开始。这种人机边界上的偏移量差一是新手代码里出现频率最高的错误之一凡是涉及坐标转换的地方都要在脑子里过一遍这个是给人看的还是给机器用的。4.3 minimax 在算的到底是什么这个算法的名字听着唬人本质就一句话我走一步假设对手也会走最好的一步然后我再走一步一直推到分出胜负看看最坏情况下我能拿到什么结果。如果某个走法在对手全力应对下仍然能赢那它就是好棋。代码里的minimax是递归的。轮到电脑的时候它会尝试每一个空格落子然后递归下去问接下来玩家最优能怎样把所有的结果里对电脑最有利的那个挑出来轮到玩家的时候正好相反挑对玩家最有利也就是对电脑最不利的那个。递归一直往下走直到出现有人连成三子或者棋盘满了这时候才返回一个分数电脑赢返回 1玩家赢返回 -1平局返回 0。这里有一行特别关键就是board[i][j] ;。递归进去之前改了棋盘回来之后必须把棋盘还原不然下一次尝试就会基于一个被污染的棋盘去算结果全错。这个动作叫回溯是递归搜索类算法的标配。我第一版写的时候忘了这行电脑的行为变得莫名其妙明明能赢的棋偏偏不下查了半天才发现是棋盘状态没恢复。三乘三的棋盘总共就那么多种局面递归深度最多九层所以这个算法跑起来是瞬间出结果的不需要任何优化。但你要想明白一件事如果棋盘变成五子棋的十五乘十五同样的算法还能算出结果只是可能得等上几分钟到几百年。这时候才轮到剪枝、评估函数这些东西出场。所以井字棋是个非常好的起点它能让你理解算法本身而不被性能问题干扰。5. 附赠一个几行代码画颗动态爱心5.1 那个公式是怎么来的热搜上动态爱心代码出现的频率一直很高我干脆把它也放进来说一下。这类代码的核心是一个数学不等式(x² y² - 1)³ - x²y³ ≤ 0。这个式子描述了一条心形曲线的内部区域落在区域里就打印一个字符落在外面就打空格一行一行扫描下来屏幕上就浮现出一颗心。#include iostream #include cmath #include windows.h using namespace std; int main() { for (float y 1.5f; y -1.5f; y - 0.1f) { for (float x -1.5f; x 1.5f; x 0.05f) { float a x * x y * y - 1; float f a * a * a - x * x * y * y * y; if (f 0.0f) cout *; else cout ; } cout endl; Sleep(80); // 一行一行慢慢出来形成打印的节奏 } system(pause); return 0; }5.2 调参就是调形状这份代码里能调的地方就三个理解它们比记住代码更重要。第一个是y的步长和x的步长。字符不是方块宽高比大约是 1 比 2所以横向步长要取得比纵向小一半左右图形才不会被拉扁。我用的纵向 0.1、横向 0.05 就是这个比例。你要是把横向改成 0.1会得到一颗瘦长的心。第二个是Sleep(80)。它让每一行之间有节奏地出现看起来像是有人在慢慢画。去掉它是一次性全部打印出来视觉上就没那么有意思了。这个数字也别调太小二三十毫秒以下人眼就感觉不到逐行过程了。第三个是字符本身。*是最常见的换成#会更实换成.会更轻甚至可以用两层判断做出渐变效果——靠近边界的点用浅色字符内部的点用密实字符。这就从复制代码进入自己创作的阶段了。6. 编译运行全流程与报错速查6.1 从新建文件到出成品的完整步骤代码复制进去了却跑不起来问题往往出在操作流程上而不是代码本身。我把完整的步骤写一遍。打开 Dev-C依次点文件 - 新建 - 源代码或者直接按 CtrlN。这时候出来的是一个空白编辑区。把代码整段粘进去注意别漏了第一行的#include也别多复制了什么网页上的行号。然后按 F11也就是编译并运行。Dev-C 会弹出一个保存对话框让你先存文件。文件名建议用英文加下划线比如snake.cpp扩展名必须是.cpp而不是.c。这一点很重要因为.c文件会被按 C 语言编译C 里没有iostream这种头文件也没有using namespace std;一编译就是一堆错。保存之后如果一切顺利会弹出一个黑色控制台窗口游戏就跑起来了。如果编译失败Dev-C 底部的编译器标签页会列出报错信息每一行都标着行号和原因。看报错有个诀窍永远只看第一条后面的错误往往是第一条引起的连锁反应。比如你漏了一个分号编译器可能会在下面报十几条错误但真正的问题只有一个。6.2 中文乱码三种情况分清楚Dev-C 里中文出问题的情况太多了但归根结底是三类对号入座就行。第一类是源代码里的中文注释或者字符串在控制台上显示成问号或者方块。这是编码格式不一致造成的。Dev-C 默认用 GBK 存文件如果你的系统控制台是 UTF-8就会乱。解决办法是在工具 - 编译器选项里找编码相关的设置或者干脆把中文提示换成英文。说句实在话练习阶段用英文提示符是最省心的等以后用 Visual Studio 或者 VS Code 的时候再考虑中文字符串的问题。第二类是程序运行到一半突然卡住光标不动了。八成是system(pause)忘了写或者在 Windows 上跑的程序里用了cin等待输入但缓冲区里还有残留。前者加一行system(pause)就能解决后者要按第 2 章讲的那样清理输入缓冲区。第三类是编译时报未定义的引用或者undefined reference。这个和编码没关系通常是函数名拼错了或者调用了没包含头文件的函数。比如用了Sleep却忘了#include windows.h用了rand却忘了#include cstdlib。6.3 常见报错速查表下面这张表是我这些年攒下来的高频报错按报错原文对照着找能省下大量搜索时间。报错关键词大概率原因解决办法iostream: No such file or directory文件存成了.c后缀另存为.cpp文件重新编译rand was not declared缺头文件加上#include cstdlibtime was not declared缺头文件加上#include ctimeSleep was not declared缺头文件加上#include windows.hkbhit was not declared缺头文件或用了新版函数名加上#include conio.hexpected ; before ...上一行漏了分号找到报错行的前一行补上expected declaration before }大括号不配对用编辑器的高亮匹配功能逐个检查undefined reference to xxx函数名拼写错误或未定义核对函数名确认定义在调用之前[Error] ld returned 1 exit status上一个程序还在运行文件被占用关掉还没关闭的控制台窗口再编译程序一闪而过没加暂停结尾加system(pause);最后那条ld returned 1 exit status特别值得说一句。新手看到这个报错会以为代码有问题其实九成情况是你上一次运行的程序窗口还开着编译器没法覆盖那个正在被占用的可执行文件。把那个黑窗口关掉重新编译就好了。我第一次遇到这个错误的时候把代码从头到尾检查了三遍才反应过来白白浪费二十分钟。7. 我踩过的坑和一些个人习惯写得差不多了最后聊几句代码之外的东西这些是文档里不会写、但实际写代码时天天会遇到的经验。关于速度控制Sleep的毫秒数不要凭感觉设。我的习惯是先跑一遍默认值然后根据手感连续调三次找到一个眼睛能跟上但不会觉得慢的数值。这个数值因人而异别人说 150 合适你可能会觉得太快。别怕麻烦多试几次比后期返工强。关于数组开多大贪吃蛇那个sx[600]不是随便写的。场地是 30 乘 20一共 600 格蛇最长也不可能超过这个数所以开 600 是安全的。新手常犯的错是把数组开成int sx[100]结果蛇长到一百多的时候程序崩溃或者行为诡异。开数组的时候脑子里要过一遍这个容器的上限是多少而不是随手写个看起来够大的数字。真要越界了C 不会给你任何提示它只会默默地去写不属于你的内存然后在某个毫不相关的地方爆掉这种 bug 最难查。关于随机数我在多个游戏里都用了srand((unsigned)time(0))。注意这一句在一整个程序里只需要调用一次放在main开头就行。如果你把它放在循环里由于time(0)的精度是秒同一秒内多次调用会得到相同的种子随机数就不随机了。这个坑我在写抽奖程序的时候踩过明明是随机抽取结果连续几次结果一模一样查了很久才发现是种子的位置放错了。关于调试方法控制台程序最容易用的手段就是打印中间值。不知道蛇的坐标为什么不对就在移动前后各打印一次蛇头坐标不知道递归为什么算错就在每一层打印当前棋盘。这听起来很土但在没有断点调试习惯的阶段它是效率最高的办法。Dev-C 其实自带调试器按 F5 可以逐步执行但刚开始用的人容易被各种窗口弄晕先用打印大法把逻辑理顺再去学断点调试会更顺。关于代码风格哪怕是自己写着玩的代码也尽量把每一段的功能用注释标出来。我见过太多人写完一个游戏过两周想加个功能打开文件发现自己完全看不懂当初写了什么。变量名也别用a、b、c用speed、score、direction这种一眼就知道含义的名字多敲几个字母花不了多少时间。最后说个心态上的事。这几个游戏代码你第一次运行成功的时候会觉得挺有成就感但很快就会发现它们都很粗糙——没有开始菜单没有难度选择死了也不能重开。这是正常的因为它们本来就是用来练手的骨架。真正有价值的不是这几个成品而是你在改它们的过程中积累起来的那些判断力知道什么该用数组、什么该用循环、什么时候该把一段逻辑抽成函数。等你把这些骨架改到自己满意的时候你其实已经能写点像样的东西了。
网站建设高端定制企业官网