|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 高山 于 2022-9-18 18:02 编辑
说明
本帖子需要自定义color函数,定义方法请见https://fishc.com.cn/thread-216662-1-1.html(完整版不需要加任何代码),本帖为付费贴,内容自带敌人幽灵切割,回复(一共奖励一次)有70%几率全额退回鱼币
奖励版(购买后在第七版块也会显示)
名称/项目 | 昵称 | 查看传送门 | 中奖回帖(仅1次,70%的中奖率) | 一点点儿 | 点此 | 最佳回帖(置顶展示的回帖) | 一点点儿 | 点此
|
1、作品介绍
贪吃蛇是一款经典的游戏,本创作在保留原有功能下,创作了幽灵
幽灵(符号为▲)会跟踪贪吃蛇(注意分清蛇与幽灵),被幽灵抓到即为结束游戏。贪吃蛇吃一个食物(符号为◆)加一分,速度也会变快。
2、收费说明
本帖为付费贴,某个回复人(仅一次)有70%几率把作品查看费完全打回,下面的代码块和非完整版代码是一样的,非完整版降价免费,完整版附件收费降至1鱼币鱼币。
如果不想自己加代码,请到文末下载完整版
3、非完整版代码(代码块和非完整版的代码是一样的,color定义链接在上方或往下看)
- #include<windows.h>
- #include<bits/stdc++.h>
- using namespace std; //命名空间
- void gotoxy(intvoid gotoxy(int x, int y) {
- COORD pos = { x,y };
- HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
- SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
- }
- void start(){
- char ans;
- color(2);//设置颜色
- gotoxy(12,10);//将光标移至坐标为(12,10)的位置
- cout<<"★贪 吃 蛇★";//输出提示语
- gotoxy(12,12);
- cout<<"开始请输入y:";
- cin>>ans;
- if(ans!='y'){
- exit(0);
- }
- }
- int map_x=31,map_y=25;
- void nav(){
- color(6);
- for(int i=0;i<=map_x;i++){
- Sleep(10);//等待10ms
- gotoxy(i,map_y);
- cout<<"□";
- gotoxy(i,0);
- cout<<"□";
- }
- for(int i=0;i<=map_y;i++){
- gotoxy(0,i);
- cout<<"□";
- gotoxy(map_x,i);
- cout<<"□";
- }
- color(15);
- /*for(int i=1;i<=29;i++){//一列一列输出
- for(int j=1;j<=23;j++){
- Sleep(10);
- gotoxy(i,j);
- cout<<"■";
- }
- } */
- for(int i=1;i<=map_y-1;i++){//一行一行输出
- for(int j=1;j<=map_x-1;j++){
- //Sleep(10);
- gotoxy(j,i);
- cout<<"■";
- }
- }
- }
- int snake_x[50],snake_y[50],snake_len;
- void snake_coor(){
- srand(time(0));
- snake_x[0] = rand()%(map_x-1)+1;
- snake_y[0] = rand()%(map_y-1)+1;
- snake_len = 1;
- for(int i=1;i<snake_len;i++){
- snake_x[i]=snake_x[0]-i;
- snake_y[i]=snake_y[0];
- }
- }
- void draw_snake(){//通过循环的方式画蛇头以及蛇身
- color(5);
- for(int i=0;i<snake_len;i++){
- gotoxy(snake_x[i],snake_y[i]);
- if(i==0)
- cout<<"×";
- else
- cout<<"●";
- }
- //exit(0);
- }
- int food_x,food_y;
- void food_coor(){
- bool same=false;//食物跟蛇是否发生了重合,如果重合了,那么same就是true,否则是false
- while(true){//无限循环地生成食物的坐标,直到食物跟蛇补充和为止
- food_x = rand()%(map_x-1)+ 1;
- food_y = rand()%(map_y-1) + 1;
- //检测食物是否跟蛇发生了重合,如果有.则重新生成食物的坐标
- for(int i=0;i<snake_len;i++){
- if(snake_x[i]==food_x&&snake_y[i]==food_y)
- same=true;
- }
- if(same==false)//same为false,代表蛇没有跟食物发生重合,可以退出循环了
- break; //退出无限循环
- same=false;
- }
- }
- void draw_food(){
- color(4);
- gotoxy(food_x,food_y);
- cout<<"◆";
- }
- int ghost_x,ghost_y;
- void ghost_coor(){
- bool same=false;//幽灵跟食物跟蛇是否发生了重合,如果重合了,那么same就是true,否则是false
- while(true){//无限循环地生成食物的坐标,直到食物跟蛇补充和为止
- ghost_x = rand()%(map_x-1)+ 1;
- ghost_y = rand()%(map_y-1) + 1;
- //检测食物是否跟蛇发生了重合,如果有.则重新生成食物的坐标
- for(int i=0;i<snake_len;i++){
- if(snake_x[i]==ghost_x&&snake_y[i]==ghost_y)
- same=true;
- }
- if(same==false)//same为false,代表蛇没有跟食物发生重合,可以退出循环了
- break; //退出无限循环
- same=false;
- }
- }
- void draw_ghost(){
- color(4);
- gotoxy(ghost_x,ghost_y);
- cout<<"▲";
- }
- void draw_score(){
- color(4);
- gotoxy(0,map_y+1);
- cout<<"长度为:"<<snake_len;
- }
- void draw_blank(){//画地图,把旧的蛇覆盖 ,把旧星星覆盖
- color(15);
- for(int i=0;i<snake_len;i++){
- gotoxy(snake_x[i],snake_y[i]);
- cout<<"■";
- }
- gotoxy(ghost_x,ghost_y);
- cout<<"■";
- }
- char dir='R';//direction方向 ,R--right,L--left,U--up,D--down
- void snake_move(){//根据当前的方向移动一步
- draw_blank();//覆盖蛇的旧位置
- for(int i=snake_len-1;i>=1;i--){
- snake_x[i]=snake_x[i-1];
- snake_y[i]=snake_y[i-1];
- }
- if(dir=='U'){
- snake_y[0]--;
- }
- else if(dir=='D'){
- snake_y[0]++;
- }
- else if(dir=='L'){
- snake_x[0]--;
- }
- else if(dir=='R'){
- snake_x[0]++;
- }
- }
- bool ghost_flag=false;
- void ghost_move(){//幽灵向着蛇移动一步
- ghost_flag=!ghost_flag;
- if(ghost_flag)
- return;
- if(snake_x[0]>ghost_x)
- ghost_x++;
- else if(snake_x[0]<ghost_x)
- ghost_x--;
- else if(snake_y[0]>ghost_y)
- ghost_y++;
- else if(snake_y[0]<ghost_y)
- ghost_y--;
- }
- void detect_eat(){//检测是否吃到了食物
- if(snake_x[0]==food_x && snake_y[0]==food_y){
- snake_x[snake_len]=snake_x[snake_len-1]*2-snake_x[snake_len-2];
- snake_y[snake_len]=snake_y[snake_len-1]*2-snake_y[snake_len-2];
- snake_len++;
- food_coor();//吃到了,就再随机生成一个食物的新坐标
- draw_food();//画一下食物
- draw_score();//重新画上更新后的分数
- }
- }
- void detect_cut(){//检测是否碰到了幽灵
- for(int i=1;i<snake_len;i++)
- if(snake_x[i]==ghost_x&&snake_y[i]==ghost_y){
- snake_len=i;
- return;
- }
- }
- void detect_failure(){//检测撞墙以及撞自己的情况是否发生
- //蛇头撞在了上边界,意味着y是0;蛇头撞到了下边界,意味着y是map_y
- //蛇头撞在了左边界,意味着x是0;蛇头撞到了右边界,意味着x是map_x
- if(snake_y[0]==0||snake_y[0]==map_y||snake_x[0]==0||snake_x[0]==map_x){
- exit(0);
- }
- //撞到了自己,意味着蛇头撞到了蛇身,也就是蛇头的坐标与蛇身的某一个坐标发生了重合
- for(int i=1;i<snake_len;i++)
- if(snake_x[0]==snake_x[i]&&snake_y[0]==snake_y[i]){
- exit(0);
- }
- if(snake_x[0]==ghost_x&&snake_y[0]==ghost_y)
- exit(0);
- }
- void detect_key(){//如果按下了键盘上的方向键,则更新贪吃蛇的方向
- if(kbhit()){//kbhit的功能是返回键盘上的按键,如果返回值为0,代表没按
- char key = getch();//获取在键盘上按下的按键
- if(key=='w')
- dir='U';
- else if(key=='s')
- dir='D';
- else if(key=='a')
- dir='L';
- else if(key=='d')
- dir='R';
- }
- }
- int main(){
- start();
- nav();
- snake_coor();//生成贪吃蛇的坐标
- draw_snake();
- food_coor();//生成食物的坐标
- draw_food();
- ghost_coor();//生成幽灵的坐标
- draw_ghost();
- draw_score();//画分数
- //让贪吃蛇一直移动
- //同时检测在某一个时刻是否按下了按键,如果有,则去更新方向
- while(true){//无限循环
- detect_key();//检测是否按下了按键
- snake_move(); //贪吃蛇沿着原来的方向移动一步
- ghost_move();//幽灵向着蛇移动
- detect_eat();//检测蛇是否吃到了食物
- detect_cut();//检测蛇身是否碰到了幽灵
- detect_failure();//检测蛇是否碰到了自己或者墙壁,导致失败
- draw_snake(); //画新位置的蛇
- draw_ghost(); //画新位置的幽灵
- draw_food(); //重新画食物
- Sleep(500/snake_len);//让游戏暂缓
- }
- return 0;
- }
复制代码
4、color定义方法
帖子
5、附件说明
压缩包为360压缩专用,请使用3.0以上的版本查看。
360压缩安装链接:☞戳我
解压密码:fishc
普通版
贪吃蛇.zip
(2.25 KB, 下载次数: 8)
完整版(不用另行添加,解压密码fishc):
贪吃蛇完整版.zip
(2.54 KB, 下载次数: 49, 售价: 1 鱼币)
6、回复说明
7板块将会公示2种类型的回帖
中奖回帖:触发70%中奖的回帖
最佳回帖:最佳回复,将会置顶展示
7、回帖看板
快来回复吧!
名称/项目 | 昵称 | 查看传送门 | 中奖回帖(仅1次,70%的中奖率) | 一点点儿 | 点此 | 最佳回帖(置顶展示的回帖) | 一点点儿 | 点此 | 8、结语
感谢你看到这里,如果你有建议,欢迎跟我交流,我将会第一时间查看你的建议。
再次表示感谢!
别急着走~先评个分呗
|
|