| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1651 人关注过本帖
标题:新手求教!C++要求贪吃蛇的程序运行时能够自动移动并计算得分,急需帮助,谢 ...
只看楼主 加入收藏
勿忘我心
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2015-11-14
收藏
 问题点数:0 回复次数:0 
新手求教!C++要求贪吃蛇的程序运行时能够自动移动并计算得分,急需帮助,谢谢 大家了
// game01.cpp : Defines the entry point for the console application.
//

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
using namespace std;

#define N 37    //背景大小
int LEN=5;    //蛇长度

int snake[2][200] ;  //蛇的坐标记录,最后一个点要恢复
int food,food_x,food_y; //
int time1=200;  //延时
void gotoxy(int x,int y)//位置函数
{    COORD pos;
    pos.X=2 * x ;
    pos.Y=y  ;  
    //SetConsoleCursorPosition是API中定位光标位置的函数
    //GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。
    /*
    STD_INPUT_HANDLE  标准输入的句柄
    STD_OUTPUT_HANDLE 标准输出的句柄
    STD_ERROR_HANDLE  标准错误的句柄
    */
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);  
}
void init( )//初始化地图围墙
{    system("cls");
    gotoxy(0,0);
    for(int i=0;i<N+2;i++)
    {    for(int j=0;j<N+2;j++)
        {    if(0==i || N+1 == i || 0==j || N+1 ==j ) // 判断围墙
            {    cout<<"□";
            }else{    cout<<"■";    }
        }
        cout<<endl;
    }

    //初始化蛇点坐标
    for (int i=0 ; i< LEN+1 ; i++)
    {    snake[0][i] = (int)(N/2);
        snake[1][i] = (int)(N/2);    }
}
//食物刷新函数
void oduce_food()
{    char i;
    if(food==0)    // 如果没有食物
    {    while(food==0)     //循环到有食物
        {    food_x=rand()%N+1;
            food_y=rand()%N+1;      //取食物XY坐标
            for (i=0 ;i<LEN+1;i++)   //判断是否和蛇身体重合
                if(food_x==snake[0][i] && food_y==snake[1][i])break;

            if(i==LEN+1)             //不重合就显示食物
            {    food=1;
                gotoxy(food_x,food_y);
                cout<<'*'<<endl;
            }
        }
    }
}
char fsnake(char ch )
{
    int new_x = 0,new_y = 0;
    switch(ch)
    {    case 'w':new_y = -1 ;break;
        case 's':new_y = 1 ;break;
        case 'a':new_x = -1 ;break;
        case 'd':new_x = 1 ;break;
        default: break; // 停止
    }

    //int i_len =LEN;
    if (0==new_x && 0==new_y)
    {    //停止了
    }else{
        //判断是否到围墙
        if ( 0==snake[0][0] + new_x || N+1==snake[0][0] + new_x
            || 0==snake[1][0] + new_y || N+1==snake[1][0] + new_y )
            return 1;
        
        //把坐标点往后移
        for (int i=LEN ;i>0 ;i--)
        {    snake[0][i]=snake[0][i-1];
            snake[1][i]=snake[1][i-1];
        }
        //计算新的第一个点
        snake[1][0] = snake[1][1] + new_y;
        snake[0][0] = snake[0][1] + new_x;
      
                //判断是否撞到身体
        for (int i=1 ;i<LEN ;i++)
            if(snake[0][0]==snake[0][i] && snake[1][0]==snake[1][i])return 1;
    }

    if(food_x==snake[0][0] && food_y==snake[1][0])//吃到食物就把蛇的长度加一,时间调快
    {    food=0,LEN++;
        if(time1>50) time1 -= 10;
    }else                 //否则就恢复最后一个点
    {    gotoxy(snake[0][LEN],snake[1][LEN]);
        cout<<"■"<<endl;
    }
    //显示蛇
    for (int i=0 ;i<LEN ;i++)
    {    gotoxy(snake[0][i],snake[1][i]);
        cout<<"◎"<<endl;
    }
    //最后一个点恢复
 
    oduce_food();     //食物刷新函数
    return 0;
}

int main(int argc, char* argv[])
{    //初始化 背景
    init( );
    srand(time(NULL)); //取当前时间为随机种子
    char ch='p';
    while(1)//进入消息循环
    {    if(kbhit())   // 检查当前是否有键盘输入
         {    gotoxy(0,N+2);
            ch=getche();
            gotoxy(0,N+2);
            cout<<"  "<<endl;
         }
        if(fsnake( ch )==1 || ch=='q')
        {
            gotoxy(0,N+2);return 1;
        }

        //Sleep(time1);
    }
}

[此贴子已经被作者于2015-11-14 22:53编辑过]

搜索更多相关主题的帖子: include 贪吃蛇 记录 
2015-11-14 22:47
快速回复:新手求教!C++要求贪吃蛇的程序运行时能够自动移动并计算得分,急需帮助 ...
数据加载中...
 
   



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

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