纯手工贪吃蛇 (纯c编写的控制台游戏)
2021/9/23 23:10:57
本文主要是介绍纯手工贪吃蛇 (纯c编写的控制台游戏),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
编程究极菜鸟时期的作品,放出来有点羞耻hhh
没什么厉害的地方,但是能跑!
对于编程菜鸟来说是非常有成就感的!
#include <iostream> #include <ctime> #include <windows.h> #include <cstdlib> #define null 0 #define up 1 #define left 2 #define down 3 #define right 4 using namespace std; struct snakenode//定义蛇 { int x,y; snakenode* next; }; typedef snakenode* snake;//snake是指针型变量 snake head=null,q=null,q1=null,food;//head为蛇的头,q用来遍历蛇的身体,初始时指向空 int status=right;//为蛇的运动方向 int score=-1; int speed=100; 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 creatsnake()//创建一条以head为首,长度为四的蛇(没打印出来) { snake tail; tail=(snake)malloc(sizeof(snakenode)); tail->x=24; tail->y=5; tail->next=null; for(int i=1;i<=4;i++) { head=(snake)malloc(sizeof(snakenode)); head->x=24+i; head->y=5; head->next=tail; tail=head; } } void creatfood() { food=(snake)malloc(sizeof(snakenode)); srand((unsigned)time(NULL));//时间种子 food->x=rand()%56+1;//保证食物在边界内 food->y=rand()%22+1; food->next=null; score++; if(speed>=50) { speed-=5; } } int isfoodeat() { int k=0; if(head->x==food->x&&head->y==food->y)//头和食物重叠 { k=1; } return k; } void mapprint() { for(int i=0;i<58;i++)//打印横轴 { Pos(i,0); cout << "%"; Pos(i,24); cout << "%"; } for(int i=0;i<24;i++)//打印纵轴 { Pos(0,i); cout << "%"; Pos(58,i); cout << "%"; } cout << endl; } void snakeprint() { if(isfoodeat())//吃了食物,打印不少节点 { q=head;//让全局指针变量q指向蛇的头 while(q!=null)//q指向null时跳出循环 { Pos(q->x,q->y); cout << "@"; q=q->next; } } else//没吃食物,每次打印都会少一个节点 { q=head;//让全局指针变量q指向蛇的头 while(q->next->next!=null)//q指向倒数第二个时跳出循环 { Pos(q->x,q->y); cout << "@"; q=q->next; } Pos(q->x,q->y);//将倒数第二个打印出来 cout << "@"; q1=q->next;//利用q1将最后一个节点free掉 q->next=null;//蛇的尾巴指向null free(q1); } } void foodprint() { if(isfoodeat())//如果食物被吃了 (head与food重叠) ,创建一个新食物 { free(food);//释放原来food的内存 creatfood(); } else//如果食物没被吃,打印 { Pos(food->x,food->y); cout << '$'; } } void scoreprint() { Pos(70,12); cout << "score=" << score; } void movesnake() { if(status==up)//向上爬 { snake New;//创建一个新节点 New=(snake)malloc(sizeof(snakenode)); New->x=head->x; New->y=(head->y)-1; New->next=head; head=New;//成功向前一步 } if(status==down)//向下爬 { snake New;//创建一个新节点 New=(snake)malloc(sizeof(snakenode)); New->x=head->x; New->y=(head->y)+1; New->next=head; head=New;//成功向前一步 } if(status==left)//向左爬 { snake New;//创建一个新节点 New=(snake)malloc(sizeof(snakenode)); New->x=(head->x)-1; New->y=(head->y); New->next=head; head=New;//成功向前一步 } if(status==right)//向右爬 { snake New;//创建一个新节点 New=(snake)malloc(sizeof(snakenode)); New->x=(head->x)+1; New->y=(head->y); New->next=head; head=New;//成功向前一步 } } void startgame() { creatsnake();//创建一条链表蛇,先不打印 creatfood();//创建一个食物,先不打印 } int isdead()//撞墙死,咬自己死 { int k=0; if(head->x==0||head->x==57||head->y==0||head->y==23) { k=1; } q=head->next; while(q!=0) { if(head->x==q->x&&head->y==q->y) { k=1; } q=q->next; } return k; } void stop() { while(1) { if(GetAsyncKeyState(VK_SPACE)) { break; } } } void gamecircle() { while(1)//一直循环 { if(isdead())//死了 { break;//break出去就endgame了 } else { mapprint(); snakeprint(); foodprint(); scoreprint(); Sleep(speed);//暂停画面 system("cls");//清屏 if(GetAsyncKeyState(VK_UP)&&status!=down)//判断是否转向 { status=up; } else if(GetAsyncKeyState(VK_DOWN)&&status!=up) { status=down; } else if(GetAsyncKeyState(VK_LEFT)&&status!=right) { status=left; } else if(GetAsyncKeyState(VK_RIGHT)&&status!=left) { status=right; } else if(GetAsyncKeyState(VK_SPACE)) { stop(); } else if(GetAsyncKeyState(VK_ESCAPE)) { break; } movesnake(); } } } void freeall() { free(food); q=head; while(q!=null) { q=q->next; free(head); head=q; } } void endgame() { system("cls"); Pos(24,6); cout << "gameover" << endl << "your score is " << score; freeall(); } int main() { startgame(); gamecircle(); endgame(); return 0; }
这篇关于纯手工贪吃蛇 (纯c编写的控制台游戏)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享