C语言实现贪吃蛇

日期:2018.9.11

用时:150min

项目:贪吃蛇(C语言--数组   结构体实现)

开发工具:vs2013

关键知识:数组,结构体,图形库,键位操作

源代码:

  1 #include<stdio.h>
  2 #include<graphics.h>
  3 #include<stdlib.h>
  4 #include<conio.h>
  5 #include<time.h>
  6
  7 #define N 200
  8 int i, key;
  9 int score = 0;
 10 int gamespeed = 500;
 11
 12 void init(void);
 13 void Draw();
 14 void Playgame();
 15 void Prscore();
 16 void Gameover();
 17
 18 struct Food {
 19     int x;
 20     int y;
 21     int yes;
 22 }food;
 23
 24 struct Snake{
 25     int x[N];
 26     int y[N];
 27     int node;
 28     int direcion;
 29     int life;
 30 }snake;
 31
 32 void main()
 33 {
 34     init();
 35     Draw();
 36     Playgame();
 37     _getch();
 38 }
 39
 40 void init(void)
 41 {
 42     initgraph(640,480);
 43     setbkcolor(WHITE);
 44     cleardevice();
 45 }
 46
 47 void Draw()
 48 {
 49     setcolor(BLACK);
 50     for (i = 50; i <= 600; i += 10)
 51     {
 52         rectangle(i, 40, i + 10, 49);
 53         rectangle(i, 451, i + 10, 460);
 54     }
 55     for (i = 40; i <= 450; i += 10)
 56     {
 57         rectangle(50, i, 59, i + 10);
 58         rectangle(601, i, 610, i + 10);
 59     }
 60 }
 61
 62 void Playgame()
 63 {
 64     srand((unsigned)time(NULL));//用时间做种,每次产生的随机数不一样。
 65     food.yes = 1;//1表示需要出现食物,0表示已有食物
 66     snake.life = 0;//0,活着,1 死亡
 67     snake.direcion = 1;
 68     snake.x[0] = 100; snake.y[0] = 100;
 69     snake.x[1] = 110; snake.y[1] = 100;
 70     snake.node = 2;
 71     Prscore();
 72     while (1)
 73     {
 74         while (!_kbhit())
 75         {
 76             if (food.yes == 1)
 77             {
 78                 food.x = rand() % 400 + 60;
 79                 food.y = rand() % 350 + 60;
 80                 while (food.x % 10 != 0)
 81                     food.x++;
 82                 while (food.y % 10 != 0)
 83                     food.y++;
 84                 food.yes = 0;
 85             }
 86             if (food.yes == 0)
 87             {
 88                 setcolor(RED);
 89                 rectangle(food.x, food.y, food.x + 10, food.y + 10);
 90             }
 91             for (i = snake.node - 1; i > 0; i--)
 92             {
 93                 snake.x[i] = snake.x[i - 1];
 94                 snake.y[i] = snake.y[i - 1];
 95             }
 96             switch (snake.direcion)
 97             {
 98             case 1:snake.x[0] += 10; break;
 99             case 2:snake.x[0] -= 10; break;
100             case 3:snake.y[0] -= 10; break;
101             case 4:snake.y[0] += 10; break;
102             }
103             for (i = 3; i < snake.node; i++)
104             {
105                 if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
106                 {
107                     Gameover();
108                     snake.life = 1;
109                     break;
110                 }
111             }
112             if (snake.x[0]<55 || snake.x[0]>595 || snake.y[0]<55 || snake.y[0]>455)
113             {
114                 Gameover();
115                 snake.life = 1;
116             }
117             if (snake.life == 1)
118                 break;
119             if (snake.x[0] == food.x&&snake.y[0] == food.y)
120             {
121                 setcolor(BLACK);
122                 rectangle(food.x, food.y, food.x + 10, food.y + 10);
123                 snake.x[snake.node] = -20; snake.y[snake.node] = -20;
124                 snake.node++;
125                 food.yes = 1;
126                 score += 10;
127                 Prscore();
128             }
129             setcolor(GREEN);
130             for (i = 0; i < snake.node; i++)
131                 rectangle(snake.x[i], snake.y[i],snake.x[i] + 10, snake.y[i] + 10);
132             if (food.yes == 1)
133             {
134                 if (gamespeed >= 20)
135                     gamespeed -= 10;// 速度最大不超过
136             }
137
138             Sleep(gamespeed);
139             setcolor(WHITE);
140             rectangle(snake.x[snake.node - 1], snake.y[snake.node - 1], snake.x[snake.node-1] + 10, snake.y[snake.node - 1] + 10);
141         }
142         if (snake.life == 1)
143             break;
144         switch (_getch())
145         {
146         case ‘w‘:
147         case ‘W‘:
148             if (snake.direcion != 4)
149             {
150                 snake.direcion = 3;
151             }
152             break;
153         case ‘d‘:
154         case ‘D‘:
155             if (snake.direcion != 2)
156             {
157                 snake.direcion = 1;
158             }
159             break;
160         case ‘a‘:
161         case ‘A‘:
162             if (snake.direcion != 1)
163             {
164                 snake.direcion = 2;
165             }
166             break;
167         case ‘s‘:
168         case ‘S‘:
169             if (snake.direcion != 3)
170             {
171                 snake.direcion = 4;
172             }
173             break;
174         }
175     }
176 }
177
178
179 void Prscore()
180 {
181     char str[10];
182     setfillstyle(SOLID_FILL, YELLOW);
183     bar(50, 15, 220, 35);
184     setcolor(6);
185     sprintf_s(str, "score:%d", score);
186     outtextxy(55, 20, str);
187 }
188
189 void Gameover()
190 {
191     cleardevice();
192     setbkcolor(WHITE);
193     Prscore();
194     setcolor(RED);
195     settextstyle(20, 20, "楷体");
196     outtextxy(200, 200, "GAME OVER");
197     _getch();
198 }

运行截图:

原文地址:https://www.cnblogs.com/qingfenghanli/p/9634180.html

时间: 2024-10-29 00:14:53

C语言实现贪吃蛇的相关文章

C语言实现贪吃蛇之结构链表篇

之前的两篇博客将运用的C语言知识限定在了一般的数组上,但如果已经完整地了解过C语言的话,运用结构和链表会让程序的结构更明了,逻辑更清晰.这篇博客就将介绍如何用结构和链表改善之前的程序. 首先,我们为蛇的节点定义一个结构: typedef struct node{ COORD cor; struct node *next; }node; COORD结构我在上一篇已经介绍过,这里就直接借用了. COORD food = { 3,5 }; node *head; food也相应地由COORD来定义,并

C语言实现贪吃蛇之全靠数组篇

贪吃蛇游戏的设计思路很简单,相信有过一些编程经验的同学都不至于束手无策,可在我刚刚接触编程时,这个小小的贪吃蛇游戏可是让我费了不少脑筋,如今学习编程已经快一年了,前几天又看了一遍K&R,打算写几个贪吃蛇程序巩固一下知识.我打算写若干篇贪吃蛇的博客,从简单粗糙的开始,不断改良,希望能给初学C语言的同学一点借鉴. 话不多说,我们现在就开始吧,首先我们整理一下思路.首先我们要明确,既然贪吃蛇游戏理论上可以无限继续下去,那么游戏主体一定就是一个循环.蛇的移动就在这个循环中完成.如果是初学编程的话,可能会

C语言之贪吃蛇(curses库函数)

上大学学习编程的初始目的就是冲着游戏来的~不过在刚学习C语言的时候,完全无法利用所学知识弄出一个可玩的游戏╮(╯_╰)╭,学了1年后仍然对最简单的贪吃蛇没有思路(当然不是说没有打代码的思路,而是没有办法弄出动态的东西,而且当时往算法那走了~),直到如今大二,利用寒假的一点时间入门Linux的时候,发现了curses库函数!当我看明白它的作用时,拍案而起,TM这玩意不就是我梦寐以求的可实现界面的东东么!当我学了一点点就觉悟到,用一个move()和printw()函数就完全可以把贪吃蛇这种级别的写出

C语言实现贪吃蛇之图形界面篇

这已经是贪吃蛇系列的第五篇了,讲真一直写这个也挺无聊的,所以这一篇博文将是系列的最后一篇.虽然已经介绍了贪吃蛇的几种写法,但说到底我们的游戏还只是在一个黑框框里移动的星号.和我们平时玩的贪吃蛇游戏有不少差距.游戏嘛,画面也是很重要的一环.接下来就是让之前的贪吃蛇游戏脱胎换骨的时候了.话不多说,这就开干吧. 首先,为了摆脱无趣的黑框(控制台),我们这次新建一个win32项目,直接点击完成.初次接触win32项目的同学可能会感到一股扑面而来的伤害,满屏都是意义不明的字符,这TM还是C语言吗!先不要沮

C语言之贪吃蛇(conio.h)

写完基于Linux中curses库的贪吃蛇,发现只需要用到一个WIN的API(移动光标那个)改写move(int y, int x)函数,然后加上conio.h(一般编译器都会包含这个头文件)的getch(),就可以在Windows系统运行! Linux版链接:http://blog.csdn.net/u013351484/article/details/43940803 游戏规则: 初始时两条蛇会在中间,一条蛇头是'@',食物是'$':另一条蛇头是'+',食物是'*',蛇身都是'#'.WASD

C语言实现贪吃蛇之局部刷新篇

上一篇博客里,我介绍了如何用数组存储坐标,不断全屏刷新以实现动态效果,这几乎是最显而易见的思路,但带来的副作用也十分明显,那就是始终伴随着游戏的闪烁现象,之所以会造成闪烁现象,原因在于频繁的清空与打印,其实贪吃蛇游戏里我们并不需要重打印整个界面,要实现蛇的移动,我们只要打印出新的蛇头,清除原来的蛇尾就好了.食物只有在被吃掉时才需要重新打印,边界更是只用打印一次.好了,既然我们看到了可提升的地方,就开始动手优化吧.显然,我们将需要一个可以自由移动光标的函数,这样我们才能做到在需要的地方打印.TC上

C语言之贪吃蛇

利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define _SNAKE_H_H_H //调节游戏界面大小,这里设置为15*15 int const COL=15; int const ROW=15; //蛇结点 typedef struct Node { //data域 int x; int y; //指针域 struct Node* pre; struc

C语言之贪吃蛇(ncurses)

声明: 以下内容可能会引起某些读者不适, 请小心阅读. 有些内容并没有详细介绍, 可能简单理解也是错误的, 但是这都是为了尽量简单. 前言: 代码是很久之前写的,属于边想边写的那种,很混乱. 推荐材料: NCURSES Programming HOWTO 贪吃蛇应该是我们这代人都玩过的游戏.而如果我们要写一个贪吃蛇最需要考虑的就是贪吃蛇是如何移动的.其实贪吃蛇的移动就是尾部的减少和头部的增加. 这篇文章: 介绍一些ncurses库的基础内容 贪吃蛇游戏的代码解释 介绍一些ncurses库的基础内

架构练习:c语言实现贪吃蛇(一):画地图和蘑菇

目前只是画地图,和根据当前时间随机生成蘑菇 下一步: (1)实现类似于top的刷新方法 (2)实现蛇的行走 (3)实现蛇吃蘑菇的合并及新蘑菇的生成 (4)实现架构的修改和优化 [email protected]:/mnt/shared/appbox/snake# cat snake.c #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include