鱼C论坛

 找回密码
 立即注册
查看: 6752|回复: 22

[技术交流] 学了大半个月c,写了个贪吃蛇,来炫炫

[复制链接]
发表于 2016-1-23 12:40:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ligen超越 于 2016-1-23 17:54 编辑

希望大神改进下啦,从键盘获取字符,到操控蛇运动,这个困扰了我很久,准备多线程的,但是还没学,所以用了很笨的方法;
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define kd 20//坐标长度 


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void chushi();//初始化画数据 
void print_ditu();//打印地图 
void move(int n);//移动 (移动方向)
char jieshou();//接受字符输入,直到接受到字符才返回; 
void scgz();//生产随机果子 
int qdqfx();//取当前方向 
int jiance(int n);//检测当前移动是否正确   返回0,这个非法移动,返回1,移动是正确的 ,返回-1游戏失败 

char ditu[kd][kd];//地图信息 
int snake_x[kd*kd];//蛇x坐标数组
int snake_y[kd*kd];//蛇y坐标数组 
int len;//蛇的长度
int food[2];//果子坐标 

int fx[8]={-1,0,1,0,0,-1,0,1};//方向坐标 
int fxn;//当前方向 
int sd;//控制速度哦,积分越多,速度越快 

void chushi(){//初始地图蛇,果子,方向数据 
        //蛇的位置初始化 
        snake_x[0]=10;
        snake_y[0]=10;
        snake_x[1]=9;
        snake_y[1]=10;
        snake_x[2]=8;
        snake_y[2]=10;
        len=3;//蛇的开始长度 
        scgz();//生产随机果子         
        fxn=2;//初始方向是向右边 

        system("cls");//清屏专用 
        printf("请选择难度,1简单,2普通,3难,4很难\n");
        char nd=jieshou();
        if(nd=='1'){
                sd=800;
        }else if(nd=='2'){
                sd=600;
        }else if(nd=='3'){
                sd=400;
        }else if(nd=='4'){
                sd=200;
        }else{
                sd=500;//没有正确选择的初始一个中度的难度 
        }
} 

int main(int argc, char** argv) {

        chushi();//初始化一些数据
         
                 
        while(1){
                
                system("cls");//清屏专用 
                print_ditu();//打印地图 
                printf("请用A D W S 调控!“+”加号键盘为暂停和继续\n"); 
                printf("你当前的积分为:%d\n",(len-3)*10);
                
                Sleep(sd);
                //printf("果子坐标为:%d,%d\n",food[0],food[1]);
                int yx;//取当前状态
                yx=        qdqfx();
                if(yx==4){//游戏暂停哦 
                        printf("请安“+”加号键继续!!"); 
                        while(jieshou()!='+'){//游戏继续啦 
                        }
                }else{
                        int zt;//取当前控制符的状态 赋值给临时变量 
                        zt=jiance(yx);
                        
                        if(zt==-1){//移动失败 
                                system("cls");//清屏专用 
                                printf("游戏失败啦!你当前的积分为:%d\n",(len-3)*10);
                                printf("继续游戏请按“1”,其他键退出");
                                char yy;
                                yy=jieshou();
                        
                                if(yy=='1'){        
                                        chushi();//初始化数据,再重头开始 
                                        continue;
                                } else{
                                        break;
                                }
                        
                        }else if(zt==1 || zt==0){//移动正常 
                                move(fxn);
                        }else if(zt==2){//吃到了果子 
                        
                                len=len+1;
                                for(int i=0;i<len-1;i++){
                                        snake_x[len-i-1]=snake_x[len-i-2];
                                        snake_y[len-i-1]=snake_y[len-i-2];        
                                }
                                snake_x[0]=food[0];
                                snake_y[0]=food[1];
                                scgz();
                                //这边的难度可以自己设计,具体的我没有深究过
                                sd=sd*19/20; 
                        }                        
                }        
                
                
                
                
        }
        return 0;                
}        

void print_ditu(){//打印地图哦! 
        
        // 初始化地图
        for(int y=0;y<kd;y++){
                for(int x=0;x<kd;x++){
                        ditu[x][y]='.';
                }
        }

        ditu[snake_x[0]][snake_y[0]]='; //初始蛇的坐标 
        for(int i=1;i<len;i++){     
                ditu[snake_x[i]][snake_y[i]]='0';
        }
        
        ditu[food[0]][food[1]]='F';//初始化果子坐标 

        //打印地图 
        for(int y=0;y<kd;y++){
                for(int x=0;x<kd;x++){
                        printf("%c ",ditu[x][y]);                        
                }
                printf("\n");
        }                
}

int qdqfx(){//取当前方向坐标 
        char f='\0';
        int n=kbhit();
    if(n){
            f=getch();
                while(kbhit()){
                        getch();
                }
        }
        n=-1;
        if(f=='a'){
                n=0;
        }else if(f=='w'){
                n=1;
        }else if(f=='d'){
                n=2;
        }else if(f=='s'){
                n=3;
        }else if(f=='\0'){
                n=fxn;//还是原来的fxn方向 
        }else if(f=='+'){
                n=4;//这个是暂停继续 
        }else{
                n=fxn;
        }
        return n;
} 

void move(int n){
        //针对蛇的坐标移动 
        if(n>=0){
                
                for(int i=0;i<len-1;i++){
                        snake_x[len-i-1]=snake_x[len-i-2];
                        snake_y[len-i-1]=snake_y[len-i-2];
                        
                }        
                
                snake_x[0]=fx[n]+snake_x[1];
                snake_y[0]=fx[n+4]+snake_y[1];
                        
                
        }
} 

char jieshou(){//接受字符输入,直到接受到字符才返回; //BUG多多,这一块不知道怎么解决 
        while( !kbhit() ){
                Sleep(2);        
        }
        char ls=getch();
        
        while(kbhit()){
                        getch();
                }
        return ls;
        
} 

 void scgz(){//生产随机果子 
         
        int x,y;//零时的值 
        int z;//是否成功生产 
        int send=(int)time(NULL);
        srand(send);//置随机种子 
        while(1){
                x=rand()%(kd-1);
                y=rand()%(kd-1);

                for(int i=0;i<len;i++){
                        if(snake_x[i]==x && snake_y[i]==y ) {
                                z=0;
                                break;
                        }else if( x==food[0] && y==food[1]){
                                z=0;
                                break;
                        }else{
                                z=1;
                        }
                }        
                if(z==1){
                        food[0]=x;
                        food[1]=y;
                //        printf("dsfsdf果子坐标为:%d,%d\n",food[0],food[1]);
                        break;
                }                
        }        
} 

int jiance(int n){//返回0,这个非法移动,返回1,移动是正确的 ,返回-1游戏失败  返回2吃到了果子 
        //printf("n的值为:%d\n",n);
        
        int t=1;//看状态
        int s; //临时值 
        
        s=n-fxn;

        if(s<0){//取绝对值 
                s=-s;
        }
        //printf("s的值为:%d, n的值为:%d,fxn的值为:%d\n",s,n,fxn);
        if(s==2){
                t=0;
        }else{
                //printf("n的值为:%d\n",n);
                int x=snake_x[0];
                int y=snake_y[0];        
        
                x=x+fx[n];
                y=y+fx[n+4];

                for(int i=0;i<len;i++){//判断是否在蛇身上 
                        if(x==snake_x[i] && y==snake_y[i]){
                                t=-1;
                                break; 
                        }
                }
                //printf("x的值为:%d,y的值为:y%d\n",x,y);
                if(!(x>=0 && x<kd && y>=0 && y<kd)){//判断是否在边界 
                        t=-1;
                }        
                if(x==food[0] && y==food[1]){//判断是否在果子上面
                         t=2;
                }                
        }
        
        if(t==1 || t==2){
                fxn=n;
        }        
        
        return t;        
}
jdfw.gif

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zlh + 1 + 1 目测楼主很厉害啊

查看全部评分

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

使用道具 举报

发表于 2016-1-23 13:15:05 | 显示全部楼层
楼主的代码在VS中编译不通过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 13:54:20 | 显示全部楼层
黑龍 发表于 2016-1-23 13:15
楼主的代码在VS中编译不通过

这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:12:54 | 显示全部楼层
ligen超越 发表于 2016-1-23 13:54
这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的

我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 14:25:23 | 显示全部楼层
黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:28:16 | 显示全部楼层
ligen超越 发表于 2016-1-23 14:25
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格

那他是怎么移动的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:28:16 | 显示全部楼层
ligen超越 发表于 2016-1-23 14:25
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格

那他是怎么移动的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 14:42:11 | 显示全部楼层
黑龍 发表于 2016-1-23 14:28
那他是怎么移动的呢

蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇身移动,尾部坐标都是他原来上一个点的坐标,我刚才看了下别人写的代码,用什么结链表,我现在还没学到那个地方,我觉得我这个处理也蛮简单的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 14:54:23 | 显示全部楼层
我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 15:13:45 | 显示全部楼层
ligen超越 发表于 2016-1-23 14:42
蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇 ...

可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 15:29:27 | 显示全部楼层
zlh 发表于 2016-1-23 14:54
我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊

谢谢夸赞!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-23 15:31:09 | 显示全部楼层
黑龍 发表于 2016-1-23 15:13
可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动

数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 16:17:53 | 显示全部楼层
ligen超越 发表于 2016-1-23 15:31
数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了

....我翻遍了你的代码都没看到闪烁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 17:16:52 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-23 19:26:24 | 显示全部楼层
黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

我也搞不懂怎么让蛇移动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 19:57:31 | 显示全部楼层
zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动

我没有在他的代码里看到任何让蛇移动的代码
除了坐标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 19:57:52 | 显示全部楼层
zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动

不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 20:26:30 | 显示全部楼层
黑龍 发表于 2016-1-23 19:57
不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?

我也写过其他的呀,什么学生成绩管理系统之类的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-23 22:43:46 | 显示全部楼层
写的不错,支持一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-25 14:09:43 | 显示全部楼层
很厉害啊,你是怎么做到这么高效率的,我感觉我学了一段时间C语言都不知道如何写游戏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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