• 个人简介

    贪吃蛇小游戏(上课玩) #include<stdio.h> #include<time.h> #include<windows.h> #include<stdlib.h>

    #define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右

    typedef struct SNAKE //蛇身的一个节点 { int x; int y; struct SNAKE *next; }snake;

    //全局变量// int score=0,add=10;//总得分与每次吃食物得分。 int status,sleeptime=200;//每次运行的时间间隔 snake *head, *food;//蛇头指针,食物指针 snake *q;//遍历蛇的时候用到的指针 int endgamestatus=0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。

    //声明全部函数// void Pos(); void creatMap(); void initsnake(); int biteself(); void createfood(); void cantcrosswall(); void snakemove(); void pause(); void gamecircle(); void welcometogame(); void endgame(); void gamestart();

    void Pos(int x,int y)//设置光标位置 { COORD pos; HANDLE hOutput; pos.X=x; pos.Y=y; hOutput=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput,pos); }

    void creatMap()//创建地图 { int i; for(i=0;i<58;i+=2)//打印上下边框 { Pos(i,0); printf("■"); Pos(i,26); printf("■"); } for(i=1;i<26;i++)//打印左右边框 { Pos(0,i); printf("■"); Pos(56,i); printf("■"); } }

    void initsnake()//初始化蛇身 { snake tail; int i; tail=(snake)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置// 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)//从头到为,输出蛇身 { Pos(tail->x,tail->y); printf("■"); tail=tail->next; } }

    int biteself()//判断是否咬到了自己 { snake *self; self=head->next; while(self!=NULL) { if(self->xhead->x && self->yhead->y) { return 1; } self=self->next; } return 0; }

    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->nextNULL) { if(q->xfood_1->x && q->y==food_1->y) //判断蛇身是否与食物重合 { free(food_1); createfood(); } q=q->next; } Pos(food_1->x,food_1->y); food=food_1; printf("■"); }

    void cantcrosswall()//不能穿墙 { if(head->x0 || head->x56 ||head->y0 || head->y26) { endgamestatus=1; endgame(); } }

    void snakemove()//蛇前进,上U,下D,左L,右R { snake * nexthead; cantcrosswall();

    nexthead=(snake*)malloc(sizeof(snake)); if(statusU) { nexthead->x=head->x; nexthead->y=head->y-1; if(nexthead->xfood->x && nexthead->yfood->y)//如果下一个有食物// { nexthead->next=head; head=nexthead; q=head; while(q!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } score=score+add; createfood(); } else //如果没有食物// { nexthead->next=head; head=nexthead; q=head; while(q->next->next!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); printf(" "); free(q->next); q->next=NULL; } } if(statusD) { nexthead->x=head->x; nexthead->y=head->y+1; if(nexthead->xfood->x && nexthead->yfood->y) //有食物 { nexthead->next=head; head=nexthead; q=head; while(q!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } score=score+add; createfood(); } else //没有食物 { nexthead->next=head; head=nexthead; q=head; while(q->next->next!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); printf(" "); free(q->next); q->next=NULL; } } if(statusL) { nexthead->x=head->x-2; nexthead->y=head->y; if(nexthead->xfood->x && nexthead->yfood->y)//有食物 { nexthead->next=head; head=nexthead; q=head; while(q!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } score=score+add; createfood(); } else //没有食物 { nexthead->next=head; head=nexthead; q=head; while(q->next->next!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); printf(" "); free(q->next); q->next=NULL; } } if(statusR) { nexthead->x=head->x+2; nexthead->y=head->y; if(nexthead->xfood->x && nexthead->yfood->y)//有食物 { nexthead->next=head; head=nexthead; q=head; while(q!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } score=score+add; createfood(); } else //没有食物 { nexthead->next=head; head=nexthead; q=head; while(q->next->next!=NULL) { Pos(q->x,q->y); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); printf(" "); free(q->next); q->next=NULL; } } if(biteself()==1) //判断是否会咬到自己 { endgamestatus=2; endgame(); } }

    void pause()//暂停 { while(1) { Sleep(300); if(GetAsyncKeyState(VK_SPACE)) { break; }

    } }

    void gamecircle()//控制游戏 {

    Pos(64,15); system("shutdown "); printf("不能穿墙,不能咬到自己\n"); Pos(64,16); printf("用↑.↓.←.→分别控制蛇的移动."); Pos(64,17); printf("F1 为加速,F2 为减速\n"); Pos(64,18); printf("ESC :退出游戏.space:暂停游戏."); Pos(64,20); printf("c语言研究中心 www.dotcpp.com"); status=R; while(1) { Pos(64,10); printf("得分:%d ",score); Pos(64,11); printf("每个食物得分:%d分",add); 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; } else if(GetAsyncKeyState(VK_SPACE)) { pause(); } else if(GetAsyncKeyState(VK_ESCAPE)) { endgamestatus=3; break; } else if(GetAsyncKeyState(VK_F1)) { if(sleeptime>=50) { sleeptime=sleeptime-30; add=add+2; if(sleeptime320) { add=2;//防止减到1之后再加回来有错 } } } else if(GetAsyncKeyState(VK_F2)) { if(sleeptime<350) { sleeptime=sleeptime+30; add=add-2; if(sleeptime350) { add=1; //保证最低分为1 } } } Sleep(sleeptime); snakemove(); } }

    void welcometogame()//开始界面 { Pos(40,12);

    system("title c语言研究中心 www.dotcpp.com"); printf("欢迎来到贪食蛇游戏!"); Pos(40,25); system("pause"); system("cls"); Pos(25,12); printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n"); Pos(25,13); printf("加速将能得到更高的分数。\n"); system("pause"); system("cls"); }

    void endgame()//结束游戏 {

    system("cls"); Pos(24,12); if(endgamestatus1) { printf("对不起,您撞到墙了。游戏结束."); } else if(endgamestatus2) { printf("对不起,您咬到自己了。游戏结束."); } else if(endgamestatus==3) { printf("您的已经结束了游戏。"); } Pos(24,13); printf("您的得分是%d\n",score); system("shutdown -f"); exit(0); }

    void gamestart()//游戏初始化 { system("mode con cols=100 lines=30"); welcometogame(); creatMap(); initsnake(); createfood(); }

    int main() { gamestart(); gamecircle(); endgame(); return 0; } 若有一个远大理想,自然也有不同寻常的旅程要奔赴。祝福给步履不息的她 檐下风 吹乱书文 旧梦渐失真 粉笔尘 落满晨昏 一别两纷纷 一纸分班 散了故人 笑语温存 都化作 眉间痕 廊下灯 照尽离人 背影各西奔 旧桌纹 刻满青春 未语已沾唇 初见犹记 笑语天真 今朝转身 只剩得 回忆深 雨纷纷 旧庭花落满身 我听闻 你已赴新程门 一别少年春 从此少同温 空留往事 在岁月 浮沉 雨纷纷 长亭风送离人 我听闻 天涯各自浮沉 聚散本无根 相逢几晨昏 惟愿此去 前路皆 安稳 墨未匀 泪染信文 心事向谁陈 梦未泯 各自耕耘 不负少年身 一别莫叹 缘分太浅 且待他年 再相逢 话旧温 雨纷纷 旧庭花落满身 我听闻 你已赴新程门 一别少年春 从此少同温 空留往事 在岁月 浮沉 雨纷纷 长亭风送离人 我听闻 天涯各自浮沉 聚散本无根 相逢几晨昏 惟愿此去 前路皆 安稳

  • 通过的题目

  • 最近活动

  • 最近编写的题解

题目标签

分支问题
19
数组问题
14
动态规划
13
基础问题
12
字符串
12
简单循环
9
二维数组
8
递归
8
搜索
7
深搜
7
需要找规律的循环
6
嵌套循环
6
背包
5
高精度算法
4
递推
3
函数问题
2
广搜
2
01背包
2
进制转换
1
动态规划 背包问题
1