home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 18
/
amigaformatcd18.iso
/
-readerstuff-
/
steve_boxall
/
hangman
/
hangmanmain.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-07-18
|
12KB
|
756 lines
#include "HangmanGui.c"
#include "HangmanMain.h"
int wbmain()
{
main();
return 0;
}
void DummyProjectIDCMP(struct Window *wnd );
int main()
{
Guess_Filename_g="hangman.dat\0";
Guess_User_g="\0";
Guess_Word_g="\0";
Guessed_User_g=calloc(80,sizeof(char));
Game_On_g=0;
running=0;
SetupScreen();
OpenProject0Window();
ReadWordFile();
NewGameClicked();
while(running!=100)
{
running=HandleProject0IDCMP();
}
CloseProject0Window();
CloseDownScreen();
return 0;
}
int GuessItClicked( void )
{
int fnd_flag=0;
int i =0;
int len =0;
char *check;
OffGadget(Project0Gadgets[0],Project0Wnd,NULL);
check=DupString(((struct StringInfo *) (Project0Gadgets[0]->SpecialInfo))->Buffer);
rtrimstr(check);
ltrimstr(check);
len=strlen(check);
for(i=0;i<len;i++)
{
check[i]=ToUpper(check[i]);
}
if(len >1)
{
if(strcmp(check,Guess_Word_g)==0)
{
fnd_flag=2;
}
}
else
{
for(i=0;i<strlen(Guess_Word_g);i++)
{
if(Guess_Word_g[i]==check[0])
{
Guess_Mask_g[i]=check[0];
fnd_flag=1;
}
}
Gadget2Text.IText=Guess_Mask_g;
updateTxtGad(Project0Wnd,Project0Gadgets[2],&Gadget2Text);
if(strcmp(Guess_Mask_g,Guess_Word_g)==0)
{
fnd_flag=2;
}
}
if(fnd_flag==2)
{
Guess_User_g="\0";
Guess_Number_g=0;
Game_On_g=0;
ShowWinnerBox();
NewGameClicked();
}
if(fnd_flag==0)
{
if(len ==1)
{
Guessed_User_g=strcat(Guessed_User_g," \0");
Guessed_User_g=strcat(Guessed_User_g,check);
}
Guess_User_g="\0";
Guess_Number_g++;
DrawHangman(Project0Wnd);
if(Guess_Number_g >9)
{
Guess_User_g="\0";
Guess_Number_g=0;
Game_On_g=0;
ShowLoserBox();
NewGameClicked();
}
}
Gadget3Text.IText=Guessed_User_g;
updateTxtGad(Project0Wnd,Project0Gadgets[4],&Gadget3Text);
updateStrGad(Project0Wnd,Project0Gadgets[0],Guess_User_g);
OnGadget(Project0Gadgets[0],Project0Wnd,NULL);
}
int NewGameClicked( void )
{
int i=0;
int Item_No=0;
clock_t clk=clock();
if(Game_On_g==1)
{
i=HangmanRequestG(Project0Wnd);
}
if(i==1 | Game_On_g==0)
{
OffGadget(Project0Gadgets[5],Project0Wnd,NULL);
EraseRect(Project0Wnd->RPort,439,36,589,182);
EraseRect(Project0Wnd->RPort,160,45,400,90);
EraseRect(Project0Wnd->RPort,28,145,400,180);
Guess_Number_g=0;
srand(clk);
Item_No=rand();
Item_No=Item_No % Item_Count_g;
strcpy(Guessed_User_g,"Letters Guessed Wrong :\0");
Guess_Word_g=Word_List[Item_No];
Guess_Mask_g=DupString(Guess_Word_g);
for(i=0;i<strlen(Guess_Mask_g);i++)
{
Guess_Mask_g[i]='*';
}
Guess_User_g="\0";
Gadget2Text.IText=Guess_Mask_g;
updateTxtGad(Project0Wnd,Project0Gadgets[2],&Gadget2Text);
updateStrGad(Project0Wnd,Project0Gadgets[0],Guess_User_g);
OnGadget(Project0Gadgets[5],Project0Wnd,NULL);
Game_On_g=1;
}
}
int LoadWordsClicked( void )
{
int i=0;
struct FileRequester *Hangman_File;
i=HangmanRequestG(Project0Wnd);
if(i==1)
{
if (Hangman_File = (struct FileRequester *) AllocAslRequestTags(ASL_FileRequest,
ASL_Hail, (ULONG)"Hangman File Requester",
/* ASL_Dir, NULL,*/
ASL_File, (ULONG)"hangman.dat",
ASL_Pattern, (ULONG)"#?.dat",
ASL_Window, Project0Wnd,
TAG_DONE))
{
if (AslRequest(Hangman_File, 0L))
{
if (Hangman_File->rf_NumArgs==0)
{
Guess_Filename_g=calloc(101,sizeof(char));
strcpy(Guess_Filename_g,Hangman_File->fr_Drawer);
if(AddPart(Guess_Filename_g,Hangman_File->fr_File,100)==0)
{
strcpy(Guess_Filename_g,"Hangman.Dat\0");
}
}
}
FreeAslRequest(Hangman_File);
}
for(i=0;i<Item_Count_g;i++)
{
free(Word_List[i]);
}
ReadWordFile();
Game_On_g=0;
NewGameClicked();
}
}
/*
Process Exit Game Button
*/
int ExitGameClicked( void )
{
running =HangmanRequest(Project0Wnd);
}
/*
Update string gadget to show new entry
*/
void updateStrGad(struct Window *win, struct Gadget *gad, UBYTE *newstr)
{
/*
remove gadget from display before changing contents
*/
RemoveGList(win,gad,1);
/*
Change contents and reset current cursor positions in string
*/
strcpy(((struct StringInfo *) (gad->SpecialInfo))->Buffer,newstr);
((struct StringInfo *)(gad->SpecialInfo))->BufferPos =0;
((struct StringInfo *)(gad->SpecialInfo))->DispPos =0;
/*
Add Gadget back to display and refresh
*/
AddGList(win,gad,~0,1,NULL);
RefreshGList(gad,win,NULL,1);
/*
Finally re-activate string gadget
*/
ActivateGadget(gad,win,NULL);
}
/*
Draw the Hangman figure piece by piece
*/
void DrawHangman(struct Window *win)
{
int pen=GetAPen(win->RPort);
DisplayBeep(Scr);
switch(Guess_Number_g)
{
case 1:
SetAPen(win->RPort,1);
SetOPen(win->RPort,1);
Move(win->RPort,440,180);
RectFill(win->RPort,440,174,588,180);
SetAPen(win->RPort,pen);
break;
case 2:
SetAPen(win->RPort,1);
SetOPen(win->RPort,1);
Move(win->RPort,576,179);
RectFill(win->RPort,576,57,588,179);
SetAPen(win->RPort,pen);
break;
case 3:
SetAPen(win->RPort,1);
SetOPen(win->RPort,1);
Move(win->RPort,490,63);
RectFill(win->RPort,490,57,588,63);
SetAPen(win->RPort,pen);
break;
case 4:
SetAPen(win->RPort,7);
SetOPen(win->RPort,1);
Move(win->RPort,490,85);
RectFill(win->RPort,490,64,502,85);
SetAPen(win->RPort,pen);
break;
case 5:
SetAPen(win->RPort,1);
SetOPen(win->RPort,1);
DrawEllipse(win->RPort,496,95,10,10);
SetAPen(win->RPort,8);
Flood(win->RPort,0,499,98);
SetAPen(win->RPort,pen);
break;
case 6:
SetAPen(win->RPort,3);
SetOPen(win->RPort,1);
Move(win->RPort,485,135);
RectFill(win->RPort,485,106,507,135);
SetAPen(win->RPort,pen);
break;
case 7:
SetAPen(win->RPort,3);
SetOPen(win->RPort,1);
Move(win->RPort,440,110);
RectFill(win->RPort,440,106,484,110);
SetAPen(win->RPort,pen);
break;
case 8:
SetAPen(win->RPort,3);
SetOPen(win->RPort,1);
Move(win->RPort,508,110);
RectFill(win->RPort,508,106,552,110);
SetAPen(win->RPort,pen);
break;
case 9:
SetAPen(win->RPort,3);
SetOPen(win->RPort,1);
Move(win->RPort,485,160);
RectFill(win->RPort,485,136,492,160);
SetAPen(win->RPort,pen);
break;
case 10:
SetAPen(win->RPort,3);
SetOPen(win->RPort,1);
Move(win->RPort,500,160);
RectFill(win->RPort,500,136,507,160);
SetAPen(win->RPort,pen);
break;
default:
break;
}
}
/*
Read the vocabulary file selected by user
*/
void ReadWordFile(void)
{
char *field_p;
char *line =calloc(81,sizeof(char));
int i=0;
FILE *input=fopen(Guess_Filename_g,"r");
if(input >0)
{
while(!feof(input))
{
ReadLine(line,80,input);
field_p=DupString(line);
ltrimstr(field_p);
rtrimstr(field_p);
if(check_field(field_p)==0 && i<100)
{
Word_List[i]=field_p;
i++;
}
else
{
if(field_p >0)
{
/* free(field_p); */
}
}
}
fclose(input);
}
Item_Count_g=i;
}
/*
Check the field read from file is valid
*/
int check_field(char *r_p)
{
int checkit =1;
if(r_p >0)
{
if(strlen(r_p)>1 && strlen(r_p)<26)
{
checkit =0;
}
}
return checkit;
}
/*
Read a line from the vocabulary file
*/
int ReadLine(char *s, int sdblim, FILE *input)
{
int c,i;
for(i=0;i<sdblim-1 && (c=getc(input))!=EOF && c!='\n';i++)
{
s[i]=toupper(c);
}
s[i]='\0';
return i;
}
/*
strip leading spaces from string
*/
void ltrimstr(char from[])
{
char *to=calloc(strlen(from),1);
int k=0;
int j =0;
while(from[j] ==' ')
{
j++;
}
if(j >0)
{
for(k=0;k<strlen(from)-1;k++)
{
to[k]=from[j];
to[k+1]='\0';
j++;
}
strcpy(from,to);
free(to);
}
}
/*
rtrimstr - strip trailing spaces from string
*/
void rtrimstr(char from[])
{
char *to=calloc(strlen(from),1);
int j =strlen(from)-1;
if(from[j]==' ')
{
while(from[j] ==' ' && j >0)
{
j--;
}
strncpy(to,from,j+1);
strcpy(from,to);
free(to);
}
}
/*
Make a copy of the string parsed
*/
char *DupString(char *from)
{
char *to;
if(from >0)
{
to=calloc(strlen(from)+1,sizeof(char));
strcpy(to,from);
}
return to;
}
/*
Update a Text gadget
*/
void updateTxtGad(struct Window *win, struct Gadget *gad, struct IntuiText *newstr)
{
/*
remove gadget from display before changing contents
*/
RemoveGList(win,gad,1);
/*
Change contents and reset current cursor positions in string
*/
gad->GadgetText=newstr;
/*
Add Gadget back to display and refresh
*/
AddGList(win,gad,~0,1,NULL);
RefreshGList(gad,win,NULL,1);
/*
Finally re-activate string gadget
*/
ActivateGadget(gad,win,NULL);
}
/*
return button clicked to continue
*/
int WinnerOkClicked( void )
{
return 100;
}
/*
return button clicked to continue
*/
int LostOkClicked( void )
{
return 100;
}
/*
return button clicked to continue
*/
int AboutOkClicked( void )
{
return 100;
}
/*
Perform menu item new game
*/
int Project0GameItem0( void )
{
NewGameClicked();
return 0;
}
/*
Perform menu item load words
*/
int Project0GameItem1( void )
{
LoadWordsClicked();
return 0;
}
/*
Perform menu item about
*/
int Project0GameItem2( void )
{
ShowAboutBox();
return 0;
}
/*
Perform menu item Exit hangman
*/
int Project0GameItem3( void )
{
running=HangmanRequest(Project0Wnd);
return running;
}
/*
Show Hangman AboutBox
*/
void ShowAboutBox()
{
int runninga=0;
OpenProject3Window();
while(runninga!=100)
{
runninga=HandleProject3IDCMP();
if(Project0Wnd!=NULL)
{
DummyProjectIDCMP(Project0Wnd);
}
}
CloseProject3Window();
}
/*
Show Hangman WinnerBox
*/
void ShowWinnerBox()
{
int runninga=0;
OpenProject1Window();
Gadget4Text.IText=Guess_Word_g;
updateTxtGad(Project1Wnd,Project1Gadgets[2],&Gadget4Text);
while(runninga!=100)
{
runninga=HandleProject1IDCMP();
if(Project0Wnd!=NULL)
{
DummyProjectIDCMP(Project0Wnd);
}
}
CloseProject1Window();
}
/*
Show Hangman LoserBox
*/
void ShowLoserBox()
{
int runninga=0;
OpenProject2Window();
Gadget4Text.IText=Guess_Word_g;
updateTxtGad(Project2Wnd,Project2Gadgets[2],&Gadget4Text);
while(runninga!=100)
{
runninga=HandleProject2IDCMP();
if(Project0Wnd!=NULL)
{
DummyProjectIDCMP(Project0Wnd);
}
}
CloseProject2Window();
}
/*
Process List box on About Hangman Box
*/
int Gadget13Clicked(void)
{
return 0;
}
/*
Kill Hangman (Ok|Cancel)
*/
int HangmanRequest(struct Window *Win)
{
struct EasyStruct HangmanES = {
sizeof (struct EasyStruct),
0,
"Hangman 1997 Request",
"Exit Hangman?",
"Ok|Cancel"
};
int reply =0;
reply=EasyRequest( Win, &HangmanES, NULL, NULL);
if(reply ==1)
{
reply =100;
}
return reply;
}
/*
Warn Kill Hangman Game (Ok|Cancel)
*/
int HangmanRequestG(struct Window *Win)
{
struct EasyStruct HangmanES = {
sizeof (struct EasyStruct),
0,
"Hangman 1997 Request",
"This will abort the current Game",
"Ok|Cancel"
};
int reply =0;
reply=EasyRequest( Win, &HangmanES, NULL, NULL);
return reply;
}
/***********************************************
Disable Project Window Gadgets
************************************************/
void DummyProjectIDCMP(struct Window *wnd )
{
struct IntuiMessage *m;
while( m = GT_GetIMsg( wnd->UserPort ))
{
GT_ReplyIMsg( m );
}
}
int Project0CloseWindow( void )
{
/* routine for "IDCMP_CLOSEWINDOW". */
CloseProject1Window();
}
int Project1CloseWindow( void )
{
/* routine for "IDCMP_CLOSEWINDOW". */
CloseProject1Window();
}
int Project2CloseWindow( void )
{
/* routine for "IDCMP_CLOSEWINDOW". */
CloseProject2Window();
}
int Project3CloseWindow( void )
{
/* routine for "IDCMP_CLOSEWINDOW". */
CloseProject3Window();
}