home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
207.lha
/
BackGammon
/
backscn.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-12-27
|
16KB
|
727 lines
/********************************************************************/
/* */
/* Hoser BackGammon version 1.0 */
/* */
/* Robert Pfister */
/* */
/* Rfd#3 Box 2340 home:(207)-873-3520 */
/* Waterville, Maine 04901 */
/* */
/* Pfister_rob%dneast@dec.decwrl */
/* */
/* */
/* Copyright June,1987 all rights reserved. */
/* */
/* This program will play a game of backgammon at the novice level */
/* */
/* The code is in 4 parts... */
/* */
/* 1) back.c - main driver */
/* / 2) eval.c - evaluation of moves */
/* \/ 3) backscn.c - screen stuff.. */
/* 4) backmenu.c - menu stuff, help text, and ``decoder'' */
/* */
/* this was compiled under Manx 3.20a, using long integers */
/* */
/********************************************************************/
extern int Uside,Cside;
#include <stdio.h>
#include <exec/types.h>
#include <graphics/gfxmacros.h>
#include <graphics/rastport.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <functions.h>
#undef NULL
#define NULL ((void *) 0)
#define NL 0
/* color index's */
#define tm1 0L
#define tm2 1L
#define back 2L
#define spike1 3L
#define spike2 4L
#define peice1 5L
#define peice2 6L
#define dice 7L
/* now define those colors */
#define backc 0x0F0L
#define spike1c 0xFF0L
#define spike2c 0xF00L
#define peice1c 0x000L
#define peice2c 0x00FL
#define dicec 0xFFFL
#define tm1c 0x606L
#define tm2c 0xDDDL
static UWORD colors[8];
/* describe the playing field */
#define maxX 637L
#define minX 3L
#define maxY 189L
#define minY 25L
#define PerSpike 6L
#define MyTitle "Hoser BackGammon Copyright June 1987 Robert Pfister"
struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;
static struct RastPort *rp;
static struct ViewPort *vp;
static struct Window *w;
static struct Screen *screen;
extern struct Menu *MyMenu; /* get the menu somewhere else */
struct NewScreen ns = {
0L,0L,640L,200L,3L,
0,1,HIRES,
CUSTOMSCREEN,NULL,
(UBYTE *)MyTitle,
NULL,NULL };
struct NewWindow nw = {
0L,10L,640L,190L,0L,1L,
CLOSEWINDOW|MOUSEBUTTONS|MENUPICK,
SMART_REFRESH|ACTIVATE|WINDOWDRAG|WINDOWDEPTH,
NULL,NULL,
(UBYTE *)"BackGammon anyone?",
NULL,NULL,
0L,0L,640L,200L,CUSTOMSCREEN };
struct NewWindow crnw = {
20L,20L,600L,170L,0L,1L,
CLOSEWINDOW|MOUSEBUTTONS|MENUPICK,
WINDOWCLOSE|SMART_REFRESH|ACTIVATE|WINDOWDRAG|WINDOWDEPTH,
NULL,NULL,
(UBYTE *)"BackGammon credits",
NULL,NULL,
0L,0L,640L,200L,CUSTOMSCREEN };
static UWORD AreaBuf[1000];
static PLANEPTR TBuf;
static struct TmpRas TRas;
static struct AreaInfo AInfo;
Gsetup()
{
long x,size;
int i;
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
if (GfxBase == NULL) Gerror("no graphics lib");
IntuitionBase =
(struct IntuitionBase *)OpenLibrary("intuition.library",0L);
if (IntuitionBase == NULL) {
CloseLibrary(GfxBase);
Gerror("no intuition");
}
screen = (struct Screen *)OpenScreen(&ns);
if (screen == NULL) {
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
Gerror("no screen");
}
nw.Screen = screen;
w = (struct Window *)OpenWindow(&nw);
if (w == NULL) {
CloseScreen(screen);
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
Gerror("no window");
}
vp = &screen->ViewPort;
rp = w->RPort;
/* intialize temporary area space */
InitArea(&AInfo,AreaBuf,200L);
rp->AreaInfo=&AInfo;
TBuf=(PLANEPTR)AllocRaster(640L,200L);
if (TBuf==NULL)
{
ClearMenuStrip(w); /* do this to avoid nasty's */
CloseWindow(w);
CloseScreen(screen);
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
Gerror("no raster");
}
SetMenuStrip(w,MyMenu);
size=RASSIZE(640L,200L);
rp->TmpRas=(struct TmpRas *)InitTmpRas(&TRas,TBuf,size);
/* load in the colors */
colors[back] =backc;
colors[spike1]=spike1c;
colors[spike2]=spike2c;
colors[peice1]=peice1c;
colors[peice2]=peice2c;
colors[tm1] =tm1c;
colors[tm2] =tm2c;
colors[dice] =dicec;
for (i=0;i<8;i++)
{
SetRGB4(vp,(long) i,(long)((colors[i] >>8) & 0xF),
(long)((colors[i] >>4) & 0xF),
(long)((colors[i] ) & 0xF));
}
SetDrMd(rp,JAM1);
SetAPen(rp,back);
RectFill(rp,minX,minY,maxX,maxY);
for (i=1;i<=24;i++)
{
PutSpike(i,0);
}
x=((maxX+minX)/2);
SetAPen(rp,tm1);
RectFill(rp,(long)(x-2),minY,(long)(x+2),maxY);
Move(rp,4L,(long)minY-6);
SetAPen(rp,peice1);
Text(rp,(char *)"Number of Moves Evaluated",25L);
}
int l1,l2,r1,r2; /* saved dice positions */
/* swap the dice positions on the screen */
SwapDice()
{
int di[4];
int sr1,sr2;
di[0]=l1;
di[1]=l2;
sr1 =r1;
sr2 =r2;
Uside=-Uside;
Cside=-Cside;
ShowDice(di,Cside);
di[0]=sr1;
di[1]=sr2;
ShowDice(di,Uside);
}
/* put dice on the screen */
ShowDice(d,c)
int d[4],c;
{
int y,x1,x2;
char Line[6];
y =(maxY+minY)/2;
if (c==Cside)
{
l1=d[0];
l2=d[1];
x1=40+(maxX+minX)/2;
x2=30+x1;
}
else
{
r1=d[0];
r2=d[1];
x1=-40+(maxX+minX)/2;
x2=-30+x1;
}
/* cover up dice with dice color */
SetAPen(rp,dice);
RectFill(rp,(long) x2-12,(long) y-4,(long) x2+12,(long) y+4);
RectFill(rp,(long) x1-12,(long) y-4,(long) x1+12,(long) y+4);
if ( (d[0]!=0) && (d[1]!=0))
{
/* put in the numbers for the left and right die */
if (c==Uside) SetAPen(rp,peice1);
else SetAPen(rp,peice2);
Move(rp,(long) x2,(long) y+3);
Line[0]='0'+d[0];
Line[1]='\0';
Text(rp,Line,1L);
Move(rp,(long) x1,(long) y+3);
Line[0]='0'+d[1];
Line[1]='\0';
Text(rp,Line,1L);
}
}
i2s(n1,Line)
int n1;
char Line[6];
{
int i,n;
n=n1;
for(i=0;i<=4;i++) Line[i]=' ';
Line[5]='/0';
Line[4]='0';
/* convert into a string */
for(i=4;(i>=0)&&(n>0);i--)
{
Line[i]=(n % 10) + '0';
n/=10;
}
}
PutMoveNumber(Number)
int Number;
{
char Line[6];
long x,y;
y= minY-6;
x= 210;
SetAPen(rp,tm1);
RectFill(rp,x,(long) y-6,(long) x+40,(long) y+4);
i2s(Number,Line);
SetAPen(rp,dice);
Move(rp,x,y);
Text(rp,Line,5L);
}
static struct IntuiMessage *message;
/* return any interesting input from the mouse...note that the window
close is automatic */
Whats_up(x)
int *x;
{
unsigned long Class;
unsigned short Code;
char code;
int xm,ym;
for (;;)
{
Wait(1L<< w->UserPort->mp_SigBit);
message=(struct IntuiMessage *) GetMsg(w->UserPort);
Code =message->Code;
Class=message->Class;
ReplyMsg(message);
if (Class==MENUPICK)
{
if (Code!=MENUNULL)
{
*x=(MENUNUM(Code)*100)+(ITEMNUM(Code)*10)+SUBNUM(Code);
return('C');
}
return(' '); /* aint nothing, better reset */
}
/* check if mouse pressed..... */
if ((Class==MOUSEBUTTONS)&&
(Code==SELECTDOWN))
{
xm=(w->MouseX);
ym=(w->MouseY);
*x=decode(xm,ym);
if (*x==-1) return('D');
else return('P');
}
} /* end for ever */
} /* end main */
finit()
{
FreeRaster(TBuf,640L,200L);
CloseWindow(w);
CloseScreen(screen);
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
}
/* return the 'spike' number given the screen point relative to upper left
corner of the window */
decode(x,y)
int x,y;
{
int peice,mid,midy,height,disp;
mid=(minX+maxX)/2;
if (x>mid) disp=8;
else disp=0;
height=(maxY-minY)/2.5;
midy=(minY+maxY)/2;
/* check if dice 'clicked'...indicates unusual end of turn */
if ((y>midy-5)&&(y<midy+5)&&(x<mid-28)&&(x>mid-82)) return(-1);
/* check if 'bar' selected */
if ( (x>(mid-10)) && (x<(mid+10))
&& (y>height) && (y<(maxY-height)) ) peice=0;
else peice= 1+(12*(x+disp))/(maxX-minX);
if ( y < (maxY+minY)/2) peice=25-peice;
return(peice);
}
static int ErrSet=FALSE;
DoMenuStrip(errmsg)
char errmsg[];
{
ErrSet=TRUE;
SetWindowTitles(w,-1L,errmsg);
}
UnDoMenuStrip()
{
if (ErrSet==TRUE)
{
SetWindowTitles(w,-1L,MyTitle);
ErrSet=FALSE;
}
}
/* put up a plain old requestor given 3 strings
name...the question/statement of the requestor
yes....the positive response
no.....the negative response
this returns 'true' for the yes, 'false' for the no */
static struct IntuiText RB = {tm1 ,tm2 ,JAM2, 50, 10,NL,(UBYTE *)" ",NL};
static struct IntuiText RY = {spike2,spike1,JAM1, 8, 3,NL,(UBYTE *)"Yes",NL};
static struct IntuiText RN = {spike2,spike1,JAM1, 8, 3,NL,(UBYTE *)"No ",NL};
requestor(name,yes,no)
char name[],yes[],no[];
{
RB.IText=(UBYTE *)name;
RY.IText=(UBYTE *)yes;
RN.IText=(UBYTE *)no;
return(AutoRequest(w,&RB,&RY,&RN,NULL,NULL,300L,90L));
}
Gerror(msg)
char *msg;
{
if (msg) {
puts("ERROR: ");
puts(msg);
puts("\n");
}
if (msg) exit(-1);
else exit(0);
}
PutSpike(spk,peices)
int spk,peices;
{
long color,x,y,x1,y1,x2,y2,x3;
int disp,n,i,sign;
char line[10];
/* pick color of the peices */
if (peices<0) color=peice1;
else color=peice2;
/* plot the ones on the 'bar' */
x1=-20+(minX+maxX)/2;
x2=x1+40;
y1=(maxY+minY)/2;
if (spk==0)
{
SetAPen(rp,back);
RectFill(rp,x1,y1,x2,(long)(y1+20));
x=((maxX+minX)/2);
SetAPen(rp,tm1);
RectFill(rp,(long)(x-2),y1,(long)(x+2),maxY);
if (peices>0)
{
PutPeice((long)(x1+20),(long)(y1+10),color);
line[0]=('0'+peices);
line[1]='\0';
Move(rp,(long)(x1+18),(long)(y1+12));
SetAPen(rp,dice);
Text(rp,line,1L);
}
return(0);
}
if (spk==25)
{
SetAPen(rp,back);
RectFill(rp,x1,(long)(y1-20),x2,y1);
SetAPen(rp,tm1);
x=((maxX+minX)/2);
RectFill(rp,(long)(x-2),minY,(long)(x+2),y1);
if (peices<0)
{
PutPeice((long)(x1+20),(long)(y1-10),color);
line[0]=('0'-peices);
line[1]='\0';
Move(rp,(long)(x1+18),(long)(y1-8));
SetAPen(rp,dice);
Text(rp,line,1L);
}
return(0);
}
n=(maxX-minX)/ 12;
y=(maxY-minY)/ 2.5;
x=spk;
if (x>12) x=25-x;
if (x>6) disp=8;
else disp=0;
x1=(x*n) -(n/2)+minX+disp;
x2=(x*n) +minX+disp;
x3=((x-1)*n) +minX+disp;
/* box in the area around the spike with background color...*/
SetAPen(rp,(long)back);
if (spk<13)
{
sign=-1;
y1=maxY-y;
y2=maxY;
RectFill(rp,x3,y1,x2,y2);
}
else
{
sign=1;
y1=minY+y;
y2=minY;
RectFill(rp,x3,y2,x2,y1);
}
/* color in spike */
if (spk%2 ==1) SetAPen(rp,(long)spike1);
else SetAPen(rp,(long)spike2);
AreaMove(rp,x1,y1);
AreaDraw(rp,x2,y2);
AreaDraw(rp,x3,y2);
AreaDraw(rp,x1,y1);
AreaEnd(rp);
if (peices<0) peices=-peices;
/* go through number of peices, up to "PerSpike" */
for(i=0;(i<peices)&&(i<PerSpike);i++)
{
y=(y2+(sign*( (i*10)+6 )));
PutPeice(x1,y,color);
}
/* put some fancy numbers on it if >PerSpike peices */
if (peices>=PerSpike)
{
line[0]=('0'+peices);
line[1]='\0';
if (spk<13) y2=y2-3;
else y2=y2+9;
Move(rp,x1,y2);
SetAPen(rp,dice);
Text(rp,line,1L);
}
} /* end of PutSpike */
BlinkPeice(board,pos)
int board[26],pos;
{
int part,n,x1,y,disp,sign,i;
PutSpike(pos,board[pos]);
if (board[pos]==0) return(0); /* Dont bother if nothing there */
part=(maxX-minX)/ 12;
n=board[pos];
if (n<0) n=0-n;
if (n>PerSpike) n=PerSpike;
if (pos<13)
{
i=pos;
sign=+1;
y=maxY-(n*10)+4;
}
else
{
i=25-pos;
y=minY+(n*10)-4;
}
if (i>6) disp=8;
else disp=0;
/* this is the x-coord */
x1=(i*part) - (part/2)+minX+disp;
/* if the bar, do something different */
if (pos==0)
{
y=((maxY+minY)/2)+10;
x1=((maxX+minX)/2);
}
if (pos==25)
{
y=((maxY+minY)/2)-10;
x1=((maxX+minX)/2);
}
if (board[pos]<0) n=peice1;
else n=peice2;
for(i=1;i<=5;i++)
{
Delay(1);
PutPeice(x1,y,dice);
Delay(1);
PutPeice(x1,y,n);
}
}
static WORD shapeX[9]={15,15,4,-4,-15,-15,-4,4,15};
static WORD shapeY[9]={-2,2,4,4,2,-2,-4,-4,-2};
PutPeice(x,y,color)
long x,y,color;
{
int i;
long x1,y1;
SetAPen(rp,color);
AreaMove(rp,(long)(x+shapeX[0]),(long)(y+shapeY[0]));
for (i=1;i<=8;i++)
{
x1=x+shapeX[i];
y1=y+shapeY[i];
AreaDraw(rp,x1,y1);
}
AreaEnd(rp);
}
TextScreen(stuff,num)
char *stuff[];
int num;
{
int i;
unsigned long Class;
unsigned short Code;
struct IOStdReq *re ,*wr;
struct MsgPort *rep,*wrp;
struct RastPort *crp;
struct Window *crw;
crnw.Screen=screen;
crnw.Title=(UBYTE *) stuff[0];
crw = (struct Window *)OpenWindow(&crnw);
if (crw != NULL)
{
crp=w->RPort;
rep=CreatePort("my.con.read",0);
re=CreateStdIO(rep);
wrp=CreatePort("my.con.write",0);
wr=CreateStdIO(wrp);
wr->io_Data=(APTR) crw;
wr->io_Length=sizeof(*crw);
if (OpenDevice("console.device",0,wr,0)==0)
{
re->io_Device = wr->io_Device;
re->io_Unit = wr->io_Unit;
/* loop through all the stuff and put it to the open'd console */
for (i=1;i<=num; i++)
{
wr->io_Command=CMD_WRITE;
wr->io_Data =(UBYTE *) stuff[i];
wr->io_Length =-1;
DoIO(wr);
}
/* close the console up */
DeleteStdIO(re);
DeletePort(rep);
DeleteStdIO(wr);
DeletePort(wrp);
}/* end-if console created */
for (;;)
{
Wait(1L<< crw->UserPort->mp_SigBit);
message=(struct IntuiMessage *) GetMsg(crw->UserPort);
Code =message->Code;
Class=message->Class;
ReplyMsg(message);
if (Class==CLOSEWINDOW) break;
}
CloseWindow(crw);
} /* end-if window opened */
return;
}