`
java-mans
  • 浏览: 11431553 次
文章分类
社区版块
存档分类
最新评论

五子棋游戏

 
阅读更多

一:功能模块设计

1.初始化模块。本模块主要是用于初始化屏幕信息,包括显示欢迎信息、操作方法和初始化棋盘。

2.功能控制模块。本模块是各个功能函数的集合,主要是被其它模块调用,包括画棋子、胜负判断和行棋转换等功能。

3.下棋操作模块。人机交互。

4.帮助模块。教用户如何操作,提示办到哪方下棋。

二:数据结构设计

1.定义数组:

status[19][19],存棋盘坐标的状态,每个坐对应着一个状态,可以是012。‘0’表示当前位置无棋子,‘1’表示Player1在这里放了一个棋子,‘2’表示Player2在这里放了棋子。

2.全局变量:

1.step_xstep_y是两个整型变量,分别表示x,y的坐标。

2.Key也是整型变量,存储bioskey()函数返回的键值。UPDOWN,LEFT,RIGHT的值都是由bioskey()返回,无需死记硬背。

3.Flag表示是哪个玩家,1表示Player1,2表示player2;

4.Offset_x,offset_y,offset分别表示xy坐标的偏移量和放大倍数。

三:函数功能描述

1.drawboard()函数用于画棋盘,棋盘由18条横线和18条竖线交叉组成,函数主要由画线函数voidline(intx0,inty0,intx1,inty1)实现的。

2.drawCircle()画棋子,函数主要由画圆函数voidcircle(intx,inty,intr)实现的。

3.Alternation()用于交换下顺序,实现轮流下棋的功能,用全局变量flag标识。

4.judgePlayer()根据不用的棋方画不同颜色的棋子,也是根据全局变量flag进行判断的。

5.Down()完成下棋的操作过程,根据bioskey()返回的键值判断该如何操作,详见代码;

6.resultCheck(intx,inty)判断当前下棋的人否获胜,其中x,y表示下棋都最后落子坐标,判断横纵斜方向是否有五个相同棋子(颜色相同)。

7.welcomeInfo()用于输出欢迎信息,和提示性信息,如按键操作等。

8.showMassage()显示当前轮到哪一方下棋。


编译环境:Win-Tc


注意:请在Win-Tc安装目录下编译,否则可能初始化图形界面失败

本人C文件路径作参考:C:\Win-Tc\projects\noname.c


代码:

#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<bios.h>
#include<conio.h>

#define left 0x4b00
#define right 0x4d00
#define down 0x5000
#define up 0x4800


#define esc 0x11b
#define space 0x3920

#define offset 20
#define offset_x 4
#define offset_y 3

#define n 19

int status[n][n];
int step_x,step_y;
int key;
int flag;

void drawBoard();
void drawCircle(int x,int y,int color);
void alternation();
void judgePlayer(int x,int y);
void done();
int resultCheck(int x,int y);
void welcomeInfo();
void showMassage();


int main()
{
    int gdriver;
    int gmode;
    int errorcode;
    clrscr();
    welcomeInfo();
    gdriver=DETECT;
    gmode=0;
    initgraph(&gdriver,&gmode,"C:\\Win-TC");
    errorcode=graphresult();
    if(errorcode!=grOk)
    {
        printf("\nNotice:Error occured when graphics initializetion:%s",grapherrormsg(errorcode));
        printf("Press any key to quit!\n");
        getch();
        exit(1);
    }
    flag=1;
    drawBoard();
    showMassage();
    do
    {
        step_x=0;
        step_y=0;
        judgePlayer(step_x-1,step_y-1);
        do
        {
            while(bioskey(1)==0);
            key=bioskey(0);
            done();
        }
        while(key!=space&&key!=esc);
    }
    while(key!=esc);
    closegraph();
    return 0;
}
void welcomeInfo()
{
    char ch;
    gotoxy(12,4);
    printf("Welcome you to gobang world!");
    gotoxy(12,6);
    printf("1.You can use the up,down,left and right key to move the chessman,");
    gotoxy(12,8);
    printf(" and you can press Space key to enter after you move it !");
    gotoxy(12,10);
    printf("2.You can use Esc key to exit the game to!");
    gotoxy(12,12);
    printf("3.Do not move the pieces out of the chessboard!");
    gotoxy(12,14);
    printf("Do you want to continue?(Y/N)");
    ch=getchar();
    if(ch=='n'||ch=='N')exit (0);
}
void drawBoard()
{
    int x1,x2,y1,y2;
    setbkcolor(2);
    setcolor(1) ;
    setlinestyle(DOTTED_LINE,1,1);
    for(x1=1,y1=1,y2=18;x1<=18;x1++)
        line((x1+offset_x)*offset,(y1+offset_y)*offset,(x1+offset_x)*offset,(y2+offset_y)*offset);
    for(x1=1,y1=1,x2=18;y1<=18;y1++)
        line((x1+offset_x)*offset,(y1+offset_y)*offset,(x2+offset_x)*offset,(y1+offset_y)*offset);
    for(x1=1;x1<=18;x1++)
        for(y1=1;y1<=18;y1++)
            status[x1][y1]=0;
    setcolor(14);
    settextstyle(1,0,1);
    outtextxy((19+offset_x)*offset,(2+offset_y)*offset,"Player key:");
    setcolor(9);
    settextstyle(3,0,1);
    outtextxy((19+offset_x)*offset,(4+offset_y)*offset,"UP--up");
    outtextxy((19+offset_x)*offset,(6+offset_y)*offset,"DOWN--down");
    outtextxy((19+offset_x)*offset,(8+offset_y)*offset,"LEFT--left");
    outtextxy((19+offset_x)*offset,(10+offset_y)*offset,"RIGHT--right");
    outtextxy((19+offset_x)*offset,(12+offset_y)*offset,"ENTER--space");
    setcolor(14);
    settextstyle(1,0,1);
    outtextxy((19+offset_x)*offset,(14+offset_y)*offset,"Exit:");
    setcolor(9);
    settextstyle(3,0,1);
    outtextxy((19+offset_x)*offset,(16+offset_y)*offset,"Esc");
}
void drawCircle(int x,int y,int color)
{
    setcolor(color);
    setlinestyle(SOLID_LINE,0,1);
    x=(offset_x+x)*offset;
    y=(y+offset_y)*offset;
    circle(x,y,6);
}

void alternation()
{
    flag=flag==1?2:1;
}

void judgePlayer(int x,int y)
{
    if(flag==1)
        drawCircle(x,y,15);
    if(flag==2)
        drawCircle(x,y,4);
}

int resultCheck(int x,int y)
{
    int j,k;
    int n1,n2;
    while(1)
    {
        n1=n2=0;
        for(j=x,k=y;j>=1;j--)
        {
            if(status[j][k]==flag)
                n1++;
            else break;
        }
        for(j=x,k=y;j<=18;j++)
        {
            if(status[j][k]==flag)
                n2++;
            else break;
        }
        if(n1+n2-1>=5)return 1;

        n1=n2=0;
        for(j=x,k=y;k>=1;k--)
        {
            if(status[j][k]==flag)
                n1++;
            else break;
        }
        for(j=x,k=y;k<=18;k++)
        {
            if(status[j][k]==flag)
                n2++;
            else break;
        }
        if(n1+n2-1>=5)return 1;

        n1=n2=0;
        for(j=x,k=y;j>=1&&k>=1;j--,k--)
        {
            if(status[j][k]==flag)
                n1++;
            else break;
        }
        for(j=x,k=y;j<=18&&k<=18;k++,j++)
        {
            if(status[j][k]==flag)
                n2++;
            else break;
        }
        if(n1+n2-1>=5)return 1;

        n1=n2=0;
        for(j=x,k=y;j<=18&&k>=1;j++,k--)
        {
            if(status[j][k]==flag)
                n1++;
            else break;
        }
        for(j=x,k=y;j>=1&&k<=18;j--,k++)
        {
            if(status[j][k]==flag)
                n2++;
            else break;
        }
        if(n1+n2>=5)return 1;
        return 0;
    }
}

void done()
{
    int i,j;
    switch(key)
    {
        case left:
            if(step_x-1<0)
                break;
            else 
            {
                for(i=step_x-1,j=step_y;i>=1;i--)
                    if(status[i][j]==0)
                	{
                        drawCircle(step_x,step_y,2);
                        break;
                	}
                if(i<1)break;
                step_x=i;
                judgePlayer(step_x,step_y);
                break;
            }
        case right:
            if(step_x+1>18)
                break;
            else 
            {
                for(i=step_x+1,j=step_y;i<=18;i++)
                    if(status[i][j]==0)
                	{
                        drawCircle(step_x,step_y,2);
                        break;
                	}
                if(i>18)break;
                step_x=i;
                judgePlayer(step_x,step_y);
                break;
            }
        case down:
            if(step_y+1>18)
                break;
            else 
            {
                for(i=step_x,j=step_y+1;j<=18;j++)
                    if(status[i][j]==0)
                	{
                        drawCircle(step_x,step_y,2);
                        break;
                	}
                if(j>18)break;
                step_y=j;
                judgePlayer(step_x,step_y);
                break;
            }
        case up:
            if(step_y-1<0)
                break;
            else 
            {
                for(i=step_x,j=step_y-1;j>=1;j--)
                    if(status[i][j]==0)
                	{
                        drawCircle(step_x,step_y,2);
                        break;
                	}
                if(j<1)break;
                step_y=j;
                judgePlayer(step_x,step_y);
                break;
            }
        case esc:break;
        case space:
             if(status[step_x][step_y]==0)
             {
                status[step_x][step_y]=flag;
                if(resultCheck(step_x,step_y)==1)
                {
                    sound(1000);
                    delay(1000);
                    nosound();
                    gotoxy(30,4);
                    setbkcolor(BLUE);
                    cleardevice();
                    setviewport(100,100,540,380,1);
                    setfillstyle(1,2);
                    setcolor(YELLOW);
                    rectangle(0,0,439,279);
                    floodfill(50,50,14);
                    setcolor(12);
                    settextstyle(1,0,5);

                    outtextxy(20,20,"CONGRATULATION!");
                    setcolor(15);
                    settextstyle(3,0,4);

                    if(flag==1)
                	{
                        outtextxy(20,120,"Player 1 win the game!!");
                	}
                    if(flag==2)
                	{
                        outtextxy(20,120,"Player 2 win the game!!");
                	}
                    setcolor(14);
                    settextstyle(2,0,8);
                    getch();
                    exit(0);
                }
                alternation();
                showMassage();
                break;
             }
             else break;
    }
}
void showMassage()
{
    if(flag==1)
    {
        setcolor(2);
        settextstyle(1,0,1);
        gotoxy(100,30);
        outtextxy(100,30,"It's turn to Player2 !");
        setcolor(12);
        settextstyle(1,0,1);
        outtextxy(100,30,"It's turn to Player1 !");
    }
    if(flag==2)
    {
        setcolor(2);
        settextstyle(1,0,1);
        outtextxy(100,30,"It's turn to Player1 !");
        setcolor(12);
        settextstyle(1,0,1);
        outtextxy(100,30,"It's turn to Player2 !");
    }
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics