zoukankan      html  css  js  c++  java
  • 命令行贪吃蛇以及qt写的桌面贪吃蛇

    还记得大一上学期就想做贪吃蛇了,甚至写了三分之二,最后没有办法实现蛇的移动,就作废了,不知道是不是这个学期变聪明了,哈哈,一口气就写出来了,当然了,主要还是问了同学。

    贪吃蛇主要有几个地方难实现,首先是如何形成动画,这个是通过暂停程序sleep(time)来与刷新屏幕(system("cls")来实现的,后来发现刷新屏幕会一闪一闪,可以用goto()局部刷新或者是二级缓存。第二,是如何与玩家进行交互,说白了就是怎么获取键盘事件,当然有很多种,例如scanf,getch()等,但是我们不可能按下一个键还要按一下回车键才把行吧,所以就用了getch().第三就是怎么让蛇再没有获取到键盘命令的时候也会前进,这个是用判断是否有键盘输入kbnit()实现的(ε=ε=ε=(~ ̄▽ ̄)~,不要问我怎么知道的,神知道我怎么知道的)。差不多就这样了。接下来放代码,(其实就写了蛇的部分,也不是我一个人写的了,虽然大大大部分是我一个人写的,因为调用其他人写的难度比自己写出来还大,用户登录啥的是直接套用了我上个学期实训项目的https://www.cnblogs.com/miaos/p/miaoz-1-3.html,虽然不想这样,不过。。。真香(:,关于写蛇的部分我变个颜色)。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>
    #include<time.h>
    #include<iostream>
    
    #include<windows.h>
    using namespace std;
    typedef struct cmy {
     char cmyID[20];
     int money;
     int kuchun;
     char name[40];
     char conment[100][100];
     char commentcount;
    }cm;
    typedef struct shopcar {
     int shuliang;
     cm cmyi;
    }car;
    typedef struct gmjl {
     int grad;
     struct tm lt;
    }jl;
    typedef struct users {
     char username[20];
     char password[20];
     int usermony;
     car shopcar[20];
     int shopcount;
     char youxiang[30];
     jl gmjlu[100];
     int jilucount;
    }uer;
    typedef struct wjpass{
     char wjname[20];
     char beizhu[200];
     char youxiang[30];
    }wjp;
    typedef struct wenti
    {
     wjp wangji[100];
     int wjcount;
    }wt;
    typedef struct passw2
    {
        char a[20];
    }passw2;
    
    
    
    uer kehu[1000];//初始化信息
    wt weti = { "0",0 };
    
    char gb[20] = "缪传鹏最帅";
    char adm[20] = "admin";
    char admpassword[20] = "admin";
    
    int count = 0;//用户量
    int countsp1 , countsp2 = 5;
    void yonhu(int usi);//用户界面 通过用户下标来标识
    void zhuc();//注册界面
    void den();//登陆界面
    void csjm();//初始界面
    void exeit();//播放退出动画然后退出
    int nametoid(char name2[20]);//通过名字查找下标
    void huangying();//欢迎界面
    void exeit();
    void youxijilu();
    passw2 passw();//密码不回显
    void zhanghuwenti(int usi);//反馈账户问题
    void xiugaipassw(int usi);//修改密码
    void kehuwent();//初始界面的反馈账户问题
    void gly_zhaohu();//管理员找回用户密码
    void shezhi();//设置界面
    void beijingcolor();//背景颜色  未调用
    void ziticolor();//字体颜色  未调用
    struct tm gwtiame();//返回当前时间
    void chonzhi(int usi);//充值
    
    
    
    
    
    struct tm gwtiame()
    {
     time_t t;
     struct tm*lt;
     t=time(NULL);
     lt = localtime(&t);
     struct tm a = *lt;
     return a;
    }
    /*******************************************************************变色失败,用分割线******************************************************************/
    using namespace std;
    
    typedef struct zuo
    {
        int x;
        int y;
    }zuo;
    zuo z[100];//蛇坐标,蛇头为snak[0];
    int shu=1;
    int pause=0;
    zuo food;//食物坐标
    int ditu_x=40;//
    int ditu_y=20;//地图
    int speed=100;//速度;
    char f='S';//方向 w a s d;
    //
    void p2game(int usi);//同下
    void pgame(int usi);//这个排行榜,没写完,就没有调用了,不用管
    void zhujiemian();//主界面
    void stargame(int usi,int lk);//开始游戏
    void printgame();//打印每一帧 *
    
    void refood();//重置食物坐标
    void fangxiang();//获取键盘,判断方向*
    void snakyundon();//蛇的运动 *
    int eat();//判断是否吃到食物;
    void snakdead(int usi);//判断蛇是否死亡;
    void shezhi();//设置
    void GoTo(int x,int y);//这个是局部刷新的,貌似也没有用这个
    void gotoxy(int x, int y)//没错,没有用上面那个赝品,用的是这个
    {
        COORD coord = {x, y};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    }
    void youxijilu(int usi)
    {
     while (1)
     {
      system("cls");
      printf("========================================================游戏记录=======================================================
    ");
      for (int i = 0; i < kehu[usi].jilucount; i++)
      {
       printf("编号:%d	", i + 1);
       printf("时间:");
       printf("%d年%d月%d日%d点%d分%d秒	", kehu[usi].gmjlu[i].lt.tm_year + 1900, kehu[usi].gmjlu[i].lt.tm_mon, kehu[usi].gmjlu[i].lt.tm_mday, kehu[usi].gmjlu[i].lt.tm_hour, kehu[usi].gmjlu[i].lt.tm_min, kehu[usi].gmjlu[i].lt.tm_sec);
       printf("成绩:%d",kehu[usi].gmjlu[i].grad); //printf("商品名称:%s
    ", kehu[usi].gmjlu[i].jlsp.cmyi.name);
       //printf("数量:%d
    ", kehu[usi].gmjlu[i].jlsp.shuliang);
       //printf("交易额:%d
    ", kehu[usi].gmjlu[i].jlsp.shuliang*kehu[usi].gmjlu[i].jlsp.cmyi.money);
       printf("——————————————————————————————
    ");
      }
    
    
      printf("1——————退出
    ");
      char fla4 = getch();
      if (fla4 == '1')
      {
    
      yonhu(usi);
    
      }
     }
    }
    void fangxiang()
    {
        if(kbhit())
        {
            char f1=getch();
            if(f1=='D'||f1=='1'||f1=='S'||f1=='A'||f1=='W'||f1=='d'||f1=='s'||f1=='a'||f1=='w')
            {if(f=='W'&&f1=='S'||f=='A'&&f1=='D'||f=='S'&&f1=='W'||f=='D'&&f1=='A'||f=='w'&&f1=='s'||f=='a'&&f1=='d'||f=='s'&&f1=='w'||f=='d'&&f1=='a');
                    else if(f1=='1')
                    {
                        pause=1;
                    }
                    else
                        f=f1;
                }
        }
    
    
    }
    void stargame(int usi,int lk)
    {
        char ff1='1';
        if(lk==0)
            {
                for(;;){
                        cout<<"1---一般模式"<<endl;
                        cout<<"2---无敌模式(需要消耗10个金币)"<<endl;
                        ff1=getch();
                        if(ff1=='1'||ff1=='2')break;
                        system("cls");
                        }
            }
            system("cls");
    if(ff1=='2')kehu[usi].usermony-=10;
        z[0].x=1;
        z[0].y=2;
        food.x=5;
        food.y=5;
        f='d';
        printgame();
        for(;;)
        {
    
            Sleep(speed);
           // getchar();
           // system("cls");
            fangxiang();
            if(ff1=='1')snakdead(usi);
            if(eat())
            {
                refood();
                shu++;
            }
            p2game(usi);
            snakyundon();
            pgame(usi);
    
        }
    }
    
    void snakyundon()
    {
        for(int i=shu-1;i>0;i--)
        {
            z[i]=z[i-1];
        }
        if(f=='W'||f=='w')z[0].y-=1;
        if(f=='S'||f=='s')z[0].y+=1;
        if(f=='A'||f=='a')z[0].x-=1;
        if(f=='D'||f=='d')z[0].x+=1;
    }
    void printgame()
    {
        for(int i=1;i<=ditu_x*ditu_y;i++)
        {
            int flag=0;
            if((i%ditu_x-1)==food.x&&i/ditu_x==food.y)
                flag=1;
         for(int j=0;j<shu;j++)
         {
             if((i%ditu_x-1)==z[j].x&&i/ditu_x==z[j].y)
                flag=1;
         }
        if(i<=ditu_x||i%ditu_x==0||(i-1)%ditu_x==0||i>=ditu_x*(ditu_y-1))printf("*");
                else printf(" ");
        if(i%ditu_x==0)printf("
    ");
        //if(flag)cout<<flag;
        }
        //cout<<z[0].x<<" "<<z[0].y;
    }
    void refood(){
        if(eat())
        {
             srand(time(0));
             food.x=rand()%(ditu_x-2)+1;
             food.y=rand()%(ditu_y-2)+1;
    
        }
    
    }
    int eat(){
      if(z[0].x==food.x&&z[0].y==food.y){
            return 1;
      }else return 0;
    }
    void snakdead(int usi)
    {
        int flag=0;
        for(int i=1;i<shu;i++)
        {
            if(z[0].x==z[i].x&&z[0].y==z[i].y)flag=1;
        }
        if(z[0].y==0||z[0].y==ditu_y||z[0].x==0||z[0].x==ditu_x)
            flag=1;
        if(flag)
        {
    
            for(;;)
            {system("cls");
            cout<<"
    
    
    
    
    ---------------you are dead------------"<<endl;
            cout<<"
    
    ---------do you want  复活(消耗2个金币)-------------"<<endl;
            cout<<"
    
    -----1---是         2---否-------------"<<endl;
            char ffg=getch();
            if(ffg=='1')
            {
                kehu[usi].usermony-=2;
                stargame(usi,1);
            }
            if(ffg=='2')
                break;
            }
            kehu[usi].gmjlu[kehu[usi].jilucount].grad=shu;
            kehu[usi].gmjlu[kehu[usi].jilucount++].lt=gwtiame();
            shu=1;
            z[0].x=10;
            z[0].y=10;
            food.x=5;
            food.y=5;
            //Sleep(3000);
            yonhu(usi);
        }
    }
    
    void chonzhi(int usi)
    {
     while (1)
     {
      system("cls");
       printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      printf("
    
    
    
    						您的余额是:%d
    
    
    						1.充值余额
    
    
    
    						2.返回上一层
    ", kehu[usi].usermony);
      printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      char flag22 = getch();
      if (flag22 == '1')
      {
       char flag23[20];
       printf("请输入第二组最帅以进行充值
    ");
       gets(flag23);
       if (!strcmp(flag23, gb))
       {
        printf("充值中......");
        kehu[usi].usermony += 100;
        _sleep(1000);
        printf("充值成功......");
        _sleep(500);
       }
       else
       {
        printf("充值中........
    ");
        _sleep(2000);
        printf("充值失败请重试......");
        _sleep(500);
       }
      }
      else if (flag22 == '2')
      {
       yonhu(usi);
      }
     }
    }
    void shezhi()
    {
     while (1)
     {
      system("cls");
      printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      printf("
    
    
    
    						1.设置颜色
    
    
    						2.设置难度
    
    
    						3.设置地图
    
    
    						4.返回上一层");
      printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      char fla1 = getch();
      if (fla1 == '1')
      {
       while (1)
       {
        system("cls");
        printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
        printf("n
    
    
    						1.黑底白字
    
    						2.白底绿字
    
    						3.黑底黄字
    
    						4.黑底白字
    
    						5.紫底白字
    
    						6.返回
    ");
        printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
        char fla2 = getch();
        switch (fla2)
        {
        case '1':system("color 07"); break;
        case '2':system("color 72"); break;
        case '3':system("color 06"); break;
        case '4':system("color 70"); break;
        case '5':system("color 57"); break;
        case '6':shezhi(); break;
        }
       }
      }
      if (fla1 == '4')
      {
       csjm();
      }
      if(fla1=='2')
      {
          for(;;)
          {
              system("cls");
              printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
        printf("
    
    
    						1.简单
    
    						2.一般
    
    						3.困难
    
    						4.地狱
    
    						5.返回
    ");
        printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
        char ffff=getch();
        if(ffff=='1')speed=250;
        if(ffff=='2')speed=100;
        if(ffff=='3')speed=60;
        if(ffff=='4')speed=10;
        if(ffff=='5')break;
          }
      }
      if(fla1=='3')
      {
           for(;;)
          {
              system("cls");
              printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
        printf("
    
    
    						1.小
    
    						2.中
    
    						3.大
    
    						4.返回
    ");
        printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
        char ffff=getch();
        if(ffff=='1'){ditu_x=20;ditu_y=10;break;}
        if(ffff=='2'){ditu_x=40;ditu_y=20;break;}
        if(ffff=='3'){ditu_x=80;ditu_y=40;break;}
        if(ffff=='4')break;
          }
      }
     }
    }
    
    void gly_zhaohu()
    {
     system("cls");
     printf("————————客户问题————————
    ");
     if (weti.wjcount == 0)printf("当前没有客户问题
    ");
     for (int i = 0; i < weti.wjcount; i++)
     {
      printf("编号:%d
    名字:%s
    邮箱地址:%s
    问题:%s
    
    ", i + 1, weti.wangji[i].wjname, weti.wangji[i].youxiang, weti.wangji[i].beizhu);
     }
     printf("——————————为客户找回密码——————————
    ");
     int tempbh;
     printf("请输入客户姓名所对应的编号
    ");
     scanf("%d", &tempbh);
     if (tempbh<1 || tempbh>weti.wjcount)
     {
      while (1)
      {
       printf("请输入正确的编号
    ");
       printf("1————重新输入
    2————退出
    ");
       char fla4 = getch();
       if (fla4 == '1')
       {
        gly_zhaohu();
       }
       if (fla4 == '2')
       {
        kehuwent();
       }
      }
     }
     else
     {
      int kehui = nametoid(weti.wangji[tempbh-1].wjname);
      printf("客户:%s
    密码:%s
    请通过他的邮箱%s告知。
    ", kehu[kehui].username, kehu[kehui].password, kehu[kehui].youxiang);
      printf("按任意键返回上一级
    ");
      getch();
     }
    }
    void kehuwent()
    {
     while (1)
     {
      system("cls");
      printf("
    
    ——————————————————————————客户问题——————————————————————————————
    ");
      if (weti.wjcount == 0)printf("
    
    						当前没有客户问题
    
    
    ");
      for (int i = 0; i < weti.wjcount; i++)
      {
       printf("编号:%d
    名字:%s
    邮箱地址:%s
    问题:%s
    
    ", i + 1, weti.wangji[i].wjname, weti.wangji[i].youxiang, weti.wangji[i].beizhu);
      }
      printf("——————————————————————客户是上帝 请解决这些问题—————————————————————————
    
    ");
      printf("
    
    						1.为客户找回密码
    
    						2.删除问题
    
    						3.解决其他问题
    
    						4.退出
    ");
      char flag31 = getch();
      if (flag31 == '1')
      {
       gly_zhaohu();
      }
      if (flag31 == '3')
      {
       printf("请手动解决
    ");
       _sleep(1000);
       kehuwent();
      }
      if (flag31 == '2')
      {
     //  gly_shanchuwt();
      }
      if (flag31 == '4')
      {
      //guangliyuan();
      den();
      }
     }
    }
    
    int nametoid(char name2[20])
    {
     int flag4 = 0, t1;
     for (int i = 0; i < count; i++)
     {
      if (!strcmp(name2, kehu[i].username))
      {
       flag4 = 1;
       t1 = i;
      }
     }
     if (flag4 == 0)
     {
      return -1;
     }
     else
      return t1;
    }
    void zhanghuwenti(int usi)
    {
     while (1)
     {
      system("cls");
       printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      printf("
    
    
    
    						1.修改密码
    
    
    						2.返回上一层
    ");
      printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      char flag30 = getch();
      if (flag30 == '1')
      {
       xiugaipassw(usi);
      }
      else if (flag30 == '3')
      {
       //待增加
      }
      else if (flag30 == '2')
      {
       yonhu(usi);
      }
     }
    }
    passw2 passw()
    {
     passw2 x;
     char ch, s[20];
     int i = 0;
     while ((ch = getch()) != '
    ')
     {
       if (ch != 8)
       {
        x.a[i] = ch;
        putchar('*');
        i++;
       }
       else if (i > 0)
       {
        putchar('');
        putchar(' ');
        putchar('');
        i--;
       }
    
     }
     x.a[i] = '';
     return x;
    }
    void zhaohuipassw()
    {
     system("cls");
     char nametemp[20],bztemp[200];
     printf("请输入账户名
    ");
     scanf("%s", nametemp);
     if (nametoid(nametemp) == -1)
     {
      while (1)
      {
       printf("帐户名不存在
    ");
       printf("1————重新输入
    2————返回上一层
    ");
       char fla1 = getch();
       if (fla1 == '1')zhaohuipassw();
       if (fla1 == '2')den();
      }
     }
     printf("请输入备注
    ");
     scanf("%s", bztemp);
     char yxtemp[30];
     while (1)
     {
      printf("请输入您的邮箱地址
    ");
      scanf("%s", yxtemp);
      if (!strcmp(yxtemp, kehu[nametoid(nametemp)].youxiang))
      {
       strcpy(weti.wangji[weti.wjcount].beizhu, bztemp);
       strcpy(weti.wangji[weti.wjcount].wjname, nametemp);
       strcpy(weti.wangji[weti.wjcount].youxiang, yxtemp);
       weti.wjcount++;
       printf("等待管理员处理,处理成功新密码将发送至您的邮箱
    ");
       _sleep(1000);
       break;
      }
      else
      {
       while (1)
       {
        system("cls");
        printf("邮箱地址不正确
    ");
    
        printf("1————重新输入
    2————返回上一层
    ");
        char fla1 = getch();
        if (fla1 == '1')
        {
         system("cls");
         break;
        }
        if (fla1 == '2')den();
       }
      }
     }
    
    }
    void xiugaipassw(int usi)
    {
     if (usi == -1)
     {
      char zhaoname[20];
      system("cls");
      printf("请输入账户名
    ");
      scanf("%s", zhaoname);
      if (zhaoname == "-1")
      {
       printf("正在返回....");
       _sleep(800);
       den();
      }
      if (nametoid(zhaoname) == -1)
      {
       printf("此帐户名不存在
    ");
       printf("请重新输入,输入-1返回上一层
    ");
       xiugaipassw(-1);
      }
      else
      {
       while (1)
       {
        system("cls");
        char zhaopass[20];
        printf("请输入修改前密码");
        scanf("%s", zhaopass);
        if (!strcmp(zhaopass, kehu[nametoid(zhaoname)].password))
        {
         while (1)
         {
          char newpass1[20], newpass2[20];
          printf("请输入新密码
    ");
          scanf("%s", newpass1);
          printf("请再次输入新密码
    ");
          scanf("%s", newpass2);
          if (!strcmp(newpass1, newpass2))
          {
           printf("修改密码成功...
    ");
           _sleep(800);
           strcpy(kehu[nametoid(zhaoname)].password, newpass1);
           printf("正在返回上一层....
    ");
           _sleep(600);
           den();
          }
          else
          {
           printf("两次密码不相同请重新输入
    ");
           _sleep(800);
          }
         }
        }
        else
        {
         printf("密码错误
    1——————重新输入
    2——————退出
    ");
         _sleep(800);
         while (1)
         {
          char flag28 = getch();
          if (flag28 == '1')break;
          if (flag28 == '2')den();
         }
    
        }
       }
    
      }
     }
     else
     {
      while (1)
      {
       system("cls");
       char zhaopass[20];
       printf("请输入修改前密码
    ");
       strcpy(zhaopass,passw().a);
       if (!strcmp(zhaopass, kehu[usi].password))
       {
        while (1)
        {
         char newpass1[20], newpass2[20];
         printf("
    请输入新密码
    ");
         strcpy(newpass1, passw().a);
         printf("
    请再次输入新密码
    ");
         strcpy(newpass2, passw().a);
         if (!strcmp(newpass1, newpass2))
         {
          printf("
    修改密码成功...
    ");
          _sleep(800);
          strcpy(kehu[usi].password, newpass1);
          printf("正在返回上一层....
    ");
          _sleep(600);
          yonhu(usi);
         }
         else
         {
          printf("
    两次密码不相同请重新输入
    ");
          _sleep(800);
          break;
         }
        }
       }
       else
       {
        printf("密码错误
    1——————重新输入
    2——————退出
    ");
        _sleep(800);
        while (1)
        {
         char flag28 = getch();
         if (flag28 == '1')break;
         if (flag28 == '2')yonhu(usi);
        }
       }
      }
     }
    }
    void huangying()
    {
     printf("
    ——————————————————————————————————————————欢迎光临—————————————————————————————————————————————————");
     _sleep(1000);
    }
    
    void exeit()
    {
     system("cls");
      printf("----------------------------------------欢迎下次再来---------------------------------------------------------------");
        _sleep(1000);
    
    
     FILE*fp;
     fp = fopen("chaoshiahuju", "wb");
     fwrite(&count, sizeof(int), 1, fp);
     fwrite(&countsp2, sizeof(int), 1, fp);
     for (int i = 0; i < count; i++)
      fwrite(&kehu[i], sizeof(users), 1, fp);
     fwrite(&weti, sizeof(wt), 1, fp);
     fclose(fp);
    
     _sleep(1000);
     exit(0);
    
    }
    void guangliyuan()
    {
     while (1)
     {
      system("cls");
      printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      printf("
    
    
    
    						1.查看客户问题
    
    
    						2.返回登录
    ");
      printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      char flag7 = getch();
      if (flag7 == '2')
      {
       den();
      }
      else if (flag7 == '1')
      {
       kehuwent();
      }
     }
    }
    void yonhu(int usi)
    {
     while (1)
     {
      system("cls");
      char flag10;
      printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      printf("
    
    
    
    						1.开始游戏
    
    						2.查看游戏记录
    
    						3.查看余额|充值余额
    
    						4.账户问题
    
    						5.游戏设置
    
    						6.退出登录
    ");
      printf("
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      flag10=getch();
      if (flag10 == '1')
      {
       stargame(usi,0);
      }
      else if (flag10 == '2')
      {
        youxijilu(usi);
      }
      else if (flag10 == '3')
      {
       chonzhi(usi);
      }
      else if (flag10 == '6')
      {
       den();
      }
      else if (flag10 == '4')
      {
       zhanghuwenti(usi);
      }
      else if(flag10=='5')
      {
          shezhi();
      }
      }
    }
    void zhuc()
    {
     char usname[20];
     char  password[20], passwordag[20];
     system("cls");
     printf("请输入用户名
    ");
     scanf("%s", usname);
     int flag3 = 0;
     for (int i = 0; i < count; i++)
     {
      if (!strcmp(usname, kehu[i].username))flag3 = 1;
     }
     if (flag3)
     {
      printf("用户名已经存在请重新输入");
      _sleep(1000);
      zhuc();
     }
     else
     {
      int flag6 = 0;
      while (1)
      {
       printf("请输入密码
    ");
       strcpy(password, passw().a);
       system("cls");
       printf("请再次输入密码
    ");
       strcpy(passwordag, passw().a);
       if (strcmp(password, passwordag))
       {
        printf("两次密码不相同,请重新输入密码
    ");
        _sleep(1000);
       }
       else
       {
        system("cls");
        printf("请输入您的邮箱地址
    ");
        scanf("%s", kehu[count].youxiang);
        system("cls");
        printf("注册成功");
        _sleep(1000);
        strcpy(kehu[count].username, usname);
        strcpy(kehu[count].password, password);
        kehu[count].jilucount = 0;
        kehu[count].usermony = 100;
        kehu[count++].shopcount = 0;
        flag6 = 1;
        break;
       }
      }
      if (flag6)den();
     }
    }
    void den()
    {
     char flag1;
     while (1)
     {
      system("cls");
      printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      printf("
    
    
    
    						1.客户登录
    
    
    						2.管理员登录
    
    
    						3.返回上一层");
      printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
      flag1 = getch();
      if (flag1 == '1')
      {
       while (1)
       {
        char name1[20];
        char password2[20];
        system("cls");
        printf("请输入账户名
    ");
        scanf("%s", name1);
        if (!strcmp(name1, "-1"))break;
        int flag4 = 0, t1;
        for (int i = 0; i < count; i++)
        {
         if (!strcmp(name1, kehu[i].username))
         {
          flag4 = 1;
          t1 = i;
         }
        }
        if (flag4 == 0)
        {
         while (1)
         {
          printf("用户名不存在
    ");
          printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
          printf("
    
    
    
    						1.重新输入
    
    
    						2.返回上一层
    ");
          printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
          char fla1 = getch();
          if (fla1 == '1')break;
          if (fla1 == '2')den();
          _sleep(1000);
         }
        }
        else
        {
         printf("请输入密码
    ");
         strcpy(password2, passw().a);
         if (!strcmp(password2, "-1"))den();
         if (!strcmp(password2, kehu[t1].password))
         {
          system("cls");
          printf("登入成功");
          _sleep(1000);
    
          yonhu(t1);
    
         }
         else
         {
          printf("密码不正确");
          _sleep(1000);
         }
        }
       }
      }
      if (flag1 == '2')
      {
       char name2[20];
       char password3[20];
       while (1)
       {
        system("cls");
        printf("请输入账户名
    ");
        scanf("%s", name2);
        if (!strcmp(name2, "-1"))break;
        if (strcmp(name2, adm))
        {
         while (1)
         {
          printf("用户名不存在
    ");
          printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
          printf("
    
    
    
    						1.重新输入
    
    
    						2.返回上一层
    ");
           printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
          char fla1 = getch();
          if (fla1 == '1')break;
          if (fla1 == '2')den();
          _sleep(1000);
         }
    
        }
        else
        {
         printf("请输入密码
    ");
         strcpy(password3, passw().a);
         if (strcmp(password3, admpassword))
         {
          printf("密码不正确
    ");
         }
         else
         {
          system("cls");
          printf("登录成功");
          _sleep(1000);
          //后续程序
          guangliyuan();
    
         }
        }
       }
       exeit();
      }
      if (flag1 == '3')
      {
       csjm();
      }
     }
    }
    void csjm()
    {
     while (1)
     {
      system("cls");
      char flag5 = 0;
      char flag2 = '0';
      while (1)
      {
       system("cls");
       printf("
    
    
    
    
    
    
    ------------------------------------------------welcome come snake game-------------------------------------------------
    
    ");
       printf("
    
    
    
    
    		1.登录		2.注册		3.账户问题		4.设置		5.退出
    ");
       printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
       flag2 = getch();
       if (flag2 == '1')
       {
        den();
        break;
       }
       if (flag2 == '2')
       {
        zhuc();
        break;
       }
       if (flag2 == '5')
       {
        system("cls");
        printf("----------------------------------------欢迎下次再来---------------------------------------------------------------");
        _sleep(1000);
        exeit();
    
       }
       if (flag2 == '3')
       {
        while (1)
        {
         system("cls");
         printf("
    
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
         printf("
    
    
    
    						1.修改密码
    
    
    						2.找回密码
    
    
    						3.返回上一级
    ");
         printf("
    
    
    
    
    ------------------------------------------------------------------------------------------------------------------------
    ");
         char flag29 = getch();
         if (flag29 == '1')
         {
          xiugaipassw(-1);
         }
         if (flag29 == '2')
         {
          zhaohuipassw();
         }
         if (flag29 == '3')break;
        }
    
       }
       if (flag2 == '4')
       {
        shezhi();
       }
      }
     }
    }
    void pgame(int usi)
    {
         for(int j=0;j<shu;j++)
         {
             if(z[shu-1].x>0&&z[shu-1].x<ditu_x&&z[shu-1].y<ditu_y-1&&z[shu-1].y>0)
             {
                 gotoxy(z[j].x,z[j].y);
                 cout<<'&';
             }
         }
         gotoxy(food.x,food.y);
         cout<<'@';
         //gotoxy(0,0);
         gotoxy(0,21);
         if(pause==1)
            {
                for(;;){
                cout<<"1----继续      "<<endl;
                cout<<"2----你选择死亡"<<endl;
                char ff=getch();
                if(ff=='1')
                {
                    pause=0;
                        break;
                }
                if(ff=='2')
                {
                    pause=0;
                    z[0].x=0;
                    snakdead(usi);
                }
                }
            }
            gotoxy(0,21);
            cout<<"当前分数:"<<shu<<endl;
            cout<<"1----暂停      "<<endl;
    }
    void p2game(int usi)
    {
         if(z[shu-1].x>0&&z[shu-1].x<ditu_x&&z[shu-1].y-1<ditu_y-1&&z[shu-1].y>0)
        gotoxy(z[shu-1].x,z[shu-1].y);
        cout<<' ';
        gotoxy(food.x,food.y);
        cout<<' ';
    }
    int main()
    {
    system("mode con cols=120 lines=30");
     FILE*fp;
     fp = fopen("chaoshiahuju", "rb+");
     fread(&count, sizeof(int), 1, fp);
     fread(&countsp2, sizeof(int), 1, fp);
     for (int i = 0; i < count; i++)
      fread(&kehu[i], sizeof(users), 1, fp);
     fread(&weti, sizeof(wt), 1, fp);
     fclose(fp);
    
     system("color 70");
     csjm();
    
    
     return 0;
    }
    

      关于命令行贪吃蛇就这样了,接下来是qt写的桌面版贪吃蛇,这次学到不少,也吃了不少亏(下面会讲)。

    如果你没有接触过qt,(qt大法好,mfc没饭吃)我分享一下我看的大神写的学习教程,http://www.qter.org/portal.php?mod=view&aid=26

    你可能还需要环境配置的教程https://blog.csdn.net/liang19890820/article/details/53931813

    其实只要会一点qt,做贪吃蛇是很简单的,不过我经历了一些苦难,唉。

    首先和命令行一样要思考的三个问题,第一,如何形成动画,也就是如何把游戏画面给输出来,还记得我说的吃亏吗,就是在这里,我首先想到的是用qlabel把图片输出,然后通过控制qlabel的坐标进行动画,我一度甚至以为这个方法很绝妙,甚至直到我看到一条杀马特一样扭曲的蛇我还没有放弃。。。直到我发现qtpainter,可以直接在相应坐标上输出图片。。。所以真正的方法是用qtpaiter来输出图片,通过控制图片的坐标来形成动画。第二就是怎么与玩家进行交互,由于没有命令行,普通的scanf,gets是绝对行不通的,qt有自己的qt键盘事件获取方式也就是keyevent,第三是怎么控制时间,帧率,让蛇的运动函数循环运行,用的是qtime里面的timeupdate,来实现循环加sleep同样的功能,主要是因为sleep在qt里面没有用。解决了这些问题,到贴代码部分了

    首先是头文件

    snk.h在里面我定义了一些全局变量,具体看注释。

    #ifndef SNK_H
    #define SNK_H
    
    typedef struct zuo//坐标结构体
    {
        //zuo() {}
        int x;
        int y;
    }zuo;
    extern char f,f2;//方向f,以及键盘按的键f1
    extern zuo snkz[199];//蛇的头与身体在其中z[0]是头
    extern zuo foodz;//食物的坐标
    extern int shu,pause;//蛇的身体数与有关游戏暂停的全局变量
    extern int ditu_x,ditu_y;//地图大小
    extern int xuanz;//蛇头摆的方向,1为逆时针,0为顺时针。后来没有用到
    extern int speed;//速度,也就是帧率,刷新率。
    
    
    
    
    
    #endif // SNK_H
    

      另外说一下extern,大概就是让你重复定义变量而不会报错,这样做的原因https://blog.csdn.net/caoshangpa/article/details/51104022

    dialog.h

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    
    namespace Ui {
    class Dialog;
    }
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
    
    private:
        Ui::Dialog *ui;
    };
    
    #endif // DIALOG_H

    没啥东西要讲,你可以理解为我看不懂。

    mainwindows.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include<QLabel>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots://声明一些要用的函数
        void on_label_2_linkActivated(const QString &link);//没啥用
        void timeUpDate();
        void keyPressEvent(QKeyEvent *e);
        void paintEvent(QPaintEvent*w);
    
        void on_pushButton_clicked();
    
        //void on_pushButton_windowTitleChanged(const QString &title);
    
        void on_pushButton_2_clicked();
    
    private://声明一些控件
        Ui::MainWindow *ui;
        QList<QLabel*> p;
    
    };
    
    #endif // MAINWINDOW_H
    

      就是声明了一些函数。

    接着是cpp文件

    dialog.cpp

    #include "dialog.h"
    #include "ui_dialog.h"
    
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
        setWindowTitle(QStringLiteral("by miaoz"));
    
    }
    
    Dialog::~Dialog()
    {
        delete ui;
    }
    

      啥也没有

    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    #include "dialog.h"
    #include <snk.h>
    
    //重新声明一下头文件里的变量,具体看前面关于头文件定义全局变量的链接
    int shu=2;
    zuo snkz[199];
    zuo foodz;
    char f='w',f2='w';
    int pause=0;
    int ditu_x=24,ditu_y=24;
    int xuanz=0;
    int speed=400;
    
    
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        Dialog dl;
        w.setWindowIcon(QIcon(":/new/prefix1/D:/qt/qt/code/sorce/head (a).png"));//设置窗口图标
        dl.setWindowIcon(QIcon(":/new/prefix1/D:/qt/qt/code/sorce/head (a).png"));//同上
        if(dl.exec()==Dialog::Accepted)//如果收到开始游戏按下的信号,就开始游戏。
        {
    
            w.show();
            return a.exec();//窗口一张运行,直到被关闭
        }
        else return 0;//
    
    
    }
    

      mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include<QVBoxLayout>
    #include<QKeyEvent>
    #include<QVector>
    #include<QList>
    #include<QWidget>
    #include<time.h>
    #include<conio.h>
    #include<cstdlib>
    #include<QTime>
    #include<dialog.h>
    #include<cstdio>
    #include<QtCore>
    #include "snk.h"
    #include"QPainter"
    
    void chus()//初始化全局变量
    {
        speed=400;
        shu=3;
        snkz[0].x=6;
        snkz[0].y=6;
        foodz.x=5;
        foodz.y=5;
        f='s';
    }
    void refood()//重置食物
    {
        for(;;)
        {
           int flag1=1;
           srand(time(0));
           int x=rand()%(ditu_x-1)+1;
           srand(time(0));
           int y=rand()%(ditu_y-1)+1;
           for(int i=0;i<shu;i++)
           {
    
            if(x==snkz[i].x&&y==snkz[i].y)
                flag1=0;
    
            }
            if(flag1)
            {
              foodz.x=x;
              foodz.y=y;
              break;
            }
        }
    }
    void snakeyundon()//蛇的运动
    {
        //int speed=40;
        //zuo temp=z[shu-1];
        if(f=='W')
        {
            snkz[0].y-=1;
        }
        if(f=='D')
        {
            snkz[0].x+=1;
        }
        if(f=='S')
        {
            snkz[0].y+=1;
        }
        if(f=='A')
        {
            snkz[0].x-=1;
        }
        for(int i=shu-1;i>0;i--)
        {
            snkz[i]=snkz[i-1];
        }
    }
    int eat()//判断是否吃到食物
    {
        if(snkz[0].x==foodz.x&&snkz[0].y==foodz.y)
        {
            refood();
            shu++;
            speed-=50;
            return 1;
        }
        return 0;
    }
    void fangxiang()//判断方向
    {
        if(kbhit())
        {
            char f1=getch();
            if(f1=='D'||f1=='1'||f1=='S'||f1=='A'||f1=='W'||f1=='d'||f1=='s'||f1=='a'||f1=='w')
            {if(f=='W'&&f1=='S'||f=='A'&&f1=='D'||f=='S'&&f1=='W'||f=='D'&&f1=='A'||f=='w'&&f1=='s'||f=='a'&&f1=='d'||f=='s'&&f1=='w'||f=='d'&&f1=='a');
                    else if(f1=='1')
                    {
                        pause=1;
                    }
                    else{
                            if(f=='W'&&f1=='D'||f=='D'&&f1=='S'||f=='S'&&f1=='A'||f=='A'&&f1=='W'||f=='w'&&f1=='d'||f=='d'&&f1=='s'||f=='s'&&f1=='a'||f=='a'&&f1=='w')
                                xuanz=0;
                            else xuanz=1;
                            f=f1;
                            }
                }
        }
    
    
    }
    void snakyundon()//这个也是蛇的运动,忘记用了那个,自己看
    {
        int k=1;
        for(int i=shu-1;i>0;i--)
        {
            snkz[i]=snkz[i-1];
        }
        if(f=='W'||f=='w')snkz[0].y-=k;
        if(f=='S'||f=='s')snkz[0].y+=k;
        if(f=='A'||f=='a')snkz[0].x-=k;
        if(f=='D'||f=='d')snkz[0].x+=k;
    }
    int snakdead()//判断蛇是否死亡
    {
        int flag=0;
        for(int i=1;i<shu;i++)
        {
            if(snkz[0].x==snkz[i].x&&snkz[0].y==snkz[i].y)flag=1;
        }
        if(snkz[0].y==0||snkz[0].y==ditu_y||snkz[0].x==0||snkz[0].x==ditu_x)
            flag=1;
        return flag;
    }
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        chus();
        ui->setupUi(this);
        QWidget *widgetMain = new QWidget();//布局管理器
        QVBoxLayout *verLayout = new QVBoxLayout(widgetMain);//
        QTimer *timer = new QTimer(this);//新建一个定时器
        connect(timer,SIGNAL(timeout()),this,SLOT(timeUpDate()));//连接信号与槽
        timer->start(speed);设置间隔时间
        //ui->label_2->setText(QString::number(shu));
    }
    
    MainWindow::~MainWindow()
    {
        //if(pause==-1)close();
        delete ui;
    }
    void MainWindow::timeUpDate()
    {
        if(snakdead())
           {
            ui->pushButton->setText("重新游戏");
            pause=-1;
            }
         if(!pause)
        {
             ui->label_3->setText("gaming...");
            ui->lcdNumber->display(shu);
            ui->lcdNumber_2->display(450-speed);
            ui->lcdNumber_3->display(snkz[0].x);
            ui->lcdNumber_4->display(snkz[0].y);
            eat();
            snakyundon();
            update();
        }
    }
    void MainWindow::paintEvent(QPaintEvent*w)
    {
            QPainter painter(this);
            setWindowTitle(QStringLiteral("snake"));
            QFont ft;
            ft.setPointSize(20);
            QPalette clo;
            clo.setColor(QPalette::WindowText,Qt::blue);
            ui->label_3->setFont(ft);
            ui->label_3->setPalette(clo);
            QPixmap ps(500,500);
            ps.load(":/new/prefix1/D:/qt/qt/code/sorce/shu.png");
            if(pause==-1)
            {
                ui->pushButton->setText("重新游戏");
                ui->label_3->setText("you are dead...");
                painter.drawPixmap(0,0,500,500,ps);
            }
            else
            {
            painter.drawPixmap(0,0,500,500,QPixmap(":/new/prefix1/D:/qt/qt/code/sorce/beij.png"));
            painter.setRenderHints(QPainter::Antialiasing,false);
            QPixmap pixa(20, 20);
            pixa.load(":/new/prefix1/D:/qt/qt/code/sorce/head (a).png"); //
            QPixmap pixs(20, 20);
            pixs.load(":/new/prefix1/D:/qt/qt/code/sorce/head (s).png"); //
            QPixmap pixd(20, 20);
            pixd.load(":/new/prefix1/D:/qt/qt/code/sorce/head (d).png"); //
            QPixmap pixw(20, 20);
            pixw.load(":/new/prefix1/D:/qt/qt/code/sorce/head (w).png"); //
            QPixmap pix2(20,20);
            pix2.load(":/new/prefix1/D:/qt/qt/code/sorce/body.png");
            QPixmap pix3(20,20);
            pix3.load(":/new/prefix1/D:/qt/qt/code/sorce/body (2).png");
            painter.drawPixmap(foodz.x*20, foodz.y*20, pix2);
            for(int i=1;i<shu;i++)
            {
                 painter.drawPixmap(snkz[i].x*20, snkz[i].y*20, pix3);
            }
            if(f=='w'||f=='W')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixw);
            if(f=='s'||f=='S')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixs);
            if(f=='a'||f=='A')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixa);
            if(f=='d'||f=='D')painter.drawPixmap(snkz[0].x*20, snkz[0].y*20, pixd);
            }
    }
    void MainWindow::keyPressEvent(QKeyEvent *e)
    {
    
       //int keyvalue=e->key();
       if(e->key()==Qt::Key_W)
       {
    
           // k1++;
          if(f!='S')
          {
              f='W';
          }
       }
       if(e->key()==Qt::Key_A)
       {
           //k1++;
           if(f!='D')
           {
               f='A';
           }
       }
       if(e->key()==Qt::Key_S)
       {
           //k1++;
           if(f!='W')
           {
               f='S';
           }
       }
       if(e->key()==Qt::Key_D)
       {
           //k1++;
           if(f!='A')
           {
               f='D';
           }
       }
    }
    
    void MainWindow::on_label_2_linkActivated(const QString &link)
    {
    
    }
    
    void MainWindow::on_pushButton_clicked()
    {
       if(pause==1)
        {
           ui->pushButton->setText("暂停");
           ui->label_3->setText("gaming...");
           pause=0;
       }
       else if(pause==0)
       {
           ui->pushButton->setText("继续");
           ui->label_3->setText("stoping...");
           pause=1;
       }
       else if(pause==-1)
       {
         ui->pushButton->setText("暂停");
         chus();
    
         ui->label_3->setText("gaming...");
         pause=0;
       }
    
    }
    
    void MainWindow::on_pushButton_2_clicked()
    {
       // pause=-1;
       // parentWidget()->show();
        delete this;
        // this->hide();//主界面关闭
    
    }
    

      大概就是这样,有关qtime,qkeyevent,qpaiter等,自己去查资料,(主要是想睡觉了)

    最后分享整个项目(包括我辛辛苦苦剪辑的图片素材)

    链接: https://pan.baidu.com/s/1rApHeAUTQ-CpS7y-zetNxg

    密码: 1wgt

  • 相关阅读:
    POJ 3667 & HDU 3308 & HDU 3397 线段树的区间合并
    HDU 5992 kd-tree
    BZOJ 4154 kd-tree dfs序 + 二维空间的区间(矩阵)更新单点查找
    BZOJ 4066 kd-tree 矩形询问求和
    BZOJ 1941 kd-tree
    BZOJ 2648 kd-tree模板
    HDU 5925 离散化
    php trait
    php命名空间
    js
  • 原文地址:https://www.cnblogs.com/miaos/p/miaoz-2-3.html
Copyright © 2011-2022 走看看