好玩的贪吃蛇

不多说, 上代码, 拿去玩吧

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <windows.h>
  4 #include <conio.h>
  5 
  6 #define High 30
  7 #define Width 30
  8 
  9 int direction;
 10 int length_snake;
 11 int x_food, y_food;
 12 int x_snake, y_snake;
 13 int /*score,*/ speed, speedTop;
 14 int canvas[High][Width] = {0};
 15 
 16 void startup();
 17 void show();
 18 void updateWithoutInput();
 19 void updateWithInput();
 20 void moveSnake();
 21 void gotoxy(int x, int y)
 22 {
 23     HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 24     COORD pos;
 25     pos.X = x;
 26     pos.Y = y;
 27     SetConsoleCursorPosition(handle, pos);
 28 }
 29 void HideCursor()
 30 {
 31     CONSOLE_CURSOR_INFO cursor_info = {1, 0};
 32     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
 33 }
 34 
 35 int main()
 36 {
 37     startup();
 38     while(1)
 39     {
 40         show();
 41         updateWithoutInput();
 42         updateWithInput();
 43     }
 44 }
 45 // 0Space, 1Snake_Head, 2 - (+∞)Snake_Body, -1Boundary, -2food
 46 void startup()
 47 {
 48     int i, j;
 49     direction = 4; //向右移动
 50     length_snake = 4;
 51     x_snake = High/2, y_snake = Width/2;
 52     /*score = 0, */speed = 0, speedTop = 15;
 53     x_food = rand()%(High - 4) + 2, y_food = rand()%(Width - 4) + 2;
 54     for(i = 0; i <= High; i++)
 55     {
 56         for(j = 0; j <= Width; j++)
 57         {
 58             if(i == 0 || i== High || j == 0 || j== Width)
 59                 canvas[i][j] = -1;
 60             else if(i == x_food && j == y_food)
 61                 canvas[i][j] = -2;
 62             else if(i == x_snake && j == y_snake)
 63                 canvas[i][j] = 1;
 64         }
 65     }
 66     //为身体赋值
 67     for(i = 1; i < length_snake; i++)
 68         canvas[x_snake][y_snake-i] = i + 1;
 69 }
 70 // 0Space, 1Snake_Head, 2 - (+∞)Snake_Body, -1Boundary, -2food
 71 void show()
 72 {
 73     int i, j;
 74     gotoxy(0, 0);
 75     HideCursor();
 76     for(i = 0; i <= High; i++)
 77     {
 78         for(j = 0; j <= Width; j++)
 79         {
 80             if(canvas[i][j] == 0)
 81                 printf(" ");
 82             else if(canvas[i][j] == 1)
 83                 printf("@");
 84             else if(canvas[i][j] == -1)
 85                 printf("#");
 86             else if(canvas[i][j] == -2)
 87                 printf("F");
 88             else if(canvas[i][j] > 1)
 89                 printf("*");
 90         }
 91         printf("\n");
 92     }
 93 }
 94 
 95 void updateWithoutInput()
 96 {
 97             moveSnake();
 98             Sleep(200);
 99 }
100 // 上1 下3 左2 右4
101 void updateWithInput()
102 {
103     char input;
104     if(kbhit()) //保证游戏实时更新
105         {
106             input = getch();
107             if(input == 'a' && direction != 2 && direction != 4)
108                 {
109                     direction = 2;
110                     moveSnake();
111                 }
112             if(input == 'w' && direction != 1 && direction != 3)
113                 {
114                     direction = 1;
115                     moveSnake();
116                 }
117             if(input == 'd' && direction != 2 && direction != 4)
118                 {
119                     direction = 4;
120                     moveSnake();
121                 }
122             if(input == 's' && direction != 1 && direction != 3)
123                 {
124                     direction = 3;
125                     moveSnake();
126                 }
127         }
128 }
129 
130 void moveSnake()
131 {
132     int oldhead_x, oldhead_y, oldtail_x, oldtail_y;
133     int max = 0;
134     int i, j;
135     //蛇的身体和头都先加1
136     for(i = 0; i < High; i++)
137         for(j = 0; j < Width; j++)
138             if(canvas[i][j] > 0)
139                 canvas[i][j]++;
140     //开始寻找蛇的头和尾巴
141     for(i = 0; i < High; i++)
142         for(j = 0; j < Width; j++)
143             {
144                 if(canvas[i][j] == 2)
145                     {
146                         oldhead_x = i;
147                         oldhead_y = j;
148                     }
149                 if(max < canvas[i][j])
150                     {
151                         max = canvas[i][j];
152                         oldtail_x = i;
153                         oldtail_y = j;
154                     }
155             }
156         //设置一个变量来存储新的蛇头
157         int newhead_x, newhead_y;
158         //开始设置新的舌头
159         // 上1 下3 左2 右4
160         if(direction == 1)
161             {
162                 newhead_x = oldhead_x - 1;
163                 newhead_y = oldhead_y;
164             }
165         if(direction == 2)
166             {
167                 newhead_x = oldhead_x;
168                 newhead_y = oldhead_y - 1;
169             }
170         if(direction == 3)
171             {
172                 newhead_x = oldhead_x + 1;
173                 newhead_y = oldhead_y;
174             }
175         if(direction == 4)
176             {
177                 newhead_x = oldhead_x;
178                 newhead_y = oldhead_y + 1;
179             }
180         //吃到食物的结果
181         if(canvas[newhead_x][newhead_y] == -2)
182             {
183                 do
184                 {
185                     x_food = rand()%(High - 4) + 2;
186                     y_food = rand()%(Width - 4) + 2;
187                 }
188                 while(canvas[x_food][y_food] > 0);
189                 canvas[x_food][y_food] = -2;
190             }
191         else
192             canvas[oldtail_x][oldtail_y] = 0;
193         //判断游戏结束
194         if(canvas[newhead_x][newhead_y] > 1 || canvas[newhead_x][newhead_y] == -1)
195             {
196                 system("cls");
197                 printf("You lose!");
198                 system("pause");
199                 exit(0);
200             }
201         else
202             canvas[newhead_x][newhead_y] = 1;
203 }

 

 

加油, 你是最长的!

转载于:https://www.cnblogs.com/zhangzixu/p/11415179.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值