服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现贪吃蛇游戏实例代码

C语言实现贪吃蛇游戏实例代码

2022-09-08 16:15鸿蒙之始 C/C++

大家好,本篇文章主要讲的是C语言实现贪吃蛇游戏实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、实现效果

键位:使用wasd四个键位来控制方向,按q键退出(注意在终用英文输入法实现键控)

规则:蛇每吃一个豆会得10分,同时身体边长、移速加快

当蛇碰到墙壁或咬到自身时游戏结束,同时会输出游戏得分

C语言实现贪吃蛇游戏实例代码

C语言实现贪吃蛇游戏实例代码

二、部分代码解释

(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

延伸 · 阅读

精彩推荐
  • C/C++共用体的定义与应用详细解析

    共用体的定义与应用详细解析

    共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量...

    C语言教程网2902020-12-24
  • C/C++C++中读写txt文件并分离字符的方法

    C++中读写txt文件并分离字符的方法

    今天小编就为大家分享一篇C++中读写txt文件并分离字符的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    菜鸟程序猿05722021-06-28
  • C/C++C++特殊成员详解

    C++特殊成员详解

    这篇文章主要为大家介绍了C++特殊成员,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助...

    why are you so serious8482022-03-02
  • C/C++异步http listener 完全并发处理惩罚http恳求的小例子

    异步http listener 完全并发处理惩罚http恳求的小例子

    异步http listener 完全并发处理惩罚http恳求的小例子,需要的朋友可以参考一下...

    C语言教程网4192020-12-06
  • C/C++基于Matlab实现BP神经网络交通标志识别

    基于Matlab实现BP神经网络交通标志识别

    道路交通标志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生。...

    紫极神光6342022-08-08
  • C/C++C语言实现餐饮管理与点餐系统

    C语言实现餐饮管理与点餐系统

    这篇文章主要为大家详细介绍了C语言实现餐饮管理与点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    子奕°7752021-10-20
  • C/C++C++设计模式之备忘录模式(Memento)

    C++设计模式之备忘录模式(Memento)

    这篇文章主要为大家详细介绍了C++设计模式之备忘录模式Memento的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    chencarl9262021-06-23
  • C/C++教你分辨C++堆与栈的区别

    教你分辨C++堆与栈的区别

    堆与栈的区别有:1、栈由系统自动分配,而堆是人为申请开辟;2、栈获得的空间较小,而堆获得的空间较大;3、栈由系统自动分配,速度较快,而堆一般...

    恋喵大鲤鱼11212021-11-17