我做的C++作业 在vc6.0上可以运行 源代码复制到vc2010上编译通过,程序一运行就会秒退
作者&投稿:爰伯 (若有异议请与网页底部的电邮联系)
VC++6.0跟标准C++差别太大了,vc++8.0向标准C++更靠近了,不过差别应该不大,你按照提示信息稍微修改下应该就好了
你给那个程序我编译都没有通过。。。
c++在VC6.0中出现无法执行程序是设置错误造成的,解决方法为;
1、VC++6.0上出现提示“无法执行程序”,很可能是创建工程和文件的时候选择错了,注意运行C和C++的是.cpp文件,不是.h。
2、在创建工程的时候根据需要选择Win32 Console Application。
3、只是一些简单的小程序的话,选择C++Source File创建源文件。然后在上面运行程序。
4、首先,需要明白在一个工程文件中,只能有一个main主函数,如果你复制、编写代码的时候有多个主函数,那么就会无法执行程序。
5、最好的方法就是新建一个工程文件,让程序在新工程下创建的源文件中运行。
/*
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\"文件
",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\"文件,磁盘写保护!
",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 << "***********************";
if(i==1) cout << "等级为:" << grade;//显示等级
if(i==3) cout << "自动前进时间";
if(i==4) cout << "间隔为:" << gamespeed << "ms";//显示时间
if(i==6) cout << "历史最高分为:" << score << "分";
if(i==7) cout << "你现在得分为:" << (length+(grade-1)*8)*10 << "分";
if(i==8) cout << "**********************";
if(i==9) cout << "游戏说明:";
if(i==10) cout << "(1)用小键盘方向键控制";
if(i==11) cout << "蛇头运动方向;";
if(i==12) cout << "(2)蛇每吃一个果子蛇身";
if(i==13) cout << "增加一节;";
if(i==14) cout << "(3)蛇咬到自己或碰到墙";
if(i==15) cout << "壁游戏结束。";
if(i==18) cout << "**********************";
if(i==19) cout << "C/C++语言作业:";
if(i==20) cout << "zjlj,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<<"
贪吃蛇游戏即将开始 !"<<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 << "
进入倒计时:" << 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 << "按键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 << "游戏已结束!" << 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 << "游戏已结束!" << 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 << "游戏进行中!" << 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 << "游戏进行中!" << endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else
{
gotoxy(22,12);
cout << "游戏暂停中!" << endl;
}
}
/*
游戏运行时的核心算法结束
*/
}
while(1)
{
while(!kbhit());
if((direction =getch())==13)//按回车键开始下一局
break;
if(direction ==27)//按ESC退出游戏
exit(0);
}
system("cls");//清除屏幕重新开始
}
return 0;
}
最简单的解决办法:在最前面加上#include <cstdlib>,在最后return 0的前一行加上一句system("pause");,即可解决秒退问题,程序运行完会出现“按任意键退出”字样。原因:VC6.0在调试时会帮你自动加上类似语句,所以不会秒退,如果用VC6.0编写完运行程序的话,一样会秒退的,而VS2010无论是调试还是运行都不再自动加上暂停语句,所以就会出现秒退了。
秒退很正常啊,运行完了就自动退出了
不行的话就加一句
char x;
cin>>x;
试试用运行,而不是调试, 貌似是 ctrl + f5 而不是 直接 f5
结尾加一条语句:cin.get();然后你再运行程序就会等你按任意键才会结束输出画面。
梅池爱赛: 那个版本的vs,如果说是vs2005及其以上版本的话,不一定能运行,vs2005跟好一些,vc6.0不够标准;比如说: for(int i=0;i ; for(int i=0;i ; 这个在vs2005上可以运行,但在vc6.0上不可以,vc6.0会说i重复定义;
萧县18365632689: 为什么我编写的程序在VC++6.0上可以运行,在VS2015上就出现各种错误 - ?
梅池爱赛: VC++6.0并没有完全支持C++标准,VC6.0 1998年发布的时候,第一个C++标准才发布,这个东西太老了,能不用就不用. Visual C++ Redistributable Package 安装 Visual C++ 库的运行时组件.这些组件是运行使用 Visual Studio 2015 开发的 ...
萧县18365632689: 如何让c++程序使用VC6.0打开? - ?
梅池爱赛: 要在vC6.0打开C++的程序,可以先打开VC6.0程序,之后再把你要打开的C++程序找到编译好之后生成的,扩张名为 dsw 的文件直接拖到程序界面里就打开了,如果是,多文件程序的话,可以再VC6.0里,添加源文件和头文件的方法,来把整一...
萧县18365632689: VC++6.0运行不了怎么办 win7不兼容VC++解决办法 - ?
梅池爱赛: 方法/步骤1、运行主程序,会弹出一个程序兼容性的提示框,因为win7和VC++6.0本身存在兼容性问题,必须修改某些步骤才能完整运行.如下图,提示“此程序存在已知的兼容性问题”,我们只要勾选“ 不再显示此消息“,再点击“运行程序...
萧县18365632689: 怎么在VC++6.0上运行C++程序 - ?
梅池爱赛: 就在C++程序上右击选择打开方式,选择“在列表中选择程序”,在出现的对话框中点“浏览”,去选择VC++6.0的主程序打开就可以了.
萧县18365632689: 在VS2008里编的C++程序在VC6.0里能运行吗??
梅池爱赛: 通过强制工程转换或许可以. vs2008 增加,替换了很多SDK函数. VC6.0太老了,现在仅仅用来教学. 工作的话都在用vs2005 /vs2008来开发. vc6.0写的代码,你用vs2008建一个工程,代码拷贝过去就可以编译.
萧县18365632689: 好久没用vc++6.0了,我想说的是我以前做了一个c++的程序,现在怎么在vc++6.0里打开啊 - ?
梅池爱赛: 直接右键,点击打开方式,选择VC++6.0就可以啦
萧县18365632689: c++和C语言度可以用vc6.0吗??
梅池爱赛: 可以,vc6.0可以直接编译c和c++文件
萧县18365632689: 在vs创建C++项目后,我的vc不能用了,怎么回事? - ?
梅池爱赛: 在vc6.0上编的一个大项目,可是用vs2010编译之后出了好多问题. 什么i 没直接用了,在vc6中是可以的,但是vs2010(只要是vs系列的)就不能用了,,zAuezj
萧县18365632689: 有一个完整的c++代码.怎样在vc6.0中把它打开 - ?
梅池爱赛: 如果他也是vc6.0编写的,你要打开后缀为.dsw的文件