C语言——LCD触摸屏井字棋

使用C语言编写LCD触摸屏井字棋

效果如图
在这里插入图片描述
在这里插入图片描述

全局变量

int player_counter = 1;//*用于记录落子个数
int data[3][3]={{2,2,2},{2,2,2},{2,2,2}};//*棋盘

井字棋主函数

该函数在工程中为LCD触摸屏触摸的回调函数
LCD像素为240*240

//e->pos.x和 e->pos.y为触摸屏坐标 
int ontouch(int e->pos.x,int e->pos.y)//需要传入触摸坐标
{
    extern void game_char(int flag);

    int over_flag = 2;//*游戏结束标志位,0和1代表不同玩家获胜,2游戏继续进行
    int player;
    player_counter++;//*落子计数器
    player = player_counter % 2;//*玩家判断

    if(player_counter == 11)//*重启判定
    {
        game_reset();
        ui_show_main(PAGE_41);//*重载游戏页面
        return 0;
    }
    //*******************第一行落子判断*********************************
    if(e->pos.y > 0 && e->pos.y < 80 )
    {
        if(e->pos.x > 160 && e->pos.x < 240 && data[0][2] == 2)//*第1行第3个
        {
            data[0][2] = player;
            player_draw(player, 200, 40);
            over_flag = game_referee(player,0,2);
        }
        else if(e->pos.x > 80 && e->pos.x < 160 && data[0][1] == 2)//*第1行第2个
        {
            data[0][1] = player;
            player_draw(player, 120, 40);
            over_flag = game_referee(player,0,1);
        }
        else if(e->pos.x > 0 && e->pos.x < 80 && data[0][0] == 2)//*第1行第1个
        {
            data[0][0] = player;
            player_draw(player, 40, 40);
            over_flag = game_referee(player,0,0);
        }
        else
        {
            player_counter--;
        }
    }
    //*****************************第二行落子判断**************************************
    else if(e->pos.y > 80 && e->pos.y < 160 )
    {
        if(e->pos.x > 160 && e->pos.x < 240 && data[1][2] == 2)//*第2行第3个
        {
            data[1][2] = player;
            player_draw(player, 200, 120);
            over_flag = game_referee(player,1,2);
        }
        else if(e->pos.x > 80 && e->pos.x < 160 && data[1][1] == 2)//*第2行第2个
        {
            data[1][1] = player;
            player_draw(player, 120, 120);
            over_flag = game_referee(player,1,1);
        }
        else if(e->pos.x > 0 && e->pos.x < 80 && data[1][0] == 2)//*第2行第1个
        {
            data[1][0] = player;
            player_draw(player, 40, 120);
            over_flag = game_referee(player,1,0);
        }
        else
        {
            player_counter--;
        }
    }
    //****************************第三行落子判断**************************************
    else if(e->pos.y > 160 && e->pos.y < 240)//*
    {
        if(e->pos.x > 160 && e->pos.x < 240 && data[2][2] == 2)//*第3行第3个
        {
            data[2][2] = player;
            player_draw(player, 200, 200);
            over_flag = game_referee(player,2,2);
        }
        else if(e->pos.x > 80 && e->pos.x < 160 && data[2][1] == 2)//*第3行第2个
        {
            data[2][1] = player;
            player_draw(player, 120, 200);
            over_flag = game_referee(player,2,1);
        }
        else if(e->pos.x > 0 && e->pos.x < 80 && data[2][0] == 2)//*第3行第1个
        {
            data[2][0] = player;
            player_draw(player, 40, 200);
            over_flag = game_referee(player,2,0);
        }
        else
        {
            player_counter--;
        }
    }

    //**********************************************************
    if(over_flag == 0)//*玩家x获胜
    {
        game_char(2);//*输出字符
        player_counter = 10;

    }
    else if(over_flag == 1)//*玩家o获胜
    {
        game_char(1);//*输出字符
        player_counter = 10;

    }
    else if(player_counter == 10)//*平局
    {
        game_char(0);//*输出字符
        //player_counter += 1;
    }
}

游戏复位

用于玩家获胜或平局时重置棋盘

void game_reset(void)//*游戏复位
{
    int i,j;
    player_counter = 1;
    for(i=0;i<3;i++)
        {
        for(j=0;j<3;j++)
        {
            data[i][j] = 2;
        }
    }
}

玩家落子

在LCD屏幕上绘制棋子

void player_draw(int player, int x, int y)//*玩家落子
{
    extern int lcd_draw_fork(int x,int y,int r,u16 color);
    extern int lcd_draw_circular(int x,int y,int r,u16 color);
    if(player == 1)
    {
        lcd_draw_fork(x,y,25,0x9999);//*触摸点画叉
    }
    else if(player == 0)
    {
       lcd_draw_circular(x,y,25,0x6666);//*触摸点画圆
    }
}

胜负判断

根据落子坐标判断胜负,返回0和1代表不同玩家获胜,2无人获胜

int game_referee(int player,int x,int y)
{
    int xay = x+y;
    if(data[x][0]==player && data[x][1]==player && data[x][2]==player)//*所在行检测
    {
        return player;
    }
    else if(data[0][y]==player && data[1][y]==player && data[2][y]==player)//*所在列检测
    {
        return player;
    }
    else if(xay!=3 || xay!=5)//*斜检测
    {
        if(data[0][0]==player && data[1][1]==player && data[2][2]==player)
            {
                return player;
            }
        else if(data[0][2]==player && data[1][1]==player && data[2][0]==player)
            {
                return player;
            }
    }
    return 2;

}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值