鱼C论坛

 找回密码
 立即注册
查看: 3387|回复: 18

[作品展示] 作品:C++的贪吃蛇(幽灵切割版,回复3鱼币)

[复制链接]
发表于 2022-8-16 12:15:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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压缩安装链接:&#9758;戳我
解压密码:fishc
普通版
贪吃蛇.zip (2.25 KB, 下载次数: 8)
完整版(不用另行添加,解压密码fishc):
贪吃蛇完整版.zip (2.54 KB, 下载次数: 49, 售价: 1 鱼币)
6、回复说明
7板块将会公示2种类型的回帖
中奖回帖:触发70%中奖的回帖
最佳回帖:最佳回复,将会置顶展示
7、回帖看板
快来回复吧!
名称/项目 昵称 查看传送门   
中奖回帖(仅1次,70%的中奖率) 一点点儿点此
最佳回帖(置顶展示的回帖)一点点儿点此
8、结语
感谢你看到这里,如果你有建议,欢迎跟我交流,我将会第一时间查看你的建议。
再次表示感谢!

别急着走~先评个分呗



本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-17 12:59:50 | 显示全部楼层

回帖奖励 +3 鱼币

感谢楼主分享!
向大佬学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2022-8-17 16:35:59 | 显示全部楼层
大佬厉害!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-18 16:23:23 | 显示全部楼层
哇哦哇哦哇哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-18 16:36:10 | 显示全部楼层
为什么第四行报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-25 12:15:00 | 显示全部楼层
瞅一瞅学习下代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-28 13:14:47 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-28 13:58:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-29 08:39:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-29 10:56:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-18 18:01:58 | 显示全部楼层
好冷清         
ding
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 20:17:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-29 00:08:26 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-29 01:12:55 From FishC Mobile | 显示全部楼层
非常精炼的骨干。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-2 11:41:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-2 13:03:40 | 显示全部楼层
消息称
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-5 21:15:31 | 显示全部楼层
尘封已久的帖子。

考古

点评

考  发表于 2023-6-12 17:53
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 21:32:02 | 显示全部楼层
考古考古考古考古考古
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表