64Dos环境编小游戏,内存不足了,求助~~~

EmilMatthew 2004-12-17 10:17:02
最近学了些C下的图形函数,于是跃跃欲试想做一个DOS下的移豆的小游戏,就是一堆豆,
两个人拿,规定好每次拿的最大个数,谁拿走最后一粒算谁输,
游戏挺好写的,我想好了一个必胜的AI,而且,这个游戏是我第一个用C++写的程序。
不过,我把重点放在这个DOS下的程序的界面实现上,可以有人机对抗,人人对抗,还能设定游戏参数。
发现所有的东东都要自己来搞,好痛苦,也感觉实践了不少东西。
然而,当我这个程序搞了500多行,即主页面基本的框架已搭好,准备写游戏的交互部分时,出现问题了。
在进入INTRODUCTION或游戏的某个完法后,按ESC是可以回到开始的主画面的。再三次这样的进入和跳出后,BUG出现,即文字的字体模式全无,再试一两次后,强行从游戏中跳出。后来加了段捉ERROR的函数,发现问题了:
not enough memory to load font.
所以呢,我就开始想,到底是画面占用内存过多还是没有用类没有及时处理所造成。
如果是图形的问题,我还想先尝试尝试,因为知道方向了,GETIMAGE和SETIMAGE虽然还不太会用,但我相信还是能搞好的,等这方面有问题了再问。(用CLEARDEVICE发现无效,问题依旧。)
而我再注释掉大段图形操作的代码后,发现情况依旧,所以,怀疑是没有很好的处理无效类造成的。
所以我很想知道,问题到底是不是出在类上,如果是,还请高人指点我改如何做。
以下就是我写到了50%的代码,整体框架完全OK,但如果这个问题不解决,下面写下去的游戏是没法子玩的(只要把这个内存问题解决就好)。
千万别告诉我不要用DOS写游戏,这并不是我问这个问题的初衷。
主框架:(由于我是初学C++,我这里的几个类只不过是帮我更好的管理函数而已,分工明确。并不复杂。)
//编译环境TC++3。0。
//游戏中的消息
enum GameStatus{Win,Failure,Select,Gaming,Exit,GSFree};//游戏游程
enum GameModes{PvsC,PvsP,CvsC,OP,Intro,GMFree};//游戏模式,PERSON VS COMPUTER。。。,玩法简介及属性设定也在其中。
GameModes GModes=GMFree;
GameStatus GStatur=Select;

void main(void){
ScreenLayOut SC;//负责画静态图形的类
GameKeyControl KC;//游戏中的键盘响应类
GameMode GM;//主游戏中的游戏模式类

while(GStatur!=Exit){
SC.ErrorDetect();//错误捕捉类
switch(GStatur){
case Select:

SC.GraphicStart();
SC.Selectgame();
KC.Selectgame();//ZhongDuan Choose
if(GModes==Intro){ SC.Introduction();
KC.Introduction();//ZhongDuan Return
GModes=GMFree;
break;
}
if(GModes==OP){ SC.Option();
KC.Option();//ZhongDuan Return
GModes=GMFree;
break;
}



else if(GStatur!=Exit)GStatur=Gaming;
break;
case Gaming: GM.GameCommand();
break;
}
}

getch();
SC.GraphicEnd();
}
...全文
101 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
EmilMatthew 2004-12-17
  • 打赏
  • 举报
回复
class GameKeyControl{
public:
void Selectgame();
void Introduction();
void Option();
void GameKeyControl::OpTextOut(int In,int XPos,int YPos);//Option Aid Function
void Startgame();
void GSpVSc();
void GSpVSp();
void GScVSc();
void Gaming();
void GSpVScing();
void GSpVSping();
void GScVScing();
void Gamewin();
void Gamefailure();
void GamePause();

};
void GameKeyControl::Selectgame(){
int key=0,i=0;
int midx=getmaxx()/2,midy=getmaxy()/2;
int XPos=midx-65,YPos=midy-30,PerHeight=15,Pos=0;
int SelectGameOk=0;//At last ,I know why they always use >>!tiaojian
Motion Animate;
superCol Brush2;
// GameMode MainGame;
Brush2.printword(XPos,YPos,"*",2,0,5,WHITE);
while(key!=keyEsc&&!SelectGameOk){/*按下ESC键时退出程序,或选择完游戏进程后*/
//Debug Now>>
// debug[dbi]=key;
//dbi++;
while(bioskey(1)==0)
{ i++;
if(i==9)i=0;
Animate.Selectgame(midx-140+35*random(i),midy+130,random(i));
}/*Here Put Your Motion!*/
key=bioskey(0);/*GetASCII Value*/
switch(key){
case keyUp: if(YPos>midy-30){
Pos--;
YPos-=PerHeight;//up
Brush2.printword(XPos,YPos,"*",2,0,5,WHITE);
Brush2.printword(XPos,YPos+PerHeight,"*",2,0,5,BLUE);
}
break;
case keyDown:if(YPos<midy+45){
Pos++;
YPos+=PerHeight;//down
Brush2.printword(XPos,YPos,"*",2,0,5,WHITE);
Brush2.printword(XPos,YPos-PerHeight,"*",2,0,5,BLUE);
}
break;
case keyEnter: SelectGameOk=1;
switch(Pos){//
case 0: GModes=PvsC;
break;
case 1: GModes=PvsP;
break;
case 2: GModes=CvsC;
break;
case 3: GModes=Intro;
break;
case 4: GModes=OP;
break;
case 5: GStatur=Exit;
break;
}
break;


}
}
if(key==keyEsc)GStatur=Exit;
}
void GameKeyControl::Introduction(){
int key=0;
int i=0;
int midx=getmaxx()/2,midy=getmaxy()/2;
Motion Animate;
while(key!=keyEsc&&key!=keyEnter){//Enter or Esc Exit
while(bioskey(1)==0)
{ i++;
if(i==12)i=0;
Animate.Introduction(midx-140+35*random(i),midy+130,random(i));
}/*In this Loop, Put Your Motion!*/
key=bioskey(0);/*GetASCII Value*/
}
}
void GameKeyControl::OpTextOut(int In,int XPos,int YPos){//HIGH LIGHT
superCol Brush1;
switch(In){
case 0: Brush1.bar2(XPos-3,YPos-4,XPos+145,YPos+15,YELLOW);
Brush1.printword(XPos,YPos,"Low(Petium1 or 586)",2,0,4,GREEN);
Brush1.bar2(XPos+142,YPos-4,XPos+295,YPos+15,BLUE);
Brush1.printword(XPos+145,YPos,"Normal(Petium2 or Higher)",2,0,4,WHITE);
break;
case 1:Brush1.bar2(XPos-148,YPos-4,XPos,YPos+15,BLUE);
Brush1.printword(XPos-145,YPos,"Low(Petium1 or 586)",2,0,4,WHITE);
Brush1.bar2(XPos-3,YPos-4,XPos+145,YPos+15,YELLOW);
Brush1.printword(XPos,YPos,"Normal(Petium2 or Higher)",2,0,4,GREEN);
break;
}
}

void GameKeyControl::Option(){
int key=0;
int i=0,Index=0;
int midx=getmaxx()/2,midy=getmaxy()/2;
//int Options[3][3]={{0.05,0.01,0},{0,0,0},{0,0,0}};//a[0][0]:SecPerFrameV,可扩充至竖向选择
int XPos[3]={0,0,0},YPos[3]={0,0,0};
Motion Animate;
XPos[0]=midx-145;YPos[0]=midy-50;
OpTextOut(Index,XPos[0],YPos[0]);
while(key!=keyEsc&&key!=keyEnter){//Enter or Esc Exit
while(bioskey(1)==0)
{ i++;
if(i==12)i=0;
Animate.Option(midx-140+34*random(i),midy+130,2+random(i)/3,3+random(i)/4,random(i));
}/*In this Loop, Put Your Motion!*/
key=bioskey(0);
switch(key){
case KeyLeft: if(XPos[0]>midx-145){
Index--;
XPos[0]-=145;
OpTextOut(Index,XPos[0],YPos[0]);
}
break;
case keyRight: if(XPos[0]<midx){
Index++;
XPos[0]+=145;
OpTextOut(Index,XPos[0],YPos[0]);
}
break;
case keyUp://up For Entend Using
break;
case keyDown://down
break;
case keyEnter:switch(Index){
case 0:SecPerFrameV=0.05; break;
case 1: SecPerFrameV=0.02; break;
}
break;
}
}
}
void GameKeyControl::GSpVSc(){;}
void GameKeyControl::GSpVSp(){;}
void GameKeyControl::GScVSc(){;}
void GameKeyControl::Startgame(){
switch (GModes){
case PvsC:
GSpVSc();
break;
case PvsP:
GSpVSp();
break;
case CvsC:
GScVSc();
break;
}

}
void GameKeyControl::GSpVScing(){;}
void GameKeyControl::GSpVSping(){;}
void GameKeyControl::GScVScing(){;}
void GameKeyControl::Gaming(){
switch(GModes){
case PvsC:
GSpVScing();
break;
case PvsP:
GSpVSping();
break;
case CvsC:
GScVScing();
break;
}
}
//////////////////////////////////////////////////////////////////////////////
EmilMatthew 2004-12-17
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////////////////////////////////////////////
class ScreenLayOut{
public:
void GraphicStart();
void GraphicEnd();
void ErrorDetect();
void Selectgame();
void Introduction();
void Option();
void SGpVSc();
void SGpVSp();
void SGcVSc();
void Startgame();
void Gaming();
void GMpVScing();
void GMpVSping();
void GMcVScing();
void Gamewin();
void Gamefailure();
void GamePause();
};
void ScreenLayOut::GraphicStart(){
int gdriver,gmode;
gdriver=DETECT;
gmode=VGAHI;
//Kinitgraph(&gdriver,&gmode,"D:\\TC\\BGI");//Bgi's address shoud be compitabled with Source File
initgraph(&gdriver,&gmode,address);
}
void ScreenLayOut::GraphicEnd(){
closegraph();
getch();
}
void ScreenLayOut::ErrorDetect(){
int errorcode=0;
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
GStatur=Exit;
}
}
void ScreenLayOut::Selectgame(){
cleardevice();
int midx=getmaxx()/2,midy=getmaxy()/2;
superCol Brush;
Brush.rect2(midx-180,midy-150,midx+180,midy+150,CYAN);
Brush.rect2(midx-178,midy-148,midx+178,midy+148,YELLOW);
Brush.rect2(midx-176,midy-146,midx+176,midy+146,LIGHTGREEN);
Brush.bar2(midx-150,midy-110,midx+150,midy+100,BLUE);
Brush.printword(midx-130,midy-100,"Get Your Bean!!!",6,0,4);
Brush.printword(midx-50,midy-30,"Person vs Computer",2,0,5,WHITE);
Brush.printword(midx-50,midy-15,"Person vs Person",2,0,5,WHITE);
Brush.printword(midx-50,midy,"Computer vs Computer",2,0,5,WHITE);
Brush.printword(midx-50,midy+15,"Introduction",2,0,5,WHITE);
Brush.printword(midx-50,midy+30,"Options",2,0,5,WHITE);
Brush.printword(midx-50,midy+45,"Exit",2,0,5,WHITE);
Brush.printword(midx-130,midy+100,"Made By EmilMatthew 04/12/15",2,0,6);
}
void ScreenLayOut::Introduction(){
cleardevice();
int midx=getmaxx()/2,midy=getmaxy()/2;
superCol Brush;
Brush.bar2(midx-150,midy-110,midx+150,midy+100,BLUE);
Brush.printword(midx-150,midy-100,"Welcome to Get Your Bean!",1,0,3,LIGHTRED);
Brush.printword(midx-120,midy-70,"It's a very interesting game.",2,0,4,WHITE);
Brush.printword(midx-120,midy-60,"You and another player move",2,0,4,WHITE);
Brush.printword(midx-130,midy-50,"some bean each time.The total",2,0,4,WHITE);
Brush.printword(midx-130,midy-40,"num of the bean and the maximum",2,0,4,WHITE);
Brush.printword(midx-130,midy-30,"num which can be moved each ",2,0,4,WHITE);
Brush.printword(midx-130,midy-20,"time both can be set at the beginning ",2,0,4,WHITE);
Brush.printword(midx-130,midy-10,"of each round of game.You could also",2,0,4,WHITE);
Brush.printword(midx-130,midy,"choose AI levels.Did you know in this",2,0,4,WHITE);
Brush.printword(midx-130,midy+10,"game, sometimes you can always win?",2,0,4,WHITE);
Brush.printword(midx-130,midy+20,"My High AI knowing this,hey hey ,so",2,0,4,WHITE);
Brush.printword(midx-130,midy+30,"be careful and enjoy this game!",2,0,4,WHITE);
Brush.printword(midx-130,midy+35,"Have fun! !",5,0,4,RED);
Brush.printword(midx-140,midy+85,"Press ESC/ENTER to Main Menu",0,0,0,LIGHTGREEN);
Brush.printword(midx-130,midy+100,"Made By EmilMatthew 04/12/15",2,0,6);
}
void ScreenLayOut::Option(){
cleardevice();
superCol Brush;
int midx=getmaxx()/2,midy=getmaxy()/2;
Brush.bar2(midx-150,midy-110,midx+150,midy+100,BLUE);//Mask/Back
Brush.printword(midx-60,midy-110,"Options",1,0,0,BROWN);
Brush.printword(midx-140,midy-70,"Choose Property Game Speed:",2,0,5,YELLOW);
Brush.printword(midx-140,midy-50," Low(Petium1 or 586)",2,0,4,WHITE);
Brush.printword(midx,midy-50,"Normal(Petium2 or Higher)",2,0,4,WHITE);
Brush.printword(midx-140,midy+85,"Press ESC/Enter to Main Menu",0,0,0,LIGHTGREEN);
Brush.printword(midx-130,midy+100,"Made By EmilMatthew 04/12/15",2,0,6);

}
void ScreenLayOut::SGpVSc(){

cleardevice();
superCol Brush;
int midx=getmaxx()/2,midy=getmaxy()/2;
Brush.bar2(midx-150,midy-110,midx+150,midy+100,BLUE);//Mask/Back
Brush.printword(midx-80,midy-110,"Game Sets:",1,0,0,BROWN);
Brush.printword(midx-130,midy-70,"1. Your Name:",2,0,5,WHITE);
Brush.printword(midx-130,midy-50,"2.Total Num of the bean:",2,0,5,WHITE);
Brush.printword(midx-130,midy-30,"3.The limits num of the bean ",2,0,5,WHITE);
Brush.printword(midx-130,midy-10,"each time you can move:",2,0,5,WHITE);
Brush.printword(midx-130,midy+10,"4.Who Play first? ",2,0,5,WHITE);
Brush.backOutWord(midx+50,midy-70,midx+100,midy-50,"",YELLOW,GREEN,2,5);

}
void ScreenLayOut::SGpVSp(){;}
void ScreenLayOut::SGcVSc(){;}

void ScreenLayOut::Startgame(){
switch (GModes){
case PvsC:
SGpVSc();
break;
case PvsP:
SGpVSp();
break;
case CvsC:
SGcVSc();
break;
}
}
void ScreenLayOut::GMpVScing(){;}
void ScreenLayOut::GMpVSping(){;}
void ScreenLayOut::GMcVScing(){;}
void ScreenLayOut::Gaming(){
switch(GModes){
case PvsC:
GMpVScing();
break;
case PvsP:
GMpVSping();
break;
case CvsC:
GMcVScing();
break;
}
}

//////////////////////////////////////////////////////////////////////////////////////////
EmilMatthew 2004-12-17
  • 打赏
  • 举报
回复
64ODS中的64是多打的,请不要误解。
我目前的源代码(1):
#include<dos.h>
#include <stdio.h>
#include <graphics.h>
#include <time.h>
#include <conio.h>
#include <bios.h>
#include <stdlib.h>
#include <ctype.h>
//Pay attention to the bgi files!!!
//Oh Memory!!!!!
int const keyUp=0x4800;
int const keyDown=0x5000;
int const KeyLeft=0x4b00;
int const keyRight=0x4d00;
int const keyEnter=0x1c0d;
int const keyEsc=0x11b;
int const keyZ=0x2c7a;
int const keyX=0x2d78;
int const keyC=0x2e63;

void Delay2(double Times,float SecPerFrame=0.05);
enum GameStatus{Win,Failure,Select,Gaming,Exit,GSFree};
enum GameModes{PvsC,PvsP,CvsC,OP,Intro,GMFree};
float SecPerFrameV=0.05;
GameModes GModes=GMFree;
GameStatus GStatur=Select;
int debug[10000];
int dbi=0;
char address[]="D:\\Turboc3";

void fdebug(){
int t=0;
clrscr();
while(t<=dbi){
printf("%x",debug[t]);
t++;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
class superCol{
public:
void rect2(int tx,int ty,int bx,int by,int col=10);
void printword(int x, int y, const char far *textstring,int font=1,int direction=0,int charsize=0,int col=12);
void bar2(int tx,int ty,int bx,int by,int patternCol=BLUE,int patterns=SOLID_FILL);
void shapefill(int x,int y,int BorderCol,int patternCol=BLUE,int patterns=SOLID_FILL);
void circle2(int x,int y,int r,int col=RED);
void ellipse2(int x, int y,int xradius, int yradius, int col=GREEN,int stangle=0, int endangle=360);
void backOutWord(int tx,int ty,int bx,int by,const char far *textstring,int colB=YELLOW,int colF=GREEN,int font=1,int charsize=0,int direction=0);
};
void superCol::rect2(int tx,int ty,int bx,int by,int col){
setcolor(col);
rectangle(tx,ty,bx,by);
}
void superCol::printword(int x, int y, const char far *textstring,int font,int direction,int charsize,int col){
setcolor(col);
settextstyle(font, direction, charsize);
outtextxy(x,y,textstring);
}
void superCol::bar2(int tx,int ty,int bx,int by,int patternCol,int patterns){
setfillstyle(patterns,patternCol);
bar(tx, ty, bx,by);
}
void superCol::shapefill(int x,int y,int BorderCol,int patternCol,int patterns){
setfillstyle(patterns,patternCol);
floodfill(x,y,BorderCol);
}
void superCol::circle2(int x,int y,int r,int col){
setcolor(col);
circle(x,y,r);
}
void superCol::ellipse2(int x, int y,int xradius, int yradius, int col,int stangle, int endangle){
setcolor(col);
ellipse(x,y,stangle,endangle,xradius,yradius);
}

void superCol::backOutWord(int tx,int ty,int bx,int by,const char far *textstring,int colB,int colf,int font,int charsize,int direction){
bar2(tx,ty,bx,by,colB);
printword(tx+3, ty+3, textstring,font,direction,charsize,colf);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
class Motion//XOR Technology
{
public:
void Selectgame(int x,int y,int rnd);
void Introduction(int x,int y,int rnd);
void Option(int x,int y,int rndx,int rndy,int rnd);
void Startgame();
void Gaming();
void Gamewin();
void Gamefailure();
};
void Motion::Selectgame(int x,int y,int rnd){
superCol BrushMS;
BrushMS.circle2(x,y,8,rnd);
Delay2(0.2,SecPerFrameV);//MTION
BrushMS.circle2(x,y,8,BLACK);//CLEAN
}
void Motion::Introduction(int x,int y,int rnd){
superCol BrushMI;
BrushMI.rect2(x-6,y-6,x+6,y+6,rnd);
Delay2(0.2,SecPerFrameV);
BrushMI.rect2(x-6,y-6,x+6,y+6,BLACK);
}
void Motion::Option(int x,int y,int rndx,int rndy,int rnd){
superCol BrushMO;
BrushMO.ellipse2(x,y,rndx,rndy,rnd);
Delay2(0.2,SecPerFrameV);
BrushMO.ellipse2(x,y,rndx,rndy,BLACK);
}
dongyuanzhang 2004-12-17
  • 打赏
  • 举报
回复
看不咋懂!可能是你程序中的处理太占空间,或是申请了全局的数组空间太大!

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧