|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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、结语
感谢你看到这里,如果你有建议,欢迎跟我交流,我将会第一时间查看你的建议。
再次表示感谢!
别急着走~先评个分呗
|
|