一、实现效果
键位:使用wasd四个键位来控制方向,按q键退出(注意在终用英文输入法实现键控)
规则:蛇每吃一个豆会得10分,同时身体边长、移速加快
当蛇碰到墙壁或咬到自身时游戏结束,同时会输出游戏得分
二、部分代码解释
(1)用结构体定义蛇和豆
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
typedef struct Snakes { int x; int y; struct Snakes *next; }snake; snake *head,*tail; struct Food { int x; int y; }food; |
(2)打印墙壁
1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
void creatgraph() { int i; for (i = 0; i<58; i += 2) //打印上下边框 { gotoprint(i, 0); gotoprint(i, 26); } for (i = 1; i < 26; i++) { gotoprint(0, i); gotoprint(56, i); } head = (snake*) malloc ( sizeof (snake)); head->x = 16; head->y = 15; //gotoprint(head->x, head->y); tail = (snake*) malloc ( sizeof (snake)); snake *p = (snake*) malloc ( sizeof (snake)); snake *q = (snake*) malloc ( sizeof (snake)); p->x = 16; p->y = 16; q->x = 16; q->y = 17; head->next = p; p->next = q; q->next = tail; //gotoprint(p->x, p->y); //gotoprint(q->x, q->y); tail->next = NULL; tail->x = 4; tail->y = 2; } void gotoxy( int x, int y) { COORD pos; HANDLE hOutput; pos.X = x; pos.Y = y; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, pos); } void gotoprint( int x, int y) { gotoxy(x, y); printf ( "■" ); } void gotodelete( int x, int y) { gotoxy(x, y); printf ( " " ); } |
(3)生成豆
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void creatfood() { srand (( int ) time (NULL)); lable: food.y = rand () % (25 - 1 + 1) + 1; food.x = rand () % (54 - 2 + 1) + 2; if (food.x % 2 != 0) { food.x = food.x+1; } snake *judge = head; while (1) { if (judge->next == NULL) break ; if (food.x == judge->x&&food.y == judge->y) { goto lable; } judge = judge->next; } gotoxy(food.x, food.y); printf ( "⊙" ); } |
(4)点击控制函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
int ClickControl() { char c; while (1) { if (Judge()==0) return 0; if (_kbhit()) { click = _getch(); } MovingBody(); Eating(); } return 1; } |
(5)移动控制
1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
void MovingBody() { int count = 0; int a = head->x, b = head->y; snake *p = head; while (1) { if (p->next == NULL) break ; gotodelete(p->x, p->y); count++; p = p->next; } switch (click) { case up: head->y -= 1; ChangeBody(a,b); break ; case down: head->y += 1; ChangeBody(a,b); break ; case left: head->x -= 2; ChangeBody(a,b); break ; case right: head->x += 2; ChangeBody(a,b); break ; case stop: _getch(); break ; } p = head; while (1) { if (p->next == NULL) break ; gotoprint(p->x, p->y); p = p->next; } p = head; gotoxy(0, 28); if (count <= 10) speed = 150; else if (count > 10 && count <= 20) speed = 100; else if (count > 20 && count <= 40) speed = 50; else speed = 10; Sleep(speed); } |
(6)更改蛇身
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
void ChangeBody( int a, int b) { snake *p = head->next; int mid1, mid2,_mid1,_mid2; mid1 = p->x; mid2 = p->y; while (1) { if (p->next->next == NULL) break ; _mid1 = p->next->x; _mid2 = p->next->y; p->next->x = mid1; p->next->y = mid2; mid1 = _mid1; mid2 = _mid2; p = p->next; } p = head->next; { p->x = a; p->y = b; } } |
总结
到此这篇关于C语言实现贪吃蛇游戏代码的文章就介绍到这了,更多相关C语言贪吃蛇游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/z_9999999/article/details/122796455