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

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

服务器之家 - 编程语言 - C/C++ - 基于C语言实现贪吃蛇小游戏

基于C语言实现贪吃蛇小游戏

2022-11-02 11:52summery456 C/C++

这篇文章主要为大家详细介绍了基于C语言实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下

1.目标要求:

1.上下左右控制蛇头转向
2.若蛇头碰到食物,长度加一
3.若蛇头碰到边框、碰到自身或蛇回头,游戏结束

2.C语言代码:

?
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
 
#define interface_x 19//画布行数
#define interface_y 60//画布列数 
 
/*
         《贪吃蛇》    by:你最珍贵
 
     --------------------------------------- 
    |控制信号: | 向上 | 向下 | 向左 | 向右 |
     --------------------------------------- 
    |    键盘: |  'i' |  'k' |  'j' |  'l' | 
     --------------------------------------- 
     
     1.上下左右控制蛇头转向  
     2.若蛇头碰到食物,长度加一 
     3.若蛇头碰到边框或自身,游戏结束 
 
*/
 
void HideCursor(){    //隐藏光标位置 ,这个函数复制代码就行 
    CONSOLE_CURSOR_INFO cursor_info={1,0}; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void gotoxy(int x,int y){    //把光标放在(0,0)位置 ,这个函数复制代码就行
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
 
int IsEnd;//是否结束 
int canvas[interface_x+1][interface_y+1]={0};//画布行数、列数 
int scores;//分数 
int slow_v,slow_v_num;//移动变慢的值(越大速度越慢),移动变慢的变量
int food_x,food_y;//实物位置 
int snakeH_x,snakeH_y;//蛇头位置 
int snake_direction; //蛇的方向 
 
void startup(){    //【数据初始化】 
    int i,j; 
    HideCursor();//不显示光标 
    IsEnd = 0; 
    scores=0;    
    slow_v=2;
    slow_v_num=1; 
    for(i=1;i<=interface_x;i++){//设置边框 
        canvas[i][1]=-1;
        canvas[i][interface_y]=-1;
    
    for(i=1;i<=interface_y;i++){//设置边框 
        canvas[1][i]=-1;
        canvas[interface_x][i]=-1;
    }
    food_x=rand()%(interface_x-2)+2;//设置食物位置 
    food_y=rand()%(interface_y-2)+2;
    canvas[food_x][food_y]=-2;//设置食物 
    snakeH_x=(interface_x/2);//设置蛇头位置 
    snakeH_y=3;
    canvas[snakeH_x][snakeH_y]=1;//设置蛇头 
    snake_direction=4;
}
void show_begin(){//【初始页面展示】 
    int i,j;
    int start=0;
    char input;
     while(!start){
         gotoxy(0,0);//每次输出页面把鼠标放回(0,0) 
         for(i=1;i<=24/2-4;i++) printf("\n"); 
        for(i=1;i<80/2-5;i++) printf(" ");
        printf("《贪吃蛇》\n\n"); 
        for(i=1;i<80/2-9;i++) printf(" ");
        printf("请按任意键开始游戏\n\n");
        for(i=1;i<=24/2-6;i++) printf("\n");
        if(kbhit()){
            input = getch();
            if(input) start=1;
        }
    }
void show(){    //【显示画面】 
    gotoxy(0,0);//每次输出页面把鼠标放回(0,0) 
    int i,j,k;    
    for(i=1;i<=(80-interface_y)/2+interface_y/2-10;i++) printf(" ");
    printf("《贪吃蛇》") ;
    for(i=1;i<=interface_y/2-8-8;i++) printf(" ");
    printf("分数:%3d\n",scores);
    for(i=1;i<=interface_x;i++){
        for(k=1;k<=(80-interface_y)/2;k++) printf(" ");//使屏幕对称加的空格 
        for(j=1;j<=interface_y;j++){            
            if(canvas[i][j]==-1){//值为-1输出边框# 
                printf("#");
            }else if(canvas[i][j]==-2){//值为-2输出实物M 
                printf("M");
            }else if(canvas[i][j]==1){//值为1输出蛇头@ 
                printf("@");
            }else if(canvas[i][j]>1){//值>1输出蛇尾* 
                printf("*");
            }else printf(" ");//值为0输出空白 
        }
        printf("\n");
    }
    
}
void move_snake(){
    int i,j;
    int max=0;//最大值 
    int max_x,max_y;//最大值位置
    for(i=2;i<=interface_x-1;i++){
        for(j=2;j<=interface_y-1;j++){
            if(canvas[i][j]>max){//寻找最大值 
                max=canvas[i][j];
                max_x=i;max_y=j;
            }
            if(canvas[i][j]>0){//把蛇头蛇尾每一个值加1 
                canvas[i][j]++;
            }             
        }
    }
    if(snake_direction==1){//上 
        snakeH_x--; 
    }else if(snake_direction==2){//下 
        snakeH_x++; 
    }else if(snake_direction==3){//左 
        snakeH_y--; 
    }else if(snake_direction==4){//右 
        snakeH_y++; 
    }     
    if(canvas[snakeH_x][snakeH_y]==-1||canvas[snakeH_x][snakeH_y]>1){
        exit(1);//碰到边界或自身,游戏结束 
    }else if(canvas[snakeH_x][snakeH_y]==-2){//吃到食物 
        canvas[snakeH_x][snakeH_y]=1;//添加新蛇头 
        food_x=rand()%(interface_x-2)+2;//设置新食物位置 
        food_y=rand()%(interface_y-2)+2;
        canvas[food_x][food_y]=-2;
        printf("\a") ;
        scores++;
    }else{//什么都没有碰到则移动 
        canvas[snakeH_x][snakeH_y]=1;//添加新蛇头 
        canvas[max_x][max_y]=0;//去掉蛇尾 
    
}
void update_outinput(){    //【与输入无关的更新】 
    int i;
    slow_v_num=(slow_v_num==slow_v)? 1:slow_v_num+1;
    if(slow_v_num==slow_v){//每隔slow_v次运行一次        
        move_snake(); 
    
    
}
void update_input(){//【与输入有关的更新】 
    char input;
    if(kbhit()){
        input = getch();
        if(input=='i'){//上 
            if(snake_direction==1){//如果输入与原来方向一致是加速功能,否则为转向 
                move_snake();//加速 
            }else snake_direction=1;//转向 
        }else if(input=='k'){//下 
            if(snake_direction==2){
                move_snake();
            }else snake_direction=2;
        }else if(input=='j'){//左 
            if(snake_direction==3){
                move_snake();
            }else snake_direction=3;
        }else if(input=='l'){//右 
            if(snake_direction==4){
                move_snake();
            }snake_direction=4;
        }    
    }
}
void show_end(){//【显示失败界面】 
    system("cls"); 
    int i;
    for(i=1;i<24/2-2;i++) putchar('\n');
    for(i=1;i<80/2-5;i++) putchar(' ');
    printf("game over!\n\n");
    for(i=1;i<80/2-7;i++) putchar(' ');
    printf("您的分数是:%3d分\n",scores);
    for(i=1;i<24/2-3;i++) putchar('\n');    
    system("pause");//暂停 
    system("pause");//暂停
}
 
int main(){
    startup();    //数据初始化
    show_begin();//初始页面 
    while(!IsEnd){    //游戏循环执行 
        show();    // 显示画面 
        update_outinput();    //与输入无关的更新 
        update_input();    //与输入有关的更新 
    }
    show_end(); //显示失败界面 
    return 0;
}

3.运行结果:

小游戏玩法:

     《贪吃蛇》by:你最珍贵

 --------------------------------------- 
|控制信号: |  向上 |  向下 |  向左 |  向右 |
 --------------------------------------- 
|   键盘:    |    'i'    |   'k'   |   'j'    |    'l'   | 
 --------------------------------------- 

基于C语言实现贪吃蛇小游戏

基于C语言实现贪吃蛇小游戏

基于C语言实现贪吃蛇小游戏

基于C语言实现贪吃蛇小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_43503632/article/details/105453690

延伸 · 阅读

精彩推荐
  • C/C++C++中静态数据成员使用示例

    C++中静态数据成员使用示例

    大家好,本篇文章主要讲的是C++中静态数据成员使用示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    Gorgeousdrama9532022-08-14
  • C/C++C++ 开发之实现操作符重载的实例

    C++ 开发之实现操作符重载的实例

    这篇文章主要介绍了C++ 开发之实现操作符重载的实例的相关资料,这里附有实例代码和实现效果图帮助大家参考实践,需要的朋友可以参考下...

    liuyi12071643399132021-05-24
  • C/C++C语言实现AT指令ASCII码的拼接处理流程

    C语言实现AT指令ASCII码的拼接处理流程

    今天小编就为大家分享一篇关于C语言实现AT指令ASCII码的拼接处理流程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Engineer-Bruce_Yang5302021-07-12
  • C/C++详解C++ STL vector容器访问元素的几种方式

    详解C++ STL vector容器访问元素的几种方式

    这篇文章主要介绍了详解C++ STL vector容器访问元素的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    C语言中文网3812021-11-03
  • C/C++C++11智能指针之weak_ptr详解

    C++11智能指针之weak_ptr详解

    这篇文章主要介绍了 C++11智能指针之weak_ptr详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    音视频开发进阶7202021-09-10
  • C/C++解决C++中重定义的方法总结

    解决C++中重定义的方法总结

    本篇文章是对C++中重定义的解决方法进行了详细的分析介绍,需要的朋友参考下...

    C++教程网4342020-11-30
  • C/C++使用VC++实现打印乘法口诀表

    使用VC++实现打印乘法口诀表

    本文给大家分享的是一个超级简单的小例子,使用vc++打印乘法口诀表,给需要的小伙伴参考下吧。...

    C++教程网6412021-02-22
  • C/C++Qt在vs2019中使用及设置方法

    Qt在vs2019中使用及设置方法

    这篇文章主要介绍了Qt在vs2019中使用及设置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    WTQRookie11742021-09-22