Discuz! Board

 找回密码
 立即注册
查看: 616|回复: 0

五子棋

[复制链接]

20

主题

33

帖子

3458

积分

论坛元老

Rank: 8Rank: 8

积分
3458

小火马 Lv:11
发表于 2023-10-21 11:40:17 | 显示全部楼层 |阅读模式
#include <graphics.h>
#include<cstdio>

#define Row 15
#define Col 15
int board[Row][Col];                //棋盘
int player=2;                                //当前玩家
PIMAGE pimgs[3];                        //棋盘图片
mouse_msg msg;                                //鼠标


void loadImage()//图片载入
{
        char path[100];                        //加载图片路径
        for(int i=0;i<3;i++)
        {
                pimgs[i]=newimage();        //向计算机申请一个图片空间
                sprintf(path,"image/%d.jpg",i);//拼接图片相对路径
                getimage(pimgs[i],path);//将系统中的图片数据存入pimgs
        }
}

void draw()//图形绘制
{
        for(int i=0;i<Row;i++)
        for(int j=0;j<Col;j++)
                putimage(i*25,j*25,pimgs[board[i][j]]);
}

bool IsFull()
{
        for (int i = 0; i < Row; i++)
        for (int j = 0; j < Col; j++)
        {
                if (board[i][j] == 0)
                {
                        return false;
                }
        }
        //棋盘没有空位置了还没有判断出输赢,则平局
        return true;
}

int gameover()
{
        int i = 0;
        int j = 0;

        // 横线上五子连成一线,赢家产生
        for (i = 0; i < Row; i++)
        for (j = 0; j < Col - 4; j++)
        {
                if (board[i][j] == board[i][j + 1]&& board[i][j + 1] == board[i][j + 2]&&
                        board[i][j + 2] == board[i][j + 3]&& board[i][j + 3] == board[i][j + 4]&&
                        board[i][j] != 0)       
                        return board[i][j];
        }

        // 竖线上五子连成一线,赢家产生
        for (j = 0; j < Row; j++)
        for (i = 0; i < Col - 4; i++)
        {
                if (board[i][j] == board[i+1][j]&& board[i+1][j] == board[i+2][j]&&
                        board[i+2][j] == board[i+3][j]&& board[i+3][j] == board[i+4][j]&&         
                        board[i][j] != 0)
                        return board[i][j];
        }

        // 斜线上五子连成一线,赢家产生
        for(i = 0; i < Row - 4; i++)
        for(j = 0; j < Col - 4; j++)
        {
                if (board[i][j] == board[i+1][j+1]&& board[i+1][j+1] == board[i+2][j+2]&&
                        board[i + 2][j + 2] == board[i + 3][j + 3]&& board[i + 3][j + 3] == board[i + 4][j + 4]
                        && board[i][j] != 0)
                        return board[i][j];

                if (board[i][j+4] == board[i+1][j+3]&& board[i+1][j+3] == board[i+2][j+2]
                        && board[i + 2][j + 2] == board[i + 3][j + 1]&& board[i + 3][j + 1] == board[i + 4][j]
                        && board[i][j + 4] != 0)
                        return board[i][j+4];
        }

        //游戏平局
        if (IsFull())        return 3;

        //游戏结束
        return 0;
}

void start()//初始化
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
//        setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
       
        initgraph(Row*25,Col*25);//图形初始化        
        setcaption("五子棋");        //设置程序标题
        setbkcolor(WHITE);
        loadImage();//图片载入
       
        setcolor(BLACK);
        setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
        setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}

int main()
{
        start();
        while(1)
        {
                while(mousemsg())
                {
                        msg=getmouse();
                        int x=msg.x/25,y=msg.y/25;
                        if(msg.is_down())
                        {
                                if(board[x][y]==0)                //判断当前格子是否可以落子
                                {
                                        board[x][y]=player;        //改变当前棋盘格子状态
                                        if(player==1) player=2;        //换手
                                        else player=1;
                                }
                        }
                       
                }
                draw();                                        //更新棋盘
                if(gameover()==1)        {xyprintf(150,150,"白方获胜"); break;}
                else if(gameover()==2)        {xyprintf(150,150,"黑方获胜"); break;}
                else if(gameover()==3)        {xyprintf(150,150,"平局"); break;}
                else  ;

                delay_fps(60);
        }
        getch();
        return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-2-13 02:06 , Processed in 0.050276 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表