之前写过一个变色贪吃蛇,虽说功能多得很(都已经更新至4.1版本了),但是我后来经过学习意识到这样的一个贪吃蛇实际上并不需要几千行代码,奈何我很懒,懒得在原先的基础上大动刀子。所以我就另起炉灶,用三十行代码写出了一个能玩的,有颜色的贪吃蛇出来。
预览:
工具:VS2013(由于有些函数移植性较差,不保证其他编译器能够运行)
语言:C
源代码:
TCS.c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct S{ int x, y; struct S n, *l; }*h, *e;
int _v[40][25] = { { 1 } }, d[] = { 0, 1, 0, -1 }, o = 0, g, l = 1, L = 3, x = 1, r; HANDLE u;
int f(int i, int j, int k){
for (i = k % 40, j = k % 25, k = 1200; ((i >= 40 ? i = 0, j >= 25 ? j = 0 : j++ : 1), _v[i][j]) && k; i++, k--);
return k ? p(0, i, j, "★"), _v[i][j] = 1 : (o = 1);
}
int m(int dir){
struct S *k = (struct S*)malloc(sizeof(struct S));
k->x = h->x + d[dir], k->y = h->y + d[(dir + 3) % 4], k->n = h, h->l = k, h = k, v(e) = 0, p(e, -1, -1, " ");
if (k->x<0 || k->x>39 || k->y<0 || k->y>24 || v(h) == 2)return p(e, -1, -1, "□"), o = 2, 0;
if ((p(h, -1, -1, "■"), p(h->n, -1, -1, "□"), v(h) == 1) && f(0, 0, rand() % 10000) || x)return v(h) = v(e) = 2, p(e, -1, -1, "□"), 1;
return v(h) = 2, free((e = e->l)->n), (int)(e->n = 0);
}
int main(){
system("color 3e"), SetConsoleScreenBufferSize(u = GetStdHandle(STD_OUTPUT_HANDLE), (COORD){ 80, 25 }), SetConsoleCursorInfo(u, &(CONSOLE_CURSOR_INFO){30, 0});
system("mode con cols=80 lines=25"),h = (struct S*)malloc(sizeof(struct S)), h->x = h->y = 0, h->n = 0, e = h, srand((unsigned)time(NULL)), m(1), m(1), f(0, 0, rand() % 10000);
for (x = 0; !o; Sleep(100))switch (_kbhit() ? (g = _getch()) == 224 ? _getch() : g : 0){
case 119:case 87:case 72:L += m(l != 2 ? l = 0 : l); break; case 100:case 68:case 77:L += m(l != 3 ? l = 1 : l); break;
case 115:case 83:case 80:L += m(l != 0 ? l = 2 : l); break; case 97:case 65:case 75:L += m(l != 1 ? l = 3 : l); break; default:L += m(l);
}
sprintf((char*)_v, "%s,总长 %d 个单位", o - 1 ? "你输了" : "你赢了", L), MessageBox(NULL, TEXT((char*)_v), "游戏结束", 0x1040);
}