在linux下ubuntu的五子棋游戏c语言代码.docx
《在linux下ubuntu的五子棋游戏c语言代码.docx》由会员分享,可在线阅读,更多相关《在linux下ubuntu的五子棋游戏c语言代码.docx(27页珍藏版)》请在冰豆网上搜索。
在linux下ubuntu的五子棋游戏c语言代码
#include
#include
//#include
#include
#include
#include
#include
#defineFB_W1024
#defineFB_H768
#defineCHESSBOARD110
#defineCHESSBOARD210
#defineX_OFFSET400
#defineY_OFFSET200
#defineX_CAPASITY10
#defineY_CAPASITY10
#defineSPACE40
#defineRED0x00ff0000
#defineBLUE0x0000ff00
#defineWHITE0xffffffff
#defineBLACK0xff000000
#defineNOKEY0
#defineRADIO19
#defineC_H17
#defineC_W10
#defineT___0x00ffffff
#defineX___0xff00ffff
#defineBORD0xeeff0000
#defineu32_tunsignedint
intarray[CHESSBOARD1][CHESSBOARD2][1];
intboard[CHESSBOARD1][CHESSBOARD2];
intplay1[CHESSBOARD1][CHESSBOARD2][4];
intcom[CHESSBOARD1][CHESSBOARD2][4];
intcursor_store[C_H][C_W];
structfb_info{
intw;
inth;
intbpp;
int*mem;
}fb;
staticu32_tcursor_pixel[C_H][C_W]=
{
{BORD,T___,T___,T___,T___,T___,T___,T___,T___,T___},
{BORD,BORD,T___,T___,T___,T___,T___,T___,T___,T___},
{BORD,X___,BORD,T___,T___,T___,T___,T___,T___,T___},
{BORD,X___,X___,BORD,T___,T___,T___,T___,T___,T___},
{BORD,X___,X___,X___,BORD,T___,T___,T___,T___,T___},
{BORD,X___,X___,X___,X___,BORD,T___,T___,T___,T___},
{BORD,X___,X___,X___,X___,X___,BORD,T___,T___,T___},
{BORD,X___,X___,X___,X___,X___,X___,BORD,T___,T___},
{BORD,X___,X___,X___,X___,X___,X___,X___,BORD,T___},
{BORD,X___,X___,X___,X___,X___,X___,X___,X___,BORD},
{BORD,X___,X___,X___,X___,X___,BORD,BORD,BORD,BORD},
{BORD,X___,X___,BORD,X___,X___,BORD,T___,T___,T___},
{BORD,X___,BORD,T___,BORD,X___,X___,BORD,T___,T___},
{BORD,BORD,T___,T___,BORD,X___,X___,BORD,T___,T___},
{T___,T___,T___,T___,T___,BORD,X___,X___,BORD,T___},
{T___,T___,T___,T___,T___,BORD,X___,X___,BORD,T___},
{T___,T___,T___,T___,T___,T___,BORD,BORD,T___,T___}
};
intfb_open()
{
intfd;
int*mem;
fd=open("/dev/fb0",O_RDWR);
if(fd<0)
{
printf("openfileerror!
\n");
return1;
}
structfb_var_screeninfofb_var;
ioctl(fd,FBIOGET_VSCREENINFO,&fb_var);
fb.w=fb_var.xres;
fb.h=fb_var.yres;
fb.bpp=fb_var.bits_per_pixel;
printf("w:
%dh:
%dbpp:
%d\n",fb_var.xres,fb_var.yres,fb_var.bits_per_pixel);
fb.mem=mmap(NULL,FB_H*FB_W*fb_var.bits_per_pixel/8,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
//printf("%d\n",mem);
return0;
}
voidfb_pixel(intx,inty,intcolor)
{
*(fb.mem+y*FB_W+x)=color;
}
voidfb_drawline(intx0,intx1,inty,intcolor)
{
inti;
for(i=x0;i{
fb_pixel(i,y,color);
}
}
voidfb_drawretangle(intx0,inty0,intx1,inty1,intcolor)
{
inti,j;
for(i=x0;ifor(j=y0;j{
fb_pixel(i,j,color);
}
}
voidfb_drawline2(intx,inty0,inty1,intcolor)
{
inti;
for(i=y0;ifb_pixel(x,i,color);
}
voidfb_drawcycle(intx,inty,intr,intcolor)
{
inti,j;
for(i=-r;ifor(j=-r;j{
if(i*i+j*j<=r*r)
{
fb_pixel(i+x,j+y,color);
}
}
}
intget_mouse_info(intfd,char*buf)
{
intn;
n=read(fd,buf,8);
returnn;
}
intsave_cursor(intx,inty)
{
inti,j;
for(i=0;i{
for(j=0;jcursor_store[i][j]=*(fb.mem+j+x+(i+y)*FB_W);
}
return0;
}
intrestore_cursor(intx,inty)
{
inti,j;
for(i=0;i{
for(j=0;j*(fb.mem+j+x+(i+y)*FB_W)=cursor_store[i][j];
}
return0;
}
voiddrawmouse(intx,inty)
{
inti,j;
for(i=0;i{
for(j=0;j{
if(cursor_pixel[i][j]!
=T___)
fb_pixel(x+j,y+i,cursor_pixel[i][j]);
//printf("kdjfk%d\n",cursor_pixel[i][j]);
}
}
}
intprintboard()
{
inti;
fb_drawretangle(X_OFFSET-SPACE,Y_OFFSET-SPACE,X_OFFSET+SPACE*Y_CAPASITY,Y_OFFSET+SPACE*X_CAPASITY,BLUE);
for(i=0;i{
fb_drawline(X_OFFSET,X_OFFSET+SPACE*(Y_CAPASITY-1),i*SPACE+Y_OFFSET,RED);
}
for(i=0;i{
fb_drawline2(i*SPACE+X_OFFSET,Y_OFFSET,Y_OFFSET+SPACE*(X_CAPASITY-1),RED);
}
}
voidprintqizi(introw,intcol,intcolor)
{
intx,y;
x=X_OFFSET+SPACE*col;
y=Y_OFFSET+SPACE*row;
fb_drawcycle(x,y,RADIO,color);
}
structnode_t{
intx;
inty;
intz;
};
//printthechessboard
voidprint(intboard[CHESSBOARD1][CHESSBOARD2])
{
inti,j;
printf("\n");
printf("");
for(j=0;jprintf("%d",j);
printf("\n");
printf("-");
for(j=0;jprintf("-");
printf("\n");
for(i=0;iprintf("%d|",i);
for(j=0;jprintf("%d",board[i][j]);
}
printf("\n");
}
printf("\n");
}
//鍒濆鍖栨鐩?
voidinit(intmap[CHESSBOARD1][CHESSBOARD2])
{
inti,j;
for(i=0;ifor(j=0;jmap[i][j]=0;
}
voidinit2(intmap[CHESSBOARD1][CHESSBOARD2][4])
{
inti,j,k;
for(i=0;ifor(j=0;jfor(k=0;k<4;k++)
map[i][j][k]=0;
}
voidinit3(intmap[CHESSBOARD1][CHESSBOARD2][1])
{
inti,j;
for(i=0;ifor(j=0;jmap[i][j][1]=0;
}
intdetection(intmap[CHESSBOARD1][CHESSBOARD2][4],intx,inty,intplayer)
{
inti,j,k,nx,ny,counter=0;
intdirx[4]={0,1,1,1};
intdiry[4]={1,0,1,-1};
if(board[x][y])
{
return0;
}
for(i=0;i<4;i++)
{
nx=x;
ny=y;
while(board[nx+=dirx[i]][ny+=diry[i]]==player)
counter++;
nx=x;
ny=y;
while(board[nx-=dirx[i]][ny-=diry[i]]==player)
counter++;
switch(counter)
{
case0:
map[x][y][i]=0;break;
case1:
map[x][y][i]=5;break;
case2:
map[x][y][i]=10;break;
case3:
map[x][y][i]=15;break;
case4:
map[x][y][i]=20;break;
}
//printf("%d,%d,%d",x,y,map[x][y][i]);
counter=0;
}
printf("\n");
return0;
}
intget_max(intmap[CHESSBOARD1][CHESSBOARD2][4])
{
inti,j,k;
intmax=0;
for(i=0;ifor(j=0;jfor(k=0;k<4;k++)
{
if(map[i][j][k]>max)
max=map[i][j][k];
}
returnmax;
}
structnode_tget_max2(intmap[CHESSBOARD1][CHESSBOARD2][4])
{
inti,j,k;
structnode_tp;
intmax=0,cur;
for(i=0;i{
for(j=0;j{
for(k=0;k<4;k++)
{
cur=map[i][j][k];
if(cur>max)
{
max=cur;
p.x=i;
p.y=j;
p.z=k;
}
}
}
}
returnp;
}
structnode_tget_max3(intmap[CHESSBOARD1][CHESSBOARD2][4])
{
inti,j,k;
structnode_tp;
intmax=0,cur;
for(i=0;i{
for(j=0;j{
for(k=0;k<4;k++)
{
cur=map[i][j][k];
if(cur>=max)
{
max=cur;
p.x=i;
p.y=j;
p.z=k;
}
}
}
}
returnp;
}
structnode_tget_max4(intmap[CHESSBOARD1][CHESSBOARD2][1])
{
inti,j;
structnode_tp;
intmax=0,cur;
for(i=0;i{
for(j=0;j{
cur=map[i][j][1];
if(cur>=max)
{
max=cur;
p.x=i;
p.y=j;
p.z=1;
}
}
}
returnp;
}
//鏌ョ湅鍧愭爣xy鏄惁鑳借蛋
intif_done(intx,inty)
{
if(x>=CHESSBOARD1||x<0)
return0;
if(y>=CHESSBOARD2||y<0)
return0;
return1;
}
voidcomputer()
{
inti,j,k;
init2(play1);
init2(com);
for(i=0;i{
for(j=0;j{
detection(play1,i,j,1);
detection(com,i,j,2);
}
}
}
//鏌ョ湅妫嬬洏鐨勬瀛愭儏鍐垫湁鍑犱釜杩炰竴璧?
intcheck(intx,inty,intboard[CHESSBOARD1][CHESSBOARD2])
{
inti=0,j=0,nextx,nexty;
intcounter=1;
intplayer;
intdirectionx[4]={0,1,1,1};
intdirectiony[4]={1,0,1,-1};
player=board[x][y];
if(player==0)
return0;
for(i=0;i<4;i++)
{
nextx=x;
nexty=y;
counter=1;
for(j=1;j<5;j++)
{
nextx+=directionx[i];
nexty+=directiony[i];
if(board[nextx][nexty]==player)
counter++;
}
if(counter==5)
{
return1;
}
}
return0;
}
voiddrawbg(introw,intcol)
{
intx,y;
x=X_OFFSET+SPACE*col;
y=Y_OFFSET+SPACE*row;
fb_drawcycle(x,y,RADIO,BLUE);
fb_drawline(x-RADIO,x+RADIO,y,RED);
fb_drawline2(x,y-RADIO,y+RADIO,RED);
}
intif_gameover(intboard[CHESSBOARD1][CHESSBOARD2])
{
inti,j;
for(i=0;ifor(j=0;j{
if(check(i,j,board))
return1;
}
return0;
}
voidmouse_doing()
{
intfd,step=1;
introw,col,flag1=1;
intmax1,max2;
charbuf[8];
structnode_tp;
intmx,my,a,b,c,d,e;
mx=FB_W/2-100;
my=FB_H/2;
intn;
//drawmouse(mx,my);
fd=open("/dev/input/mice",O_RDWR|O_NONBLOCK);
if(fd<0)
{
printf("openmouseerror!
\n");
}
save_cursor(mx,my);
drawmouse(mx,my);
while(flag1)
{
if(read(fd,buf,8)>0)
{
e=(buf[0]&0x07);
c=2*buf[1];
d=2*buf[2];
if(e==NOKEY)
{
restore_cursor(mx,my);
mx+=c;
my-=d;
if(mx>=FB_W-17)
mx=FB_W-17;
if(mx<0)
mx=0;
if(my>FB_H-17)
my=FB_H-17;
if(my<0)
my=0;
save_cursor(mx,my);
drawmouse(mx,my);
}
elseif(e==1)
{
if(step%2==1)
{
//printf("play1done!
\n");
col=(int)(mx-X_OFFSET+SPACE/2)/SPACE;
row=(int)(my-Y_OFFSET+SPACE/2)/SPACE;
if(!
(if_done(row,col))||board[row][col])
{
//printf("youcan'tdonehere!
\n");
col=(int)(mx-X_OFFSET)/SPACE;
row=(int)(my-Y_OFFSET)/SPACE;
continue;
}
board[row][col]=1;
restore_cursor(mx,my);
printqizi(row,col,BLACK);//鐢婚粦鑹茬殑妫嬪瓙
save_cursor(mx,my);
array[row][col][1]=step;
step++;
computer();//鏇存柊浼樺厛绾ц〃
//printf("flag2%d\n",flag2);
//flag2=1;
}
else{
//printf("play2done!
\n");
max1=get_max(play1);
max2=get_max(com);
if(max1>=max2)
{
p=get_max2(play1);
}
else{
p=get_max2(com);
}
row=p.x;
col=p.y;
if(!
(if_done(row,col))||board[row][col])
{
//printf("youcan'tdonehere!
\n");
max1=get_max(play1);
max2=get_max(com);
if(max1>=max2)
{
p=get_max3(play1);
}
else{
p=get_max3(com);
}
row=p.x;
col=p.y;
continue;
}
board[row][col]=2;
computer(boar