ligen超越 发表于 2016-1-23 12:40:26

学了大半个月c,写了个贪吃蛇,来炫炫

本帖最后由 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;//地图信息
int snake_x;//蛇x坐标数组
int snake_y;//蛇y坐标数组
int len;//蛇的长度
int food;//果子坐标

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

void chushi(){//初始地图蛇,果子,方向数据
        //蛇的位置初始化
        snake_x=10;
        snake_y=10;
        snake_x=9;
        snake_y=10;
        snake_x=8;
        snake_y=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,food);
                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=snake_x;
                                        snake_y=snake_y;       
                                }
                                snake_x=food;
                                snake_y=food;
                                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='.';
                }
        }

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

        //打印地图
        for(int y=0;y<kd;y++){
                for(int x=0;x<kd;x++){
                        printf("%c ",ditu);                       
                }
                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=snake_x;
                        snake_y=snake_y;
                       
                }       
               
                snake_x=fx+snake_x;
                snake_y=fx+snake_y;
                       
               
        }
}

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==x && snake_y==y ) {
                                z=0;
                                break;
                        }else if( x==food && y==food){
                                z=0;
                                break;
                        }else{
                                z=1;
                        }
                }       
                if(z==1){
                        food=x;
                        food=y;
                //        printf("dsfsdf果子坐标为:%d,%d\n",food,food);
                        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;
                int y=snake_y;       
       
                x=x+fx;
                y=y+fx;

                for(int i=0;i<len;i++){//判断是否在蛇身上
                        if(x==snake_x && y==snake_y){
                                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 && y==food){//判断是否在果子上面
                       t=2;
                }               
        }
       
        if(t==1 || t==2){
                fxn=n;
        }       
       
        return t;       
}

黑龍 发表于 2016-1-23 13:15:05

楼主的代码在VS中编译不通过

ligen超越 发表于 2016-1-23 13:54:20

黑龍 发表于 2016-1-23 13:15
楼主的代码在VS中编译不通过

{:5_96:}这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的

黑龍 发表于 2016-1-23 14:12:54

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

我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

ligen超越 发表于 2016-1-23 14:25:23

黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格

黑龍 发表于 2016-1-23 14:28:16

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

那他是怎么移动的呢

黑龍 发表于 2016-1-23 14:28:16

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

那他是怎么移动的呢

ligen超越 发表于 2016-1-23 14:42:11

黑龍 发表于 2016-1-23 14:28
那他是怎么移动的呢

蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇身移动,尾部坐标都是他原来上一个点的坐标,我刚才看了下别人写的代码,用什么结链表,我现在还没学到那个地方,我觉得我这个处理也蛮简单的{:10_277:}

zlh 发表于 2016-1-23 14:54:23

我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊

黑龍 发表于 2016-1-23 15:13:45

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

可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动

ligen超越 发表于 2016-1-23 15:29:27

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

谢谢夸赞!!!!{:10_279:}

ligen超越 发表于 2016-1-23 15:31:09

黑龍 发表于 2016-1-23 15:13
可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动

数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了

黑龍 发表于 2016-1-23 16:17:53

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

....我翻遍了你的代码都没看到闪烁

落宝金钱 发表于 2016-1-23 17:16:52

看看

zlh 发表于 2016-1-23 19:26:24

黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧

我也搞不懂怎么让蛇移动

黑龍 发表于 2016-1-23 19:57:31

zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动

我没有在他的代码里看到任何让蛇移动的代码
除了坐标

黑龍 发表于 2016-1-23 19:57:52

zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动

不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?

zlh 发表于 2016-1-23 20:26:30

黑龍 发表于 2016-1-23 19:57
不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?

我也写过其他的呀,什么学生成绩管理系统之类的

machimilk 发表于 2016-1-23 22:43:46

写的不错,支持一下

张沐阳 发表于 2016-1-25 14:09:43

很厉害啊,你是怎么做到这么高效率的,我感觉我学了一段时间C语言都不知道如何写游戏
页: [1] 2
查看完整版本: 学了大半个月c,写了个贪吃蛇,来炫炫