| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1672 人关注过本帖
标题:谁能帮我把贪吃蛇动起来
只看楼主 加入收藏
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
结帖率:95.24%
收藏
已结贴  问题点数:0 回复次数:9 
谁能帮我把贪吃蛇动起来
贪吃蛇.rar (98.79 KB)
搜索更多相关主题的帖子: 贪吃 
2010-06-24 02:47
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:10 
继续等待吧。爱莫能助

南国利剑
2010-06-26 17:44
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:0 
帮你置顶高亮几天吧。
祝你好运。解决了,分享一下。我也想看看。
给我发个短消息。
谢谢

南国利剑
2010-06-26 17:45
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:10 
用什么编译器的?
2010-06-27 19:14
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
俄··什么编译器都好,思路可以就行了,我用VC,其它编译器可对应改,希望对你有帮助。要让贪吃蛇动起来,最起码要用到暂停时间函数,VC里的是Sleep()。然后要检测是否有输入。用kbhit()。大致实现如下代码(有注释的地方有改动,可对比。只是实现,没太大改动):
程序代码:
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <process.h>    /* _beginthread, _endthread */
#include <windows.h>    /* Sleep() */
using namespace std;
int a[100][100]={0};
int yes;
int p,q,sum;
class Snake
{
public:
    Snake()
    {
       x[0]=0;y[0]=4;x[1]=0;y[1]=3;x[2]=0;y[2]=2;
       line=3;
       sorce=0;
    }
    int new1()
    {
        if(a[x[line-1]-1][y[line-1]]==0)
        {
            x[line]=x[line-1]-1;
            y[line]=y[line-1];
        }
        if(a[x[line-1]+1][y[line-1]]==0)
        {
            x[line]=x[line-1]+1;
            y[line]=y[line-1];
        }
        if(a[x[line-1]][y[line-1]-1]==0)
        {
            x[line]=x[line-1];
            y[line]=y[line-1]-1;
        }
        if(a[x[line-1]][y[line-1]+1]==0)
        {
            x[line]=x[line-1];
            y[line]=y[line-1]+1;
        }
        if(sum!=0)
        {
            line+=1;
            sorce+=10;
        }
        return 0;
    }
    int run();
    int round();
    int x[200];
    int y[200];
    int line;
    int sorce;

};
class food
{
public:
    int born()
    {
        if(1)
        {
            for(;;)
            {
                x=rand()%10;
                y=rand()%10;
                if(a[x][y]!=42)
                   break;
            }
            a[x][y]=3;
        }
        return 0;
    }
    int x;
    int y;
};
Snake sanke;
food fod;
char way = 'd';// 刚开始的方向是向前
int again()
{
    for(int i=0;i<100;i++)
        for(int j=0;j<100;j++)
            if(i!=fod.x||j!=fod.y)
            a[i][j]=0;
    return 0;
}
int Snake::round()
{
    //char way;
   Snake();
   for(int i=sanke.line-1;i>0;i--)
   {
       sanke.x[i]=sanke.x[i-1];
       sanke.y[i]=sanke.y[i-1];
   }

 //  way = getch(); //不在这里输入
   system("cls");
   if(way=='w'||way=='a'||way=='s'||way=='d')
      sum+=1;
   switch(way)
   {
    case 'D':
   case 'd':
       {
           if((sanke.y[0])==9||a[sanke.x[0]][sanke.y[0]+1]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }
           sanke.y[0]=sanke.y[0]+1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
       case 'S':
   case 's':
       {
           if(sanke.x[0]==9||a[sanke.x[0]+1][sanke.y[0]]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }      
           sanke.x[0]+=1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
       case 'A':
   case 'a':
       {
           if(sanke.y[0]==0||a[sanke.x[0]][sanke.y[0]-1]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }      
           sanke.y[0]-=1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
       case 'W':
   case 'w':
       {
           if(sanke.x[0]==0||a[sanke.x[0]-1][sanke.y[0]]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }          
           sanke.x[0]-=1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
   }
   return 0;
}
int Snake::run()
{
   yes=1;
   for(p=0;p<10;p++)
       for(q=0;q<10;q++)
       {
           if(a[p][q]==3)
           {
               yes=0;
               break;
           }
       }
   if(yes==1)
   sanke.new1();
   sanke.round();
   for(int b=0;;)
   {
       if(1)
       {
            for(int t=0;t<10;t++)
                cout<<"---";
            for(int i=0;i<10;i++)
            {
               cout<<"|";
               cout<<endl;
               for(int j=0;j<10;j++)
               printf("%3c",a[i][j]);
            }
            cout<<endl;
            for( t=0;t<10;t++)
                cout<<"---";
            cout<<"         你的得分是:"<<sanke.sorce<<endl;
            break;
       }
   }
     for(int t=0;t<12;t++)
         cout<<endl;
    //  sanke.run(); //这里的递归不要了
     return 0;
}



int main()
{
    int b;
    cout<<"用w  s  a  d和回车来控制上下左右,按住任意方向键即可快速移动"<<endl;
    cout<<"\t空格键开始游戏"<<endl;
    a[0][2]=42;a[0][3]=42;a[0][4]=42;
    for(int t=0;t<10;t++)
        cout<<"---";
    for(int i=0;i<10;i++)
    {
        cout<<"|";
        cout<<endl;
        for(int j=0;j<10;j++)
            printf("%3c",a[i][j]);
    }
    cout<<endl;
    for(t=0;t<10;t++)
        cout<<"---";
    cout<<"         你的得分是:"<<sanke.sorce<<way<<endl;
    sum=0;
    while((b = getch()) != ' '); //  防止自动开始
    while(1)//
    {//
        while(!kbhit())  // 没有按键按下
        {       
            sanke.run();//
            if(kbhit())//
                ;//
            else//
                Sleep(500);//
        } //
    way = getch();    //
    } //
    cout<<endl;
    return 0;

 
}
2010-06-27 19:36
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 




感觉线程会好一点,然后发现了前面的一个很大的bug,按下其它键的时候会没反应,加个if判断下就行了。只是帮你动起来,完善自己搞定。
分两个线程,一个用来运动,一个用来接收字符指令。代码如下:
程序代码:
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <process.h>    /* _beginthread, _endthread */
#include <windows.h>    /* Sleep() */
using namespace std;
int a[100][100]={0};
int yes;
int p,q,sum;
class Snake
{
public:
    Snake()
    {
       x[0]=0;y[0]=4;x[1]=0;y[1]=3;x[2]=0;y[2]=2;
       line=3;
       sorce=0;
    }
    int new1()
    {
        if(a[x[line-1]-1][y[line-1]]==0)
        {
            x[line]=x[line-1]-1;
            y[line]=y[line-1];
        }
        if(a[x[line-1]+1][y[line-1]]==0)
        {
            x[line]=x[line-1]+1;
            y[line]=y[line-1];
        }
        if(a[x[line-1]][y[line-1]-1]==0)
        {
            x[line]=x[line-1];
            y[line]=y[line-1]-1;
        }
        if(a[x[line-1]][y[line-1]+1]==0)
        {
            x[line]=x[line-1];
            y[line]=y[line-1]+1;
        }
        if(sum!=0)
        {
            line+=1;
            sorce+=10;
        }
        return 0;
    }
    int run();
    int round();
    int x[200];
    int y[200];
    int line;
    int sorce;

};
class food
{
public:
    int born()
    {
        if(1)
        {
            for(;;)
            {
                x=rand()%10;
                y=rand()%10;
                if(a[x][y]!=42)
                   break;
            }
            a[x][y]=3;
        }
        return 0;
    }
    int x;
    int y;
};
Snake sanke;
food fod;
char way = 'd';// 刚开始的方向是向前
int again()
{
    for(int i=0;i<100;i++)
        for(int j=0;j<100;j++)
            if(i!=fod.x||j!=fod.y)
            a[i][j]=0;
    return 0;
}
int Snake::round()
{
    //char way;
   Snake();
   for(int i=sanke.line-1;i>0;i--)
   {
       sanke.x[i]=sanke.x[i-1];
       sanke.y[i]=sanke.y[i-1];
   }

 //  way = getch(); //不在这里输入
   system("cls");
   if(way=='w'||way=='a'||way=='s'||way=='d')
      sum+=1;
   switch(way)
   {
    case 'D':
   case 'd':
       {
           if((sanke.y[0])==9||a[sanke.x[0]][sanke.y[0]+1]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }
           sanke.y[0]=sanke.y[0]+1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
       case 'S':
   case 's':
       {
           if(sanke.x[0]==9||a[sanke.x[0]+1][sanke.y[0]]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }      
           sanke.x[0]+=1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
       case 'A':
   case 'a':
       {
           if(sanke.y[0]==0||a[sanke.x[0]][sanke.y[0]-1]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }      
           sanke.y[0]-=1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
       case 'W':
   case 'w':
       {
           if(sanke.x[0]==0||a[sanke.x[0]-1][sanke.y[0]]==42)
           {
               cout<<"-_-!你撞死了"<<endl;
               cin.get();
               exit(0);           
           }          
           sanke.x[0]-=1;
           again();
           if(yes==1)
           fod.born();
           for(int t=0;t<=line-1;t++)
           a[sanke.x[t]][sanke.y[t]]=42;
       };break;
   }
   return 0;
}
int Snake::run()
{
   yes=1;
   for(p=0;p<10;p++)
       for(q=0;q<10;q++)
       {
           if(a[p][q]==3)
           {
               yes=0;
               break;
           }
       }
   if(yes==1)
   sanke.new1();
   sanke.round();
   for(int b=0;;)
   {
       if(1)
       {
            for(int t=0;t<10;t++)
                cout<<"---";
            for(int i=0;i<10;i++)
            {
               cout<<"|";
               cout<<endl;
               for(int j=0;j<10;j++)
               printf("%3c",a[i][j]);
            }
            cout<<endl;
            for( t=0;t<10;t++)
                cout<<"---";
            cout<<"         你的得分是:"<<sanke.sorce<<endl;
            break;
       }
   }
     for(int t=0;t<12;t++)
         cout<<endl;
    //  sanke.run(); //这里的递归不要了
     return 0;
}

void ThreadFunc1(PVOID param)
{
while(1)   
{
Sleep(500);
sanke.run();
}

  }
  void ThreadFunc2(PVOID param)
  {
      char i;
  while(1)
  {  while(!kbhit());
    i = getch();
    if(i=='d' || i=='D' ||i=='w' ||i=='W' ||i=='s' ||i=='S' || i=='A'|| i=='a')
        way = i;

  }
  }
  int main()
  {
  int b;
  cout<<"用w  s  a  d和回车来控制上下左右,按住任意方向键即可快速移动"<<endl;
  cout<<"\t空格键开始游戏"<<endl;
  a[0][2]=42;a[0][3]=42;a[0][4]=42;
  for(int t=0;t<10;t++)
        cout<<"---";
        for(int i=0;i<10;i++)
        {
        cout<<"|";
        cout<<endl;
        for(int j=0;j<10;j++)
        printf("%3c",a[i][j]);
        }
        cout<<endl;
        for(t=0;t<10;t++)
        cout<<"---";
        cout<<"         你的得分是:"<<sanke.sorce<<way<<endl;
        sum=0;
        while((b = getch()) != ' '); //  防止自动开始
        _beginthread(ThreadFunc1,0,NULL);
        _beginthread(ThreadFunc2,0,NULL);
        while (1);
        return 0;
}

 
2010-06-27 19:46
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 6楼 lijm1989
非常感谢   能不能把你的QQ给 我   我的是  553069938

                                         
===========深入<----------------->浅出============
2010-07-08 19:21
bgkike
Rank: 2
来 自:湖南衡山
等 级:论坛游民
帖 子:28
专家分:16
注 册:2009-7-28
收藏
得分:0 
强....

加我QQ和我们一起来探讨.......
2010-07-16 10:41
lwbailw
Rank: 1
来 自:绥化
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-10-18
收藏
得分:0 
好喜欢(*@ο@*) 哇~
2010-07-22 19:23
夜凉
Rank: 1
来 自:江西
等 级:新手上路
帖 子:10
专家分:0
注 册:2011-4-30
收藏
得分:0 
以前老师叫我们做过许多类似的题目,有一组同学就是做你这个,我门寝室这一小组抄书的
2011-04-30 20:22
快速回复:谁能帮我把贪吃蛇动起来
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049282 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved