c语言字符蛇代码,C语言实现贪吃蛇代码

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

#include"stdafx.h"

#include

#include

#include

#include

#include

#define U 1

#define D 2

#define L 3

#define R 4 //蛇的状态 U:上 D:下 L:左 R:右

typedef struct snake //蛇身的一个节点

{

int x; //节点的x坐标

int y; //节点的y坐标

struct snake *next; //蛇身的下一个节点

}snake;

int score=0,add=10; //总得分和每吃一次食物的得分

int highscore=0; //最高分

int status,sleeptime=200; //蛇前进状态,每次运行的时间间隔

snake *head,*food; //蛇头指针,食物指针

snake *q; //遍历蛇时用的指针

int endgamestatus=0; //游戏结束时的状态

HANDLE hOut; //控制台句柄

void gotoxy(int x,int y);

int color(int c);

void printsnake();

void wlcome();

void createmap();

void scoreandtips();

void initsnake();

void createfood();

int biteself();

void cantcrosswall();

void speedup();

void speeddown();

void snakemove();

void keyboardcontrol();

void lostdraw();

void endgame();

void choose();

void file_out();

void file_in();

void explation();

main()

{

system("mode con cols=100 lines=30");

printsnake();

wlcome();

file_out();

keyboardcontrol();

endgame();

}

void gotoxy(int x,int y)//设置光标位置

{COORD c;

c.X=x;

c.Y=y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); //定位光标的位置

}

int color(int c)//设置颜色

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);

return 0;

}

void printsnake()//打印字符蛇

{

gotoxy(2,5);

color(3);

printf("姓名:张小艾");

gotoxy(2,6);

color(3);

printf("学号:1910101099");

gotoxy(35,1);

color(6);

printf("/^\\/^\\");

gotoxy(34,2);

printf("|_| o|");

gotoxy(33,2);

color(2);

printf("_");

gotoxy(25,3);

color(12);

printf("\\/");

gotoxy(31,3);

color(2);

printf("/");

gotoxy(37,3);

color(6);

printf("\\_/");

gotoxy(41,3);

color(10);

printf(" \\");

gotoxy(26,4);

color(12);

printf("\\____");

gotoxy(32,4);

printf("_________");

gotoxy(31,4);

color(2);

printf("|");

gotoxy(43,4);

color(10);

printf("\\");

gotoxy(32,5);

color(2);

printf("\\_______");

gotoxy(44,5);

color(10);

printf("\\");

gotoxy(39,6);

printf("| | \\");

gotoxy(38,7);

printf("/ / \\");

gotoxy(37,8);

printf("/ / \\ \\");

gotoxy(35,9);

printf("/ / \\ \\");

gotoxy(34,10);

printf(" / / \\ \\");

gotoxy(33,11);

printf("/ / _----_ \\ \\");

gotoxy(32,12);

printf("/ / _-~ ~-_ | |");

gotoxy(31,13);

printf("( ( _-~ _--_ ~-_ _/ |");

gotoxy(32,14);

printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /");

gotoxy(33,15);

printf("~-_ _-~ ~-_ _-~");

gotoxy(35,16);

printf("~--____-~ ~-___-~");

}

void wlcome()//欢迎界面

{int n;

int i,j=1;

gotoxy(43,18);

color(11);

printf("贪吃蛇大作战");

color(14);

for(i=20;i<=26;i++)

{

for(j=27;j<=74;j++)

{

gotoxy(j,i);

if(i==20||i==26)

{

printf("-");

}

else if(j==27||j==74)

{

printf("|");

}

}

}

color(12);

gotoxy(35,22);

printf("1.开始游戏");

gotoxy(55,22);

printf("2.游戏说明");

gotoxy(35,24);

printf("3.退出游戏");

gotoxy(29,27);

color(3);

printf("请选择1 2 3\n");

color(14);

scanf("%d",&n);

switch(n)

{

case 1:

system("cls");//清屏

createmap();

initsnake();

createfood();

keyboardcontrol();

break;

case 2:

explation();

break;

break;

case 3:

exit(0);

break;

}

}

void createmap()//创建地图

{

int i,j;

for(i=0;i<58;i+=2)

{

gotoxy(i,0);

color(5);

printf("□");

gotoxy(i,26);

printf("□");

}

for(i=0;i<26;i++)

{

gotoxy(0,i);

printf("□");

gotoxy(56,i);

printf("□");

}

for(i=2;i<56;i+=2)

{

for(j=1;j<26;j++)

{

gotoxy(i,j);

color(3);

printf("■\n\n");

}

}

}

void scoreandtips()//游戏界面右侧的得分和小提示

{

file_out();

gotoxy(64,4);

color(11);

printf("*最高纪录*: %d",highscore);

gotoxy(64,8);

color(14);

printf("得分: %d ",score);

color(13);

gotoxy(73,11);

printf("小提示");

gotoxy(60,13);

color(6);

printf("+---------------------+");

gotoxy(60,25);

printf("+---------------------+");

color(3);

gotoxy(64,14);

printf("每个食物得分:%d分",add);

gotoxy(64,16);

printf("不能穿墙,不能咬到自己");

gotoxy(64,18);

printf("用↑↓←→分别控制蛇的移动");

gotoxy(64,20);

printf("F1为加速,F2为减速");

gotoxy(64,22);

printf("space: 暂停游戏");

gotoxy(64,24);

printf("ESC:退出游戏");

}

void file_out()//打开文件记录最高分

{

FILE *fp;

fp=fopen("save.txt","a+");

fscanf(fp,"%d",&highscore);

fclose(fp);

}

void initsnake()

{

snake *tail;

int i;

tail=(snake*)malloc(sizeof(snake));

tail->x=24;

tail->y=5;

tail->next=NULL;

for(i=1;i<=4;i++)

{

head=(snake*)malloc(sizeof(snake));

head->next=tail;

head->x=24+2*i;

head->y=5;

tail=head;

}

while(tail!=NULL)

{gotoxy(tail->x,tail->y);

color(14);

printf("★"); //蛇身由★组成

tail=tail->next;

}

}

void createfood()//随机出现食物

{

snake *food_1;

srand((unsigned)time(NULL));

food_1=(snake*)malloc(sizeof(snake));

while((food_1->x%2!=0))

{

food_1->x=rand()%52+2;

}

food_1->y=rand()%24+1;

q=head;

while(q->next==NULL)

{

if(q->x==food_1->x&&q->y==food_1->y)

{

free(food_1);

createfood();

}

q=q->next;

}

gotoxy(food_1->x,food_1->y);

food=food_1;

color(12);

printf("@");

}

int biteself()

{

snake *self; //定义self为蛇身上除蛇头以外的节点

self=head->next;

while(self!=NULL)

{

if(self->x==head->x&&self->y==head->y)

{

return 1;

}

self=self->next;

}

return 0;

}

void cantcrosswall()

{

if(head->x==0||head->x==56||head->y==0||head->y==26)

{

endgamestatus=1;

endgame();

}

}

void speedup()//加速

{

if(sleeptime>=50)

{

sleeptime=sleeptime-10;

add=add+2;

}

}

void speeddown()//减速

{

if(sleeptime<350)

{

sleeptime=sleeptime+30;

add=add-2;

if(sleeptime==350)

{

add=1;

}

}

}

void snakemove()//控制方向

{

snake *nexthead;

cantcrosswall();

nexthead=(snake*)malloc(sizeof(snake));

if(status==U)//上

{

nexthead->x=head->x; //向上前进时,x不变,y-1

nexthead->y=head->y-1;

nexthead->next=head;

head=nexthead;

q=head;

//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同

if(nexthead->x==food->x&&nexthead->y==food->y)

{

while(q!=NULL)

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

score=score+add;

speedup();

createfood();

}

else

{

while(q->next->next!=NULL)//如果没有遇见食物

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置

gotoxy(q->next->x,q->next->y);

color(3);

printf("■");//恢复走过的位置

free(q->next);

q->next=NULL;

}

}

if(status==D)

{

nexthead->x=head->x; //向下前进时,x不变,y+1

nexthead->y=head->y+1;

nexthead->next=head;

head=nexthead;

q=head;

//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同

if(nexthead->x==food->x&&nexthead->y==food->y)

{

while(q!=NULL)

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

score=score+add;

speedup();

createfood();

}

else

{

while(q->next->next!=NULL)//如果没有遇见食物

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置

gotoxy(q->next->x,q->next->y);

color(3);

printf("■");//恢复走过的位置

free(q->next);

q->next=NULL;

}

}

if(status==L)//左

{

nexthead->x=head->x-2; //向左前进时,x不变,y+1

nexthead->y=head->y;

nexthead->next=head;

head=nexthead;

q=head;

//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同

if(nexthead->x==food->x&&nexthead->y==food->y)

{

while(q!=NULL)

{

gotoxy(q->x,q->y); //食物变成蛇身上的一部分

color(14);

printf("★");

q=q->next;

}

score=score+add;

speedup();

createfood();

}

else

{

while(q->next->next!=NULL)//如果没有遇见食物

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置

gotoxy(q->next->x,q->next->y);

color(3);

printf("■");//恢复走过的位置

free(q->next);

q->next=NULL;

}

}

if(status==R)

{

nexthead->x=head->x+2; //向上前进时,x不变,y-1

nexthead->y=head->y;

nexthead->next=head;

head=nexthead;

q=head;

//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同

if(nexthead->x==food->x&&nexthead->y==food->y)

{

while(q!=NULL)

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

score=score+add;

speedup();

createfood();

}

else

{

while(q->next->next!=NULL)//如果没有遇见食物

{

gotoxy(q->x,q->y);

color(14);

printf("★");

q=q->next;

}

//经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置

gotoxy(q->next->x,q->next->y);

color(3);

printf("■");//恢复走过的位置

free(q->next);

q->next=NULL;

}

}

if(biteself()==1)

{

endgamestatus=2;

endgame();

}

}

void keyboardcontrol()

{

status=R;

while(1)

{

scoreandtips();

//GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态

if(GetAsyncKeyState(VK_UP)&&status!=D)

{

status=U;

}

else if(GetAsyncKeyState(VK_DOWN)&&status!=U)

{

status=D;

}

else if(GetAsyncKeyState(VK_LEFT)&&status!=R)

{

status=L;

}

else if(GetAsyncKeyState(VK_RIGHT)&&status!=L)

{

status=R;

}

if(GetAsyncKeyState(VK_SPACE))

{

while(1)

{

//调用sleep函数,令进程停止,直到达到其中设定的参数时间

Sleep(300);

if(GetAsyncKeyState(VK_SPACE))

{

break;

}

}

}

else if(GetAsyncKeyState(VK_ESCAPE))

{

endgamestatus=3;

break;

}

else if(GetAsyncKeyState(VK_F1))

{

speedup();

}

else if(GetAsyncKeyState(VK_F2))

{

if(sleeptime<350)

{

sleeptime=sleeptime+30;

add=add-2;

if(sleeptime==350)

{

add=1;

}

}

}

Sleep(sleeptime);

snakemove();

}

}

void lostdraw()

{

system("cls");

int i,j;

gotoxy(17,5);

color(11);

printf("+------------------------");

gotoxy(35,5);

color(14);

printf("o00o");

gotoxy(39,5);

color(11);

printf("----------");

gotoxy(48,5);

color(14);

printf("---");

gotoxy(51,5);

color(11);

printf("----------");

gotoxy(61,5);

color(14);

printf("o00o");

gotoxy(65,5);

color(11);

printf("-----------------+");

for(i=6;i<=19;i++)

{

gotoxy(17,i);

printf("|");

gotoxy(82,i);

printf("|");

}

gotoxy(17,20);

printf("+----------------------------------");

gotoxy(52,20);

color(11);

printf("-----------------------------+");

}

void endgame()

{

system("cls");

if(endgamestatus==1)

{

lostdraw();

gotoxy(35,9);

color(12);

printf("对不起,您撞到墙了。游戏结束!");

}

else if(endgamestatus==2)

{

lostdraw();

gotoxy(35,9);

color(12);

printf("对不起,您咬到自己了。游戏结束!");

}

else if(endgamestatus==3)

{

lostdraw();

gotoxy(40,9);

color(12);

printf("您结束了游戏。");

}

gotoxy(43,12);

color(13);

printf("您的得分是 %d",score);

if(score>=highscore)

{

color(10);

gotoxy(33,16);

printf("创新纪录啦!你真棒!!!");

file_in();

}

choose();

}

void file_in()//将最高分存储到文件中

{

FILE *fp;

fp=fopen("save.txt","w+");//以读写的方式建立文件

fprintf(fp,"%d",score);

fclose(fp);

}

void choose()

{

int n;

gotoxy(25,23);

color(12);

printf("重玩一局-------1");

gotoxy(52,23);

printf("不玩了,退出-------2");

gotoxy(46,25);

color(11);

printf("选择:");

scanf("%d",&n);

switch(n)

{

case 1:

system("cls");

score=0;

sleeptime=200;

add=10;

printsnake();

wlcome();

break;

case 2:

exit(0);

break;

default:

gotoxy(35,27);

color(12);

printf("您输入有误,请重新输入");

system("pause >nul");//按任意键

endgame();

choose();

break;

}

}

void explation()

{

int i,j=1;

system("cls");

color(13);

gotoxy(44,3);

printf("游戏说明");

color(2);

for(i=6;i<=22;i++)

{

for(j=20;j<=75;j++)

{

gotoxy(j,i);

if(i==6||i==22)printf("=");

else if(j==20||j==75)printf("||");

}

}

color(3);

gotoxy(30,8);

printf("1、不能穿墙,不能咬到自己");

color(3);

gotoxy(30,8);

printf("1、不能穿墙,不能咬到自己");

color(10);

gotoxy(30,11);

printf("2、用↑↓←→分别控制蛇的移动");

color(14);

gotoxy(30,14);

printf("3、F1为加速,F2为减速");

color(11);

gotoxy(30,17);

printf("4、按空格键暂停游戏,再按空格键继续");

color(4);

gotoxy(30,20);

printf("5、ESC:退出游戏,space:暂停游戏");

getch();//按任意键返回主界面

system("cls");

printsnake();

wlcome();

}

更多有趣的经典小游戏实现专题,分享给大家:

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> //游戏窗口 #define FrameX 4 //游戏窗口左上角的X轴坐标 #define FrameY 4 //游戏窗口左上角的Y轴坐标 #define Frame_height 20 //游戏窗口的高度 #define Frame_width 20 //游戏窗口的宽度 //定义全局变量 int i,j; int a[2]; //用于记住尾坐标,其中a[0]、a[1]分别表示横、竖坐标 //声明的结构体 struct Snake { int x[100]; //的横坐标,其中x[0]表示尾的横坐标,x[N-1]表示头的横坐标 int y[100]; //的竖坐标,其中y[0]表示尾的竖坐标,y[N-1]表示头的竖坐标 int count; //吃食物的个数 int length; //的长度 int speed; //的速度 }; //声明食物的结构体 struct Food { int x; //食物的横坐标 int y; //食物的竖坐标 }; /******光标移到指定位置**************************************************************/ void gotoxy(HANDLE hOut, int x, int y) //UNKNOW { COORD pos; pos.X = x; //横坐标 pos.Y = y; //纵坐标 SetConsoleCursorPosition(hOut, pos); } /******设置文本为绿色*****************************************************************/ void Set_TextColor_Green (void) { HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); //UNKNOW SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); //UNKNOW } /******制作游戏窗口******************************************************************/ void make_frame() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); //打印选择菜单 printf("Esc 退出游戏"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); printf("长按方向键:加速"); gotoxy(hOut,FrameX,FrameY); //打印框角 printf("╔"); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); printf("╗"); gotoxy(hOut,FrameX,FrameY+Frame_height); printf("╚"); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); printf("╝"); for(i=2;i<2*Frame_width-2;i+=2) { gotoxy(hOut,FrameX+i,FrameY); printf("═"); //打印上横框 } for(i=2;i<2*Frame_width-2;i+=2) { gotoxy(hOut,FrameX+i,FrameY+Frame_height); printf("═"); //打印下横框 } for(i=1;i<Frame_height;i++) { gotoxy(hOut,FrameX,FrameY+i); printf("║"); //打印左竖框 } for(i=1;i<Frame_height;i++) { gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); printf("║"); //打印右竖框 } gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称 Set_TextColor_Green (); //设置为绿色 printf("贪吃游戏"); } /******结束菜单*******************************************************************/ void over_game() { system("cls"); printf("\n\n\n\n\n\n\n\n\t\t\t\t游戏结束\n\n\n"); Sleep(2000); getch(); } /******菜单信息***************************************************************/ void print_information(HANDLE hOut,struct Snake *snake,struct Food *food) { gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1); printf("level : %d",snake->count/5+1); //打印游戏等级 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3); printf("score : %d",10*snake->count); //打印游戏得分 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5); printf("eat food : %d",snake->count); //打印产生食物个数 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); printf("speed : %dms",snake->speed); //打印游戏速度 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9); printf("foodX : %d",food->x); //打印食物的横坐标 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11); printf("foodY : %d",food->y); //打印食物的竖坐标 } /******初始化**********************************************************************/ void init_snake(struct Snake *snake) { snake->x[0]=FrameX+2; //初始化的横坐标 snake->y[0]=FrameY+Frame_height/2; //初始化的竖坐标 snake->speed=300; //初始化的速度为300ms snake->length=3; //初始化的长度为3节 snake->count=0; //初始化吃的个数为0 for(i=1;i<snake->length;i++) {/* 依次得到身、头的坐标 */ snake->x[i]=snake->x[i-1]+2; snake->y[i]=snake->y[i-1]; } } /******移动*************************************************************************/ void move_snake(HANDLE hOut,struct Snake *snake) { gotoxy(hOut,snake->x[0],snake->y[0]); printf(" "); /* 清除尾*/ for(i=1;i<snake->length;i++) {/* 后一节的坐标依次取代前一节的坐标 */ snake->x[i-1]=snake->x[i]; snake->y[i-1]=snake->y[i]; } } /******打印*************************************************************************/ void print_snake(HANDLE hOut,struct Snake *snake) { for(i=0;i<snake->length;i++) { gotoxy(hOut,snake->x[i],snake->y[i]); if(i==0) { printf("○"); //打印尾 } else if(i==snake->length-1) { printf("¤"); //打印头 } else { printf("⊙"); //打印身 } } } /******随机产生食物*******************************************************************/ void get_food(HANDLE hOut,struct Snake *snake,struct Food *food) { srand((unsigned)time(NULL)); //初始化随机数 while(1) {/* 产生食物的条件:1.在游戏窗口内 2.不在的身上 */ food->x = rand() % (Frame_width-1); food->y = rand() % Frame_height; if( food->x==0 || food->y==0 ) { continue; } food->x = 2*food->x + FrameX; //得到食物的横坐标 food->y+=FrameY; //得到食物的竖坐标 for(i=0;i<snake->length;i++) {/* 判断食物是否在的身上,如果在身上,则重新产生;否则,打印身 */ if( food->x==snake->x[i] && food->y==snake->y[i] ) { break; } } if(i==snake->length) { gotoxy(hOut,food->x,food->y); printf("⊙"); break; } } } /******吃食物***************************************************************************/ void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food) { if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y ) {/* 如果头位置与食物位置相同,吃食物 */ snake->length++; //吃一个食物,身增长一节 for(i=snake->length-1;i>=1;i--) {/* 后节坐标依次赋值给前一节的坐标,依次得到身及头的坐标 */ snake->x[i]=snake->x[i-1]; snake->y[i]=snake->y[i-1]; } snake->x[0]=a[0]; //得到尾移动前的横坐标 snake->y[0]=a[1]; //得到尾移动前的竖坐标 get_food(hOut,snake,food); //重新产生食物 snake->count++; //食物的个数增1 if( snake->count%5==0 ) {/* 当吃Up_level个食物时,速度加快Up_speed毫秒并且升一级 */ snake->speed-=50; } } } /******穿墙**********************************************************************************/ void through_wall(HANDLE hOut,struct Snake *snake,char ch) { if( ch==72 && snake->y[snake->length-1]==FrameY) { snake->y[snake->length-1] = FrameY+Frame_height-1; //如果在上框且向上移动,穿墙 } if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height ) { snake->y[snake->length-1] = FrameY+1; //如果在下框且向下移动,穿墙 } if( ch==75 && snake->x[snake->length-1]==FrameX ) { snake->x[snake->length-1] = FrameX+2*Frame_width-4; //如果在左框且向左移动,穿墙 } if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 ) { snake->x[snake->length-1] = FrameX+2; //如果在右框且向右移动,穿墙 } } /******判断是否死**************************************************************************/ int if_die(struct Snake *snake) {/* 当头碰到自身时,死 ,返回值为0 */ for(i=0;i<snake->length-1;i++) { if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] ) { return 0; } } return 1; } /******开始游戏*******************************************************************************/ void start_game() { unsigned char ch=77; //定义用于接收键盘输入的字符变量 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量 struct Snake s,*snake=&s; //定义的结构体指针并指向的结构体 struct Food f,*food=&f; //定义食物的结构体指针并指向食物的结构体 make_frame(); //制作游戏窗口 init_snake(snake); //初始化 get_food(hOut,snake,food); //随机产生食物 while(1) { print_information(hOut,snake,food); //打印菜单信息 a[0]=snake->x[0]; //记住尾的横坐标 a[1]=snake->y[0]; //记住尾的竖坐标 j=0; if(kbhit()) //unknow {/* 判断是否按下键盘,如果按下,ch接收键盘输入 */ ch=getch(); if(kbhit()) {/* 如果长按键盘,则加速 */ Sleep(20); //unknow j=1; } } switch(ch) { case 72: {/* 向上移动 */ move_snake(hOut,snake); //移动 snake->y[snake->length-1]-=1; //头的竖坐标向上移,即减1 break; } case 80: {/* 向下移动 */ move_snake(hOut,snake); //移动 snake->y[snake->length-1]+=1; //头的竖坐标向下移,即加1 break; } case 75: {/* 向左移动 */ move_snake(hOut,snake); //移动 snake->x[snake->length-1]-=2; //头的横坐标向左移,即减2 break; } case 77: {/* 向右移动 */ move_snake(hOut,snake); //移动 snake->x[snake->length-1]+=2; //头的横坐标向右移,即加2 break; } } through_wall(hOut,snake,ch); //穿墙 eat_food(hOut,snake,food); //吃食物 print_snake(hOut,snake); //打印 if( if_die(snake)==0 || ch==27 || snake->speed==50 ) {/* 游戏结束条件:1.碰到自身 2.按Esc键 3.速度为50ms */ gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1); printf("Game Over"); Sleep(2000); break; } if(j==0) { Sleep(snake->speed); //延迟时间 } else { Sleep(10); } } } int main() { system("color 0D"); //设置文本为粉红色 start_game(); //开始游戏 over_game(); //结束游戏 }
C语言贪吃代码可以通过合理的算法设计和简洁的代码实现。以下是一个简短的示例: ```c #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> int width = 20; // 游戏界面宽度 int height = 20; // 游戏界面高度 int gameOver = 0; int score = 0; int snakeX[100], snakeY[100]; // 身坐标 int snakeLength = 1; // 身长度 int fruitX, fruitY; // 水果坐标 enum Direction { STOP = 0, UP, DOWN, LEFT, RIGHT }; // 运动方向 enum Direction dir; void Setup() { srand(time(NULL)); gameOver = 0; dir = STOP; snakeX[0] = width / 2; snakeY[0] = height / 2; fruitX = rand() % (width - 1); fruitY = rand() % (height - 1); score = 0; } void Draw() { system("cls"); for (int i = 0; i < width+2; i++) printf("#"); printf("\n"); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (j == 0) printf("#"); if (i == snakeY[0] && j == snakeX[0]) printf("O"); else if (i == fruitY && j == fruitX) printf("@"); else { int tailPrinted = 0; for (int k = 1; k < snakeLength; k++) { if (snakeX[k] == j && snakeY[k] == i) { printf("o"); tailPrinted = 1; break; } } if (!tailPrinted) printf(" "); } if (j == width - 1) printf("#"); } printf("\n"); } for (int i = 0; i < width+2; i++) printf("#"); printf("\n"); printf("Score: %d\n", score); } void Input() { if (_kbhit()) { switch (_getch()) { case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'x': gameOver = 1; break; } } } void Logic() { int prevX = snakeX[0]; int prevY = snakeY[0]; int prev2X, prev2Y; snakeX[0] += (dir == RIGHT) ? 1 : (dir == LEFT) ? -1 : 0; snakeY[0] += (dir == DOWN) ? 1 : (dir == UP) ? -1 : 0; for (int i = 1; i < snakeLength; i++) { prev2X = snakeX[i]; prev2Y = snakeY[i]; snakeX[i] = prevX; snakeY[i] = prevY; prevX = prev2X; prevY = prev2Y; } if (snakeX[0] >= width || snakeX[0] < 0 || snakeY[0] >= height || snakeY[0] < 0) gameOver = 1; for (int i = 1; i < snakeLength; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) gameOver = 1; } if (snakeX[0] == fruitX && snakeY[0] == fruitY) { score += 10; fruitX = rand() % (width - 1); fruitY = rand() % (height - 1); snakeLength++; } } int main() { Setup(); while (!gameOver) { Draw(); Input(); Logic(); // 控制游戏速度 _sleep(10); } return 0; } ``` 以上代码为一个采用字符界面的简易贪吃游戏实现,具备基本的的移动、水果的生成与吃掉、边界碰撞和自身碰撞判断、分数统计等功能。同时,程序采用了简短的代码实现游戏的逻辑处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值