c语言 贪吃蛇 程序
发布网友
发布时间:2022-04-23 07:05
我来回答
共8个回答
懂视网
时间:2022-05-11 02:45
最近一直在准备用来面试的几个小demo,为了能展现自己,所以都是亲自设计并实现的,其中一个就是在50行代码内来实现一个贪吃蛇,为了说明鄙人自己练习编程的一种方式--把代码写短,为了理解语言细节。
代码如下:
import sys, pygame
from pygame.locals import *
from random import randrange
up =lambda x:(x[0]-1,x[1])
down = lambda x :(x[0]+1,x[1])
left = lambda x : (x[0],x[1]-1)
right = lambda x : (x[0],x[1]+1)
tl = lambda x :x<3 and x+1 or 0
tr = lambda x :x==0 and 3 or x-1
dire = [up,left,down,right]
move = lambda x,y:[y(x[0])]+x[:-1]
grow = lambda x,y:[y(x[0])]+x
s = [(5,5),(5,6),(5,7)]
d = up
food = randrange(0,30),randrange(0,40)
FPSCLOCK=pygame.time.Clock()
pygame.init()
pygame.display.set_mode((800,600))
pygame.mouse.set_visible(0)
screen = pygame.display.get_surface()
screen.fill((0,0,0))
times=0.0
while True:
time_passed = FPSCLOCK.tick(30)
if times>=150:
times =0.0
s = move(s,d)
else:
times +=time_passed
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN and event.key == K_UP:
s = move(s,d)
if event.type == KEYDOWN and event.key == K_LEFT:
d=dire[tl(dire.index(d))]
if event.type == KEYDOWN and event.key == K_RIGHT:
d=dire[tr(dire.index(d))]
if s[0]==food:
s = grow(s,d)
food =randrange(0,30),randrange(0,40)
if s[0] in s[1:] or s[0][0]<0 or s[0][0] >= 30 or s[0][1]<0 or s[0][1]>=40:
break
screen.fill((0,0,0))
for r,c in s:
pygame.draw.rect(screen,(255,0,0),(c*20,r*20,20,20))
pygame.draw.rect(screen,(0,255,0),(food[1]*20,food[0]*20,20,20))
pygame.display.update()
游戏截图:
说明:
1.其实不用pygame,在把一些条件判断改改,估计可以再短一半。。等以后自己python水平高了再回来试试。。
2.但是50行的贪吃蛇代码,还是有可读性的,写的太短就真没有了。。
3.关键是把旋转,移动,等等这些算法用lamda表达式实现,还有函数对象。。
4.哪位“行者”能写的更短,小弟愿意赐教....
作者:aiqier
热心网友
时间:2022-05-10 23:53
基本思路:
蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define BEG_X2
#define BEG_Y1
#define WID20
#define HEI20
HANDLE hout;
typedef enum {UP, DOWN, LEFT, RIGHT} DIR;
typedef struct Snake_body
{
COORD pos;//蛇身的位置
struct Snake_body *next;//下一个蛇身
struct Snake_body *prev;//前一个蛇身
}SNAKE, *PSNAKE;
PSNAKE head = NULL;//蛇头
PSNAKE tail = NULL;//蛇尾
//画游戏边框的函数
void DrawBorder()
{
int i, j;
COORD pos = {BEG_X, BEG_Y};
for(i = 0; i < HEI; ++i)
{
SetConsoleCursorPosition(hout, pos);
for(j = 0; j < WID; ++j)
{
if(i == 0)//第一行
{
if(j == 0)
printf("┏");
else if(j == WID - 1)
printf("┓");
else
printf("━");
}
else if(i == HEI - 1)//最后一行
{
if(j == 0)
printf("┗");
else if(j == WID - 1)
printf("┛");
else
printf("━");
}
else if(j == 0 || j == WID - 1)//第一列或最后一列
printf("┃");
else
printf(" ");
}
++pos.Y;
}
}
//添加蛇身的函数
void AddBody(COORD pos)
{
PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));
pnew->pos = pos;
if(!head)
{
head = tail = pnew;
}
else
{
pnew->next = head;//新创建蛇身的next指向原先的蛇头
head->prev = pnew;//原先的蛇头的prev指向新创建的蛇身
head = pnew;//把新创建的蛇身作为新的蛇头
}
SetConsoleCursorPosition(hout, head->pos);
printf("◎");
}
//蛇身移动的函数
void MoveBody(DIR dir)
{
PSNAKE ptmp;
COORD pos = head->pos;
switch(dir)
{
case UP:
if(head->pos.Y > BEG_Y + 1)
--pos.Y;
else
return;
break;
case DOWN:
if(head->pos.Y < BEG_Y + HEI - 2)
++pos.Y;
else
return;
break;
case LEFT:
if(head->pos.X > BEG_X + 2)
pos.X -= 2;
else
return;
break;
case RIGHT:
if(head->pos.X < BEG_X + (WID - 2) * 2)
pos.X += 2;
else
return;
break;
}
AddBody(pos);//添加了一个新的蛇头
ptmp = tail;//保存当前的蛇尾
tail = tail->prev;
if(tail)
tail->next = NULL;
SetConsoleCursorPosition(hout, ptmp->pos);
printf(" ");
free(ptmp);
}
int main()
{
int ctrl;
DIR dir = RIGHT;//初始蛇的方向是向右的
COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};
system("color 0E");
system("mode con cols=90 lines=30");
hout = GetStdHandle(STD_OUTPUT_HANDLE);
printf(" ------------贪吃蛇的移动------------");
DrawBorder();
//自定义几个蛇的身体
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
pos.X += 2;
AddBody(pos);
//控制蛇的移动
while(ctrl = getch())
{
switch(ctrl)
{
case 'w':
if(dir == DOWN)
continue;
dir = UP;
break;
case 's':
if(dir == UP)
continue;
dir = DOWN;
break;
case 'a':
if(dir == RIGHT)
continue;
dir = LEFT;
break;
case 'd':
if(dir == LEFT)
continue;
dir = RIGHT;
break;
case 'q':
return 0;
}
MoveBody(dir);
}
return 0;
}
扩展资料:
实现逻辑
1,可以设置光标,就能实现制定位置打印制定符号。
2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。
3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。
4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。
5,食物产生的位置判定,不能越界,也不能与蛇身体重合。
6,蛇的转向判定,一条规则,不允许倒退。
7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)
8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。
9,加速减速,设置刷新休眠时间实现。
参考资料来源:百度百科-C语言
热心网友
时间:2022-05-11 01:11
代码示例如下:
使用了4个自定义函数来实现
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define High 20 // 游戏画面尺寸
#define Width 30
// 全局变量
int moveDirection; // 小蛇移动位置,上下左右分别用1,2,3,4表示
int food_x,food_y; // 食物的位置
int canvas[High][Width] = {0}; // 二维数组存储游戏画布中对应的元素
// 0为空格0,-1为边框#,-2为食物F,1为蛇头@,大于1的正数为蛇身*
void gotoxy(int x,int y) //光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
// 移动小蛇
// 第一步扫描数组canvas所有元素,找到正数元素都+1
// 找到最大元素(即蛇尾巴),把其变为0
// 找到=2的元素(即蛇头),再根据输出的上下左右方向,把对应的另一个像素值设为1(新蛇头)
void moveSnakeByDirection()
{
int i,j;
for (i=1;i<High-1;i++)
for (j=1;j<Width-1;j++)
if (canvas[i][j]>0)
canvas[i][j]++;
int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
int max = 0;
for (i=1;i<High-1;i++)
for (j=1;j<Width-1;j++)
if (canvas[i][j]>0)
{
if (max<canvas[i][j])
{
max = canvas[i][j];
oldTail_i = i;
oldTail_j = j;
}
if (canvas[i][j]==2)
{
oldHead_i = i;
oldHead_j = j;
}
}
int newHead_i,newHead_j;
if (moveDirection==1) // 向上移动
{
newHead_i = oldHead_i-1;
newHead_j = oldHead_j;
}
if (moveDirection==2) // 向下移动
{
newHead_i = oldHead_i+1;
newHead_j = oldHead_j;
}
if (moveDirection==3) // 向左移动
{
newHead_i = oldHead_i;
newHead_j = oldHead_j-1;
}
if (moveDirection==4) // 向右移动
{
newHead_i = oldHead_i;
newHead_j = oldHead_j+1;
}
// 新蛇头如果吃到食物
if (canvas[newHead_i][newHead_j]==-2)
{
canvas[food_x][food_y] = 0;
// 产生一个新的食物
food_x = rand()%(High-5) + 2;
food_y = rand()%(Width-5) + 2;
canvas[food_x][food_y] = -2;
// 原来的旧蛇尾留着,长度自动+1
}
else // 否则,原来的旧蛇尾减掉,保持长度不变
canvas[oldTail_i][oldTail_j] = 0;
// 是否小蛇和自身撞,或者和边框撞,游戏失败
if (canvas[newHead_i][newHead_j]>0 || canvas[newHead_i][newHead_j]==-1)
{
printf("游戏失败!\n");
Sleep(2000);
system("pause");
exit(0);
}
else
canvas[newHead_i][newHead_j] = 1;
}
void startup() // 数据初始化
{
int i,j;
// 初始化边框
for (i=0;i<High;i++)
{
canvas[i][0] = -1;
canvas[i][Width-1] = -1;
}
for (j=0;j<Width;j++)
{
canvas[0][j] = -1;
canvas[High-1][j] = -1;
}
// 初始化蛇头位置
canvas[High/2][Width/2] = 1;
// 初始化蛇身,画布中元素值分别为2,3,4,5....
for (i=1;i<=4;i++)
canvas[High/2][Width/2-i] = i+1;
// 初始小蛇向右移动
moveDirection = 4;
food_x = rand()%(High-5) + 2;
food_y = rand()%(Width-5) + 2;
canvas[food_x][food_y] = -2;
}
void show() // 显示画面
{
gotoxy(0,0); // 光标移动到原点位置,以下重画清屏
int i,j;
for (i=0;i<High;i++)
{
for (j=0;j<Width;j++)
{
if (canvas[i][j]==0)
printf(" "); // 输出空格
else if (canvas[i][j]==-1)
printf("#"); // 输出边框#
else if (canvas[i][j]==1)
printf("@"); // 输出蛇头@
else if (canvas[i][j]>1)
printf("*"); // 输出蛇身*
else if (canvas[i][j]==-2)
printf("F"); // 输出食物F
}
printf("\n");
}
Sleep(100);
}
void updateWithoutInput() // 与用户输入无关的更新
{
moveSnakeByDirection();
}
void updateWithInput() // 与用户输入有关的更新
{
char input;
if(kbhit()) // 判断是否有输入
{
input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == 'a')
{
moveDirection = 3; // 位置左移
moveSnakeByDirection();
}
else if (input == 'd')
{
moveDirection = 4; // 位置右移
moveSnakeByDirection();
}
else if (input == 'w')
{
moveDirection = 1; // 位置上移
moveSnakeByDirection();
}
else if (input == 's')
{
moveDirection = 2; // 位置下移
moveSnakeByDirection();
}
}
}
int main()
{
startup(); // 数据初始化
while (1) // 游戏循环执行
{
show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
return 0;
}
拓展资料
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
热心网友
时间:2022-05-11 02:46
付费内容限时免费查看回答早上好,亲,很高兴为您解答
e
#include
#include
#include
#include
/*大一上的时候C语言入门学的一个小游戏。还是挺有意思的,有兴趣的同学可以继续优化下:比如蛇头碰到蛇身就判定为输 /给蛇身加点颜色等。
*/
//1.2食物结构体
#define MAPHEIGHT 25
#define MAPWIDTH 60
#define SNAKESIZE 50 //蛇的最大节数
struct FOOD
{
\x09int x;
\x09int y;
}food;
#define SNAKESIZE 50 //蛇的最大节数
struct
{ //每一节蛇的坐标
\x09int x[SNAKESIZE];
\x09int y[SNAKESIZE];
\x09int len; //蛇长
\x09int speed; //
}snake;
///全局变量
int key='w';//初始化移动方向
int changFlag = 0;//蛇变化标记
//模块化设计
//
//1.画地图
void gotoxy(int x,int y); //实现的函数声明
void drawMap();
void createFood();
int snakeStatus();
void drawMap()
{
srand((unsigned)time(NULL)); //随机函数种子
//1.圈地
//1.1 左右边框
for(int i=0;i<=MAPHEIGHT;i++)
{
gotoxy(0,i);
printf("■");
gotoxy(MAPWIDTH,i);
printf("■");
}
for(int i=0;i<=MAPWIDTH;i+=2) //上下 ■占用两个字符
{
gotoxy(i,0);
printf("■");
gotoxy(i,MAPHEIGHT);
printf("■");
}
//2.画蛇 ■
//2.1确定蛇的属性
snake.len=3;
s
热心网友
时间:2022-05-11 04:37
/* 贪吃蛇程序 by champking */
#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*设置线型*/
for(i = 50; i <= 600; i += 10)/*画围墙*/
{
rectangle(i, 40, i + 10, 49); /*上边*/
rectangle(i, 451, i + 10, 460);/*下边*/
}
for(i = 40; i <= 450; i += 10)
{
rectangle(50, i, 59, i + 10); /*左边*/
rectangle(601, i, 610, i + 10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life = 0;/*活着*/
snake.direction = 1;/*方向往右*/
snake.x[0] = 100; snake.y[0] = 100;/*蛇头*/
snake.x[1] = 110; snake.y[1] = 100;
snake.node = 2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes == 1)/*需要出现新食物*/
{
food.x = rand() % 400 + 60;
food.y = rand() % 350 + 60;
while(food.x % 10 != 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y % 10 != 0)
food.y++;
food.yes = 0;/*画面上有食物了*/
}
if(food.yes == 0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x, food.y, food.x + 10, food.y - 10);
}
for(i = snake.node - 1; i > 0; i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1: snake.x[0] += 10; break;
case 2: snake.x[0] -= 10; break;
case 3: snake.y[0] -= 10; break;
case 4: snake.y[0] += 10; break;
}
for(i = 3; i < snake.node; i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
{
GameOver();/*显示失败*/
snake.life = 1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0] == food.x && snake.y[0] == food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x, food.y, food.x + 10, food.y - 10);
snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes = 1;/*画面上需要出现新的食物*/
score += 10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i = 0; i < snake.node; i++)
rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,
snake.y[i] - 10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1], snake.y[snake.node-1],
snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);
} /*endwhile(!kbhit)*/
if(snake.life == 1)/*如果蛇死就跳出循环*/
break;
key = bioskey(0);/*接收按键*/
if(key == ESC)/*按ESC键退出*/
break;
else
if(key == UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key == RIGHT &&snake.direction != 2)
snake.direction=1;
else
if(key == LEFT && snake.direction != 1)
snake.direction = 2;
else
if(key == DOWN && snake.direction != 3)
snake.direction = 4;
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0, 0, 4);
outtextxy(200, 200, "GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL, YELLOW);
bar(50, 15, 220, 35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str, "score:%d", score);
outtextxy(55, 20, str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
}
热心网友
时间:2022-05-11 06:45
/*
贪吃蛇程序
by
champking
*/
#define
N
200
#include
<graphics.h>
#include
<stdlib.h>
#include
<dos.h>
#define
LEFT
0x4b00
#define
RIGHT
0x4d00
#define
DOWN
0x5000
#define
UP
0x4800
#define
ESC
0x011b
int
i,key;
int
score
=
0;/*得分*/
int
gamespeed
=
100000;/*游戏速度自己调整*/
struct
Food
{
int
x;/*食物的横坐标*/
int
y;/*食物的纵坐标*/
int
yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct
Snake
{
int
x[N];
int
y[N];
int
node;/*蛇的节数*/
int
direction;/*蛇移动方向*/
int
life;/*
蛇的生命,0活着,1死亡*/
}snake;
void
Init(void);/*图形驱动*/
void
Close(void);/*图形结束*/
void
DrawK(void);/*开始画面*/
void
GameOver(void);/*结束游戏*/
void
GamePlay(void);/*玩游戏具体过程*/
void
PrScore(void);/*输出成绩*/
/*主函数*/
void
main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void
Init(void)
{
int
gd
=
DETECT,
gm;
initgraph(&gd,
&gm,
"c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void
DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,
0,
THICK_WIDTH);/*设置线型*/
for(i
=
50;
i
<=
600;
i
+=
10)/*画围墙*/
{
rectangle(i,
40,
i
+
10,
49);
/*上边*/
rectangle(i,
451,
i
+
10,
460);/*下边*/
}
for(i
=
40;
i
<=
450;
i
+=
10)
{
rectangle(50,
i,
59,
i
+
10);
/*左边*/
rectangle(601,
i,
610,
i
+
10);/*右边*/
}
}
/*玩游戏具体过程*/
void
GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes
=
1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life
=
0;/*活着*/
snake.direction
=
1;/*方向往右*/
snake.x[0]
=
100;
snake.y[0]
=
100;/*蛇头*/
snake.x[1]
=
110;
snake.y[1]
=
100;
snake.node
=
2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes
==
1)/*需要出现新食物*/
{
food.x
=
rand()
%
400
+
60;
food.y
=
rand()
%
350
+
60;
while(food.x
%
10
!=
0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y
%
10
!=
0)
food.y++;
food.yes
=
0;/*画面上有食物了*/
}
if(food.yes
==
0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,
food.y,
food.x
+
10,
food.y
-
10);
}
for(i
=
snake.node
-
1;
i
>
0;
i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]
=
snake.x[i-1];
snake.y[i]
=
snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case
1:
snake.x[0]
+=
10;
break;
case
2:
snake.x[0]
-=
10;
break;
case
3:
snake.y[0]
-=
10;
break;
case
4:
snake.y[0]
+=
10;
break;
}
for(i
=
3;
i
<
snake.node;
i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]
==
snake.x[0]
&&
snake.y[i]
==
snake.y[0])
{
GameOver();/*显示失败*/
snake.life
=
1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1;
/*蛇死*/
}
if(snake.life
==
1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]
==
food.x
&&
snake.y[0]
==
food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,
food.y,
food.x
+
10,
food.y
-
10);
snake.x[snake.node]
=-
20;
snake.y[snake.node]
=-
20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes
=
1;/*画面上需要出现新的食物*/
score
+=
10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i
=
0;
i
<
snake.node;
i++)
rectangle(snake.x[i],
snake.y[i],
snake.x[i]
+
10,
snake.y[i]
-
10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],
snake.y[snake.node-1],
snake.x[snake.node-1]
+
10,
snake.y[snake.node
-
1]
-
10);
}
/*endwhile(!kbhit)*/
if(snake.life
==
1)/*如果蛇死就跳出循环*/
break;
key
=
bioskey(0);/*接收按键*/
if(key
==
ESC)/*按ESC键退出*/
break;
else
if(key
==
UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key
==
RIGHT
&&snake.direction
!=
2)
snake.direction=1;
else
if(key
==
LEFT
&&
snake.direction
!=
1)
snake.direction
=
2;
else
if(key
==
DOWN
&&
snake.direction
!=
3)
snake.direction
=
4;
}/*endwhile(1)*/
}
/*游戏结束*/
void
GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,
0,
4);
outtextxy(200,
200,
"GAME
OVER");
getch();
}
/*输出成绩*/
void
PrScore(void)
{
char
str[10];
setfillstyle(SOLID_FILL,
YELLOW);
bar(50,
15,
220,
35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,
"score:%d",
score);
outtextxy(55,
20,
str);
}
/*图形结束*/
void
Close(void)
{
getch();
closegraph();
}
热心网友
时间:2022-05-11 09:26
没法
热心网友
时间:2022-05-11 12:24
去csdn上面找吧。有很好的。别人不可能帮你写的