我做的C++作业 在vc6.0上可以运行 源代码复制到vc2010上编译通过,程序一运行就会秒退

这是什么原因?需要加什么析构函数什么的么?

/*
C/C++贪吃蛇游戏,zjlj,2015.3.16
*/
#define DEBUG 0 //当程序在调试阶段时 DEBUG为 1
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
void readini(FILE **fphead, int *score, char *argv[]) //创建或打开一个和运行文件对应的ini文件,读取最高纪录
{
 char filename[200],*pfilename;
 int flag=-1,i;
     
    strcpy(filename,argv[0]);
    for(i=0;filename[i]!='\0';i++)
 {
  if ('.'==filename[i])flag=1;
 }
  
 if(1==flag)
 {
 filename[i-1]='i';
    filename[i-2]='n';
 filename[i-3]='i';
 }
 else
 {
  filename[i]='.';
 filename[i+1]='i';
 filename[i+2]='n';
    filename[i+3]='i';
    filename[i+4]='\0';
 }
 for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
    if ( (*fphead=fopen(pfilename, "rb+"))==NULL)
 {
        if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
  {
    printf("无法创建或打开\"%s\"文件\n",pfilename);
    system("pause");
       exit(0);
  }
    }
 else
 {
  fread(score,sizeof(int),1,*fphead);
 }
}
void writeini(FILE **fphead, int *score, char *argv[])  //打开一个和运行文件对应的ini文件,写入最高纪录
{
 char filename[200],*pfilename;
 int flag=-1,i;
    
    strcpy(filename,argv[0]);
    for(i=0;filename[i]!='\0';i++)
 {
  if ('.'==filename[i])flag=1;
 }
  
 if(1==flag)
 {
 filename[i-1]='i';
    filename[i-2]='n';
 filename[i-3]='i';
 }
 else
 {
  filename[i]='.';
 filename[i+1]='i';
 filename[i+2]='n';
    filename[i+3]='i';
    filename[i+4]='\0';
 }
 for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
    if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
 {
          printf("无法写入\"%s\"文件,磁盘写保护!\n",pfilename);
    system("pause");
       exit(0);
 }
 else
 {
  rewind(*fphead);
  fwrite(score,sizeof(int),1,*fphead);
  fclose(*fphead);
 }
}
void gotoxy(int x,int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸
{
COORD pos;
pos.X=2*y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
 
void Refresh(int q[][22], int grade, int gamespeed, int length,int score) //  输出贪吃蛇棋盘
{
 int i,j;
 for(i=0;i<22;i++)
 {
  for(j=0;j<22;j++)
  {
   if(q[i][j]==0)//输出棋盘空白
   {
    gotoxy(i,j);
    color(11);
    cout<<"■";
   }
   if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁
   {  
    gotoxy(i,j);
    color(11);
    cout<<"□";
   }
   if(q[i][j]==3)//输出蛇头
   {  
    gotoxy(i,j);
    color(14);
    cout<<"★";
   }
   if(q[i][j]==4)//输出蛇身
   {  
    gotoxy(i,j);
    color(12);
    cout<<"◆";
   }
     if(q[i][j]==5)//输出果子
   {  
    gotoxy(i,j);
    color(12);
    cout<<"●";
   }
  }
  if(i==0) cout << "\t***********************";
  if(i==1) cout << "\t等级为:" << grade;//显示等级
  if(i==3) cout << "\t自动前进时间";
  if(i==4) cout << "\t间隔为:" << gamespeed << "ms";//显示时间
     if(i==6) cout << "\t历史最高分为:" << score << "分";
  if(i==7) cout << "\t你现在得分为:" << (length+(grade-1)*8)*10 << "分";
  if(i==8) cout << "\t**********************";
     if(i==9) cout << "\t游戏说明:";
     if(i==10) cout << "\t(1)用小键盘方向键控制";
  if(i==11) cout << "\t蛇头运动方向;";
  if(i==12) cout << "\t(2)蛇每吃一个果子蛇身";
  if(i==13) cout << "\t增加一节;";
  if(i==14) cout << "\t(3)蛇咬到自己或碰到墙";
  if(i==15) cout << "\t壁游戏结束。";
  if(i==18) cout << "\t**********************";
     if(i==19) cout << "\tC/C++语言作业:";
     if(i==20) cout << "\tzjlj,2015.03.16 ";
 }
}
  
int main(int argc, char *argv[]){
    int tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
    int i,j,score,directiontemp;
 FILE  *fpini;//*fpini 信息文件
 readini(&fpini, &score, argv);//读取ini文件的最高纪录
 if (score<0)//最高成绩小于零设置为零,初建文件会是负数
  score=0;
 while(1)
 {
  for(i=1;i<=20;i++)
   for(j=1;j<=20;j++)
    tcsQipan[i][j]=0;    //贪吃蛇棋盘相应坐标标上中间空白部分的标志0
  for(i=0;i<=21;i++)
   tcsQipan[0][i] = tcsQipan[21][i] = 1;      //贪吃蛇棋盘相应坐标标上上下墙壁的标志1
  for(i=1;i<=20;i++)
   tcsQipan[i][0] = tcsQipan[i][21] = 2;      //贪吃蛇棋盘相应坐标标上左右墙壁的标志2
  int tcsZuobiao[2][500];     //蛇的坐标数组
  for(i=0; i<4; i++)
  {
   tcsZuobiao[0][i] = 1;//蛇身和蛇头的x坐标
   tcsZuobiao[1][i] = i + 1;//蛇身和蛇头的y坐标
  }
  int head = 3,tail = 0;//标示蛇头和蛇尾的数组偏移量
  for(i=1;i<=3;i++)
   tcsQipan[1][i]=4;    //蛇身
  tcsQipan[1][4]=3;       //蛇头
  int x1, y1;           // 随机出果子
  srand(time(0));//设置随机种子
  do
  {
   x1=rand()%20+1;
   y1=rand()%20+1;
  }
  while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
  tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
  color(12);
  cout<<"\n\n\t\t\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始
  long start,starttemp;
  int grade = 1, length = 4;  //设置初始等级和蛇的初始长度
  int gamespeed = 500;  //设置初始前进时间间隔
  for(i=3;i>=0;i--)
  {
   start=clock();
   while(clock()-start<=1000);
   system("cls");
   if(i>0)
    cout << "\n\n\t\t\t\t进入倒计时:" << i << endl;  //倒计时显示
   else
    Refresh(tcsQipan,grade,gamespeed,length,score);  //初始棋盘显示
  }
  int timeover=1,otherkey=1;//初始化超时时间和按键判断参数
  char direction = 77;  // 设置初始情况下,向右运动
  int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量
  while(1)//运行一局游戏
  {
   start = clock();
   while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环
   if(direction==72||direction==80||direction==75 ||direction==77)
   directiontemp=direction;//保留上一次方向按键
            //starttemp=gamespeed+start-starttemp;//保留停留时间
   if(timeover)
   {
    #if (DEBUG==1)
    direction = getch();//调试代码
             #else
    if((direction =getch())==-32)
     direction = getch();
       #endif
   }
             #if (DEBUG==1)//调试代码
       start=clock();
    while(clock()-start<=2000);
    gotoxy(24,4);
    cout << "\t按键ASCII代码"<<(int)direction<<"    "<<endl;
             #endif
    if(!(direction==72||direction==80||direction==75 ||direction==77))
    {   
     otherkey=0;//  按键非方向键,otherkey设置为0
    }
    else
    {
     otherkey=1;//  按键为方向键,otherkey设置为1
    }
             if(direction==72 && directiontemp==80)//忽略反方向按键
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    else if(direction==80 && directiontemp==72)
   {
        direction=32;//设置按键为非方向键
      otherkey=0;//  按键为非方向键,otherkey设置为0
                // start = clock();
       //while(clock()-start<=starttemp);//补偿等待时间
    }
    else if(direction==75 && directiontemp==77)
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    else if(direction==77 && directiontemp==75)
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
     
     
    switch(direction)//判断方向键
    {
     case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;      // 向上
     case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
     case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
     case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;break;      // 向右
     default: break;
    }
    
  
    if(x==0 || x==21 ||y==0 || y==21)      // 蛇头碰到墙壁,结束本局游戏
    {  
     gotoxy(22,12);
     cout << "\t游戏已结束!" << endl;
     if(score>=(length+(grade-1)*8)*10)//判断是否破记录
     {
      gotoxy(10,7);
      color(12);
      cout << "闯关失败 加油耶!" << endl;
      fclose(fpini);//关闭ini文件
     }
     else
     {
      gotoxy(10,7);
      color(12);
      cout << "恭喜您打破记录" << endl;
      score=(length+(grade-1)*8)*10;
      writeini(&fpini, &score, argv);//写入ini文件的最高纪录
     }
     gotoxy(23,12);
        cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示
     break;//退出该局游戏
    }
    if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3) //   蛇头碰到蛇身,结束本局游戏
    {
     gotoxy(22,12);
     cout << "\t游戏已结束!" << endl;
     if(score>=(length+(grade-1)*8)*10)//判断是否破记录
     {
      gotoxy(10,7);
      color(12);
      cout << "闯关失败 加油耶!" << endl;
      fclose(fpini);//关闭ini文件
     }
     else
     {
      gotoxy(10,7);
      color(12);
      cout << "恭喜您打破记录" << endl;
      score=(length+(grade-1)*8)*10;
      writeini(&fpini, &score, argv);//写入ini文件的最高纪录
     }
     gotoxy(23,12);
     cout << "按回车键重新开始,按ESC退出游戏" << endl;//显示的提示
     break;//退出该局游戏
    }
    /*
    游戏运行时的核心算法开始
    */
    if(x==x1 && y==y1) //  吃果子,长度加1
    {   
     length ++;
     if(length>=8)//长度大于等于8重新计算长度,等级加1
     {
      length -= 8;//重新计算长度
      grade ++;//等级加1
      if(gamespeed>50)//控制最快速度为50
       gamespeed = 550 - grade * 50; // 改变自动前进时间间隔
     }
     tcsQipan[x][y]= 3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3
     tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4
     head = (head+1)%400;//防止数组越界
     tcsZuobiao[0][head] = x;//蛇头的x坐标
     tcsZuobiao[1][head] = y;//蛇头的y坐标
     do//随机出果子
     {
      x1=rand()%20+1;
      y1=rand()%20+1;
     }
     while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
     tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
     gotoxy(22,12);
     cout << "\t游戏进行中!" << endl;
     Refresh(tcsQipan,grade,gamespeed,length,score);
    }
    else  //  不吃果子
    {  
     if(otherkey)
     {
      tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;
      tail=(tail+1)%400;//防止数组越界
      tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;
      head=(head+1)%400;//防止数组越界
      tcsZuobiao[0][head]=x;//蛇头的x坐标
      tcsZuobiao[1][head]=y;//蛇头的y坐标
      tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;
      gotoxy(22,12);
      cout << "\t游戏进行中!" << endl;
      Refresh(tcsQipan,grade,gamespeed,length,score);
     }
     else
     {
      gotoxy(22,12);
      cout << "\t游戏暂停中!" << endl;
     }
    }
    /*
    游戏运行时的核心算法结束
    */
       }
    while(1)
    {
     while(!kbhit());
     if((direction =getch())==13)//按回车键开始下一局
      break;
     if(direction ==27)//按ESC退出游戏
      exit(0);
    }
       system("cls");//清除屏幕重新开始
 }
 return 0;
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-14
  最简单的解决办法:在最前面加上#include <cstdlib>,在最后return 0的前一行加上一句system("pause");,即可解决秒退问题,程序运行完会出现“按任意键退出”字样。原因:VC6.0在调试时会帮你自动加上类似语句,所以不会秒退,如果用VC6.0编写完运行程序的话,一样会秒退的,而VS2010无论是调试还是运行都不再自动加上暂停语句,所以就会出现秒退了。
第2个回答  2013-05-14
秒退很正常啊,运行完了就自动退出了
不行的话就加一句
char x;
cin>>x;
第3个回答  2013-05-14
试试用运行,而不是调试, 貌似是 ctrl + f5 而不是 直接 f5本回答被提问者采纳
第4个回答  2013-05-14
结尾加一条语句:cin.get();然后你再运行程序就会等你按任意键才会结束输出画面。

...源代码复制到vc2010上编译通过,程序一运行就会秒退
原因:VC6.0在调试时会帮你自动加上类似语句,所以不会秒退,如果用VC6.0编写完运行程序的话,一样会秒退的,而VS2010无论是调试还是运行都不再自动加上暂停语句,所以就会出现秒退了。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 周杰棍的双节龙 2013-05-14 · 超过25用户采纳过TA的回答 知道答...

我在VS2010上面想象在Visual C++ 6.0一样写c++ 但是为什么一点编译运行...
return 0;} 这个函数需要头文件 #include <stdlib> VC6和之前的版本程序都会自动加上这个函数,但是VC2003之后的版本都不会. 所以就会出现程序运行之后立刻结束的情况

为什么我用vc++6.0和vs2010编译同一段代码、运行速度天差地别
1、创建项目的时候选择一个空白的控制台项目,就是创建完以后一个文件都没有的那种。然后添加一个c++源文件,将代码写进去 2、编译的时候记得用release模式 3、记得运行的时候关闭电脑的其他程序,尽量让cpu的使用率保持一致 这样再试一下看看 额外说明一下,2010的功能比6.0强大很多,所以同样一段代码...

为什么我用vc++6.0和vs2010编译同一段代码、运行速度天差地别
1、创建项目的时候选择一个空白的控制台项目,就是创建完以后一个文件都没有的那种。然后添加一个c++源文件,将代码写进去 2、编译的时候记得用release模式 3、记得运行的时候关闭电脑的其他程序,尽量让cpu的使用率保持一致 这样再试一下看看 额外说明一下,2010的功能比6.0强大很多,所以同样一段代码...

我的VS C++6.0为什么编译总是出现一个错误?
“CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\/VC98\/Bin”下面, 你可以到相应的路径下找到这个应用程序。方法一:因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>“Option(选择)” —>“Directories(目录)”重新设置“Excutable Fils、Include Files、 ...

为什么同样的C程序在VC++6.0可以运行,在VS2010就不可以?
尝试了一下,虽然VC++ 6.0很老,也对上面这句报错,编译失败,应改为:swap(pointer_1, pointer_2); \/\/实现的是交换操作 函数定义和声明的时候才需要参数类型,调用的时候不需要,是因为声明与定义的时候已经告诉过编译器pointer_1, pointer_2的类型是int*。至于scanf,在VS 2010中给出是警告,...

为什么我编写的程序在VC++6.0上可以运行,在VS2015上就出现各种错误
vc(Microsoft Visual C++)一般指Microsoft Visual C++,Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、...1、VC++2015是Visual Studio 2015中的一个组件。 2、Visual ...

简述在VC++6.0环境下运行一个C++源程序的步骤
1、首先,打开我们的VC++6.0编程软件,点击左上角的“文件”菜单,并选择“新建”。2、接着,选择“win32consoleapplication”(win32控制台程序)。3、然后,填写好工程的名称,以及创建的位置,并点击“确定”按钮。4、接着,在工程类型中选择“一个空工程”,然后,点击“完成”按钮。5、接着,...

如何在VS2010中运行编译C和C++?
1、打开VS2010,点击菜单栏上的文件--》新建--》项目,如下图。2、选择Visual C++-->Win32控制台应用程序,填入名称和位置后点击“确定”。3、接下来出现Win32应用程序向导界面,然后点击“下一步”。4、进入应用程序设置,选择“空项目”,然后点击“完成”。如下图所示。5、在源文件夹下点击鼠标...

vs2010与vc++6.0的编程有什么区别?
1、编译器的不同 VC6.0更初级,更适合初学C语言的人使用,但是由于VC6.0推出的时间比较久,因此有很多变量和函数定义的方法都跟不上时代了,而且与win7会有一些不兼容;VS2010:相对功能比较完善,兼容性更好,代码风格和代码提示对于编程者来说更完善,编写程序更方便。2、实现功能的不同 从VS2002...

相似回答