一直想自己编写一款游戏,终于,因为疫情实在没事干,我动手了。 作为一个菜鸟,虽然心比天高,奈何实际动手能力为零,写写贪吃蛇它不香吗?就这样,我双击点开了百度。
网上代码挺多,大同小异,随便挑选了一篇开始了我的借鉴之路。越看我越明白一个道理,基础不牢地动山摇,看个贪吃蛇代码都挺费劲,我这么菜吗?
我选择狗带。
咸鱼几天后,突然想起来我的雄心壮志,连忙从侧卧改成平躺,还是绿婆娘好看。
时间的脚步不会因为你流下的口水而暂缓,开学的钟声已然快要漫进耳旁,往日里娇憨可爱的绿婆娘在我眼里变得索然无味,我该干点什么了。
小目标还没完成,贪吃蛇我对不起你!
我敲下了第一行代码 #include<stdio.h>
脑袋空空的???什么模块化、自顶向下、逐步求精???
我又打开别人的代码,一边借鉴一边理解,原来要分这么多个函数,这个是模块化吧。用多个函数把贪吃蛇骨架搭起来,我终于找到了方向,剩下的只是把函数的内容填充上去就可以了。
有些函数由于实在看不懂,只得照搬,这个:
void gotoxy(int x,int y) { COORD pos; HANDLE hOutput; pos.X = x; pos.Y = y; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, pos); }
控制光标移动,以前确实没见过,具体怎么实现的我不知道,能用就行。
在控制蛇的速度一块,之前我想的是用无意义的计算来占用时间,以达到控制效果:
for(i=0;i<99999999;i++);
后来百度一下,发现还有 sleep() 这么好用的函数,当即采用。
这个
int ClickControl() { while (1) { if (jieshu() == 0)return 0; if (_kbhit()) { click = _getch(); } move(); eat(); } return 1; }
_kbhit()是一个非阻塞函数,可以获得键盘信号,无动作返回0,有动作返回1,通过这个函数可以控制蛇的方向,当键盘输入上下左右后,执行句就会将方向赋给click,这样就可以在后面的选择语句中进入转向函数。
我真是太厉害了。
把代码全部理解后的那种成就感,就好像解开了一道高数题。
然后我就开始敲自己的代码,调试、运行、调试、运行、调试......
叮!恭喜玩家捕捉贪吃蛇一条。
代码放这了,还有很多问题,我也不改了
#include <stdio.h> #include <string.h> #include <windows.h> #include <time.h> #include <conio.h> #define up 'w' #define down 's' #define right 'd' #define left 'a' #define up 'W' #define down 'S' #define right 'D' #define left 'A' void welcome();//开始界面// void finish();//结束// void gotoxy(int x, int y);//控制光标// void creatwall();//打印围墙// void gotohua(int x, int y);//打印// void gotochu(int x, int y);//删除// void creatfood();//产生食物// int ClickControl();//获取键盘信号函数// int jieshu();//判断结束// void move();//移动身体// void eat();//吃到食物// void changebody(int a,int b);//改变身体// void stop(); typedef struct snakes { int x; int y; struct snakes* next; }snake; snake* tou, * wei; struct food { int x; int y; }food; char name[20] = { 0 }; int score = 0; char click = right; int nandu=5; int main() { system("color 0B"); welcome(); creatwall(); creatfood(); if (ClickControl() == 0) { finish(); return 0; } return 0; } void gotoxy(int x,int y) { COORD pos; HANDLE hOutput; pos.X = x; pos.Y = y; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, pos); } void welcome() { gotoxy(30, 3); printf("********************************************************"); gotoxy(43, 10); printf("玩家你好,欢迎来到贪吃蛇游戏!"); gotoxy(50, 12); printf("请输入名字:"); gotoxy(46,17); printf("请输入难度(请填数字):"); gotoxy(23,19); printf("1:白痴都能通关 2:平凡如你 3:哟?有点厉害啊 4:卧槽!牛逼 5:嘶!恐怖如斯"); gotoxy(30, 26); printf("********************************************************"); gotoxy(61,12) ; scanf("%s",&name); gotoxy(67,17) ; scanf("%d",&nandu); } void gotohua(int x, int y) { gotoxy(x, y); printf("*"); } void gotochu(int x, int y) { gotoxy(x, y); printf(" "); } void creatwall() { int i,j; for(i=0;i<30;i++) for(j=0;j<150;j++) { gotochu(j,i); } for (i = 0;i < 80;i+=2) { gotohua(i, 0); gotohua(i, 29); } for (i = 0;i < 30; i++) { gotohua(0, i); gotohua(80, i); } gotoxy(87, 9); printf("亲爱的%s玩家,快来玩我呀!", name); gotoxy(84, 14); printf("你已经吃了 0 个了,偶!真是遭极了。"); gotoxy(86, 19); printf("本游戏由**工作室荣誉开发"); gotoxy(93,28); printf("wsad控制方向"); gotoxy(85,29); printf("其余任意键暂停,双击wsad恢复"); snake* p, * q,*z; tou = (snake*)malloc(sizeof(snake)); tou->x = 7; tou->y = 15; wei= (snake*)malloc(sizeof(snake)); wei->x = 4; wei->y = 15; p= (snake*)malloc(sizeof(snake)); p->x = 6; p->y = 15; z= (snake*)malloc(sizeof(snake)); z->x = 5; z->y = 15; tou->next = p; p->next = z; z->next = wei; wei->next = NULL; q = tou; while(q != NULL) {gotohua(q->x, q->y);q = q->next; } } void creatfood() { srand((unsigned)time(NULL)); food.x = rand() % 80 + 1; food.y= rand() % 28 + 1; snake* p; p = tou; while (1) { if (p->x == food.x && p->y == food.y) { food.x = rand() % 80 + 1; food.y = rand() % 28 + 1; p = tou; } else { p = p->next; } if (p == NULL)break; } gotoxy(food.x,food.y); printf("*"); } int jieshu() { if (tou->x == 0 || tou->x == 80 || tou->y == 0 || tou->y == 29)return 0; snake* p; p = tou->next; while (p != NULL) { if (p->x == tou->x && p->y == tou->y)return 0; p = p->next; } return 1; } int ClickControl() { while (1) { if (jieshu() == 0)return 0; if (_kbhit()) { click = _getch(); } move(); eat(); } return 1; } void move() { int a = tou->x, b = tou->y; snake* p = tou; while (p!=NULL) { gotochu(p->x, p->y); p = p->next; } switch (click) { case up: case '24': tou->y -= 1; changebody(a, b); break; case down: case '25': tou->y += 1; changebody(a, b); break; case right: case '26': tou->x += 1; changebody(a, b); break; case left: case '27': tou->x -= 1; changebody(a, b); break; default: stop(); break; } switch (nandu)//调节速度 { case 1: Sleep(20); break; case 2: Sleep(50); break; case 3: Sleep(70); break; case 4: Sleep(100); break; case 5: Sleep(200); break; } } void changebody(int a, int b) { snake* p = tou->next; int q1, q2, qq1, qq2; q1 = p->x, q2 = p->y; while (p->next!=NULL) { qq1 = p->next->x; qq2 = p->next->y; p->next->x = q1; p->next->y = q2; q1 = qq1; q2 = qq2; p = p->next; } p = tou->next; p->x = a; p->y = b; snake *pp; pp=tou; while(pp!=NULL) { gotohua(pp->x,pp->y); pp=pp->next; } } void eat() { if (tou->x == food.x && tou->y == food.y) { creatfood(); snake* _new = (snake*)malloc(sizeof(snake)); snake* p; p = tou; while (1) { if (p->next->next == NULL) break; p = p->next; } p->next = _new; _new->next = wei; score += 1; gotoxy(95, 14); printf("%d", score); } } void finish() { int i,j; for(i=0;i<30;i++) for(j=0;j<150;j++) { gotochu(j,i); } gotoxy(30, 6); printf("********************************************************"); gotoxy(44, 13); printf("欧,我的上帝!你真是逊毙了。"); gotoxy(53, 15); printf("游戏结束"); gotoxy(30, 21); printf("********************************************************"); gotoxy(0,25); } void stop() { snake *p; p=tou; while(p!=NULL) { gotohua(p->x,p->y); p=p->next; } getch(); }