贪吃蛇C语言实现,clion版本。
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>
typedef struct pointXY{
int x;
int y;
}MYPOINT;
struct Snake{
int length;
MYPOINT xy[100];
char position;
}snake;
struct Food{
MYPOINT fdxy;
int eatgrade;
int flag;
}food;
HWND hwnd =NULL;
enum movPosition{right=77,left=75,down=80,up=72};
void initSnake();
void drawSnake();
void moveSnake();
void keyDown();
void initFood();
void drawFood();
void eatFood();
int snakeDie();
void showGrade();
void pasueMoment();
int main()
{
srand((unsigned int)time(NULL));
hwnd = initgraph(640, 480);
setbkcolor(WHITE);
initSnake();
while (1){
cleardevice();
drawFood();
if (food.flag==0){
initFood();
}
drawSnake();
if(snakeDie()){
break;
}
moveSnake();
eatFood();
showGrade();
while (_kbhit()){
pasueMoment();
keyDown();
}
Sleep(100);
}
getchar();
closegraph();
return 0;
}
void initSnake(){
snake.xy[2].x=0;
snake.xy[2].y=0;
snake.xy[1].x=10;
snake.xy[1].y=0;
snake.xy[0].x=20;
snake.xy[0].y=0;
snake.length=3;
snake.position =right;
food.eatgrade =0;
}
void drawSnake(){
for (int i = 0; i < snake.length; ++i) {
setlinecolor(BLACK);
setfillcolor(RGB(rand()%255,rand()%255,rand()%255));
fillrectangle(snake.xy[i].x,snake.xy[i].y,snake.xy[i].x+10,snake.xy[i].y+10);
}
};
void moveSnake(){
for (int i = snake.length-1; i >0; --i) {
snake.xy[i].x = snake.xy[i-1].x;
snake.xy[i].y = snake.xy[i-1].y;
}
switch (snake.position)
{
case right:
snake.xy[0].x +=10;
break;
case left:
snake.xy[0].x -=10;
break;
case down:
snake.xy[0].y +=10;
break;
case up:
snake.xy[0].y -=10;
break;
default:
break;
}
}
void keyDown(){
char userKey = 0;
userKey = _getch();
switch (userKey)
{
case right:
if(snake.position!= left){
snake.position = right;
}
break;
case left:
if(snake.position!= right){
snake.position = left;
}
break;
case down:
if(snake.position!= up){
snake.position = down;
}
break;
case up:
if(snake.position!= down){
snake.position = up;
}
break;
default:
break;
}
}
void initFood(){
food.fdxy.x = rand()%65*10;
food.fdxy.y = rand()%48*10;
food.flag = 1 ;
for (int i = 0; i < snake.length; ++i) {
if(food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y){
food.fdxy.x = rand()%65*10;
food.fdxy.y = rand()%48*10;
}
}
}
void drawFood(){
setlinecolor(BLACK);
setfillcolor(RGB(rand()%255,rand()%255,rand()%255));
fillrectangle(food.fdxy.x,food.fdxy.y,food.fdxy.x+10,food.fdxy.y+10);
}
void eatFood(){
if(food.fdxy.x == snake.xy[0].x && food.fdxy.y == snake.xy[0].y ){
snake.length++;
food.eatgrade+=10;
food.flag = 0;
}
}
void showGrade(){
char grade[100] = "";
sprintf(grade,"%d",food.eatgrade);
setbkmode(TRANSPARENT);
settextcolor(LIGHTBLUE);
outtextxy(560,20,"分数: ");
outtextxy(560+50,20,grade);
}
int snakeDie(){
if(snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y > 480 || snake.xy[0].y <0){
outtextxy(200,200,"你撞南墙了!");
MessageBox(hwnd,"game over!","撞墙警告",MB_OK);
return 1;
}
for (int i = 1; i < snake.length; ++i) {
if(snake.xy[i].x==snake.xy[0].x && snake.xy[i].y==snake.xy[0].y) {
outtextxy(200,200,"你吃掉了自己");
MessageBox(hwnd,"game over!","自己吃自己警告",MB_OK);
return 1;
}
}
return 0;
}
void pasueMoment(){
if(_getch() == 32){
while (_getch()!=32);
}
};
运行截图
