| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 979 人关注过本帖, 1 人收藏
标题:第四个游戏五子棋
只看楼主 加入收藏
Fisher~
Rank: 4
等 级:业余侠客
帖 子:93
专家分:222
注 册:2012-11-10
结帖率:100%
收藏(1)
 问题点数:0 回复次数:7 
第四个游戏五子棋
下午写了一点,花费了很多时间找素材,晚上写到现在一点四十终于搞定了,
实现功能:能两个人玩,可以判断输赢,游戏结束可以选择重新开始,
            实现计时功能,这个游戏感觉还可以,大家可以看看
连接地址:http://pan.baidu.com/share/link?shareid=4075276179&uk=2988506976
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
这是效果
程序代码:
/*************************************
** 程序名称:五子棋                    **
** 编译环境:vs2012                    **
** 编辑作者:往事随风<1034882113>    **
** 最后修改:2013-07-25                **
** 项目类型:win32控制台程序        **
**************************************/

#include<graphics.h>
#include<conio.h>        // _kbhit() _getch()

/****************** 宏定义区   **********************/
#define    BOARD_LEN    640            // 棋盘大小
#define BOARD_WIDTH    640           
#define EXTRA_LEN    200            // 右边提示区域的长度
#define    SIZE        40            // 棋盘小方格大小
#define ROW            14            // 棋盘为14*14

/****************** 数据类型定义区 ******************/

/****************** 全局变量区 **********************/
IMAGE img_chessboard;            // 背景
IMAGE img_box_black;            // 黑色棋盒
IMAGE img_box_white;            // 白色棋盒
IMAGE img_bkbox;                // 右边区域背景
IMAGE img_time;                    // 显示时间
IMAGE img_count[11];            // 十个数字和一个冒号
int m_x = (BOARD_LEN - SIZE * ROW)/2;        // 居中
int    m_y = (BOARD_WIDTH - SIZE * ROW)/2;
byte gobang[ROW+1][ROW+1] = {0};// byte不能表示负数 0:无子 1:黑子 2:白子
byte type = 0;                    // 1: 白棋 0:黑棋
bool replay = true;                // false 游戏结束,true代表游戏运行中
DWORD b_oldtime;                // 黑棋花费时间
DWORD w_oldtime;                // 白棋花费时间
DWORD start_time;                // 游戏起始时间

/****************** 函数声明区 **********************/
void init_system();
void init_img();
void init_chessboard();
void getMouse(POINT *point);
void deal_mousemsg(POINT point);
void game_win(int x,int y);
void quit_game();
void print_msg();
void show_time(DWORD newtime);
void print_time(DWORD time);

/****************** 主函数区   **********************/
void main()
{
    POINT point;            // 存储坐标位置

    while (true)
    {
        init_system();
   
        while (replay)
        {
            getMouse(&point);
            deal_mousemsg(point);
        }       
    }
}

/****************** 函数定义区 **********************/

void print_time(DWORD time)
{   
    int y = 0;
    int minuteh = time / (600*1000);                // 分钟十位
    time %= (600*1000);           
    int minutel = time / (60*1000);                // 分钟个位
    time %= (60*1000);
    int secondh = time / (10*1000);                // 秒钟十位
    int secondl = time % (10*1000);                // 秒钟个位
   
    int x = BOARD_LEN + 5 - m_x;
    if (type)                                // 白棋
        y = EXTRA_LEN + 5 - m_y;
    else y = BOARD_WIDTH/2+EXTRA_LEN+5 - m_y;        // 黑棋

    putimage(x+80,y+45,&img_count[minuteh]);        // 分钟十位
    putimage(x+95,y+45,&img_count[minutel]);        // 分钟个位
    putimage(x+125,y+45,&img_count[secondh]);        // 秒十位
    putimage(x+140,y+45,&img_count[secondl/1000]);        // 秒个位
}

/* 显示倒计时 */
void show_time(DWORD newtime)
{
    DWORD tmp = b_oldtime+w_oldtime + start_time;    // 游戏运行的时间

    if (type)        // 白棋
    {
        w_oldtime += newtime - tmp;        // 计算白棋用的时间
        print_time(w_oldtime);
    }
    else            // 黑棋
    {
        b_oldtime += newtime - tmp;        // 计算黑棋用的时间
        print_time(b_oldtime);
    }
}

/* 打印右边游戏信息 */
void print_msg()
{
    outtextxy(20,50,_T("倒计时:"));
    putimage(80,45,&img_count[0]);
    putimage(95,45,&img_count[0]);   
    putimage(110,45,&img_count[10]);
    putimage(125,45,&img_count[0]);
    putimage(140,45,&img_count[0]);
    outtextxy(20,80,_T("比    分:"));
    outtextxy(80,80,_T("0"));
}

/* 结束游戏 */
void quit_game()
{
    closegraph();
    exit(0);
}

/* 判断胜利 */
void game_win(int x,int y)
{
    int i = -5,j = -5;
    int count = 0;
    byte flag = gobang[x][y];            // 判断棋色

    while (count != 5 && ++i < 5)        //
    {
        if (gobang[x+i][y] == flag)
            count++;
        else count = 0;
    }
    while (count != 5 && ++j < 5)        //
    {
        if (gobang[x][y+j] == flag)
            count++;
        else count = 0;
    }
    i = j = -5;
    while (count != 5 && ++i < 5 && ++j < 5)    // 左斜
    {
        if (gobang[x+i][y+j] == flag)
            count++;
        else count = 0;
    }
    i = 5;j = -5;
    while (count != 5 && --i > -5 && ++j < 5)    // 右斜
    {
        if (gobang[x+i][y+j] == flag)
            count++;
        else count = 0;
    }
    if (count == 5)
    {
        setbkmode(TRANSPARENT);                    // 设置文字背景透明
        settextstyle(48, 0, _T("宋体"));
        settextcolor(RED);
        if (flag == 1)
            outtextxy(BOARD_LEN/3,BOARD_WIDTH/3,_T("BLACK WIN"));
        else outtextxy(BOARD_LEN/3,BOARD_WIDTH/3,_T("WHITE WIN"));

        HWND wnd = GetHWnd();
        if (MessageBox(wnd, _T("要再来一局吗?"), _T("提醒"),
                MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
        {
            replay = false;
            Sleep(200);
        }
        else quit_game();
    }
}

/* 画棋子 */
void deal_mousemsg(POINT point)
{   
    int r = SIZE/2;        // 取点范围
    int x0 = (point.x - m_x) / SIZE + (point.x - m_x)%SIZE/r;
    int y0 = (point.y - m_y) / SIZE + (point.y - m_y)%SIZE/r;

    if (type)                        // 判断棋手 1:白棋 0:黑棋
        setfillcolor(WHITE);
    else setfillcolor(BLACK);

    if (x0 >= 0 && x0 <= ROW &&            // 判断边界
        y0 >= 0 && y0 <= ROW &&
        gobang[x0][y0] == 0)            // 无子状态才下子
    {
        fillcircle(x0*SIZE,y0*SIZE,SIZE/3);
        gobang[x0][y0] = 1 + (1&&type);        // 置为有子状态(必须位于判断输赢前)
        game_win(x0,y0);
        type = 1 ^ type;                    // 换手
    }
}

/*  */
void getMouse(POINT *point)
{
    HWND hwnd = GetHWnd();        // 获取绘图窗口句柄
    MOUSEMSG msg;

    FlushMouseMsgBuffer();
    while (true)                                    // 等待鼠标点击
    {
        DWORD newtime = GetTickCount();                // 获取系统时间
        if (newtime - w_oldtime - b_oldtime > 1000)
            show_time(newtime);                            // 显示时间

        if (MouseHit())
        {
            msg = GetMouseMsg();
            if (msg.uMsg ==WM_LBUTTONDOWN)
            {
                GetCursorPos(point);                    // 获取鼠标指针位置(屏幕坐标)
                ScreenToClient(hwnd,point);                // 将鼠标指针位置转换为窗口坐标
                break;
            }
        }
    }
}

/* 初始化棋盘 */
void init_chessboard()
{
    int i = 0, j = 0;

    init_img();                                // 初始化图片资源
    putimage(0,0,&img_chessboard);            // 输出棋盘
    putimage(BOARD_LEN,0,&img_bkbox);        // 输出右边背景
    putimage(BOARD_LEN,0,&img_box_white);                    // 输出白色棋盒
    putimage(BOARD_LEN,BOARD_WIDTH/2,&img_box_black);        // 输出黑色棋盒

    setcolor(BLACK);
    rectangle(BOARD_LEN+5,EXTRA_LEN+5,BOARD_LEN+EXTRA_LEN-5,BOARD_WIDTH/2-5);
    rectangle(BOARD_LEN+5,BOARD_WIDTH/2+EXTRA_LEN+5,BOARD_LEN+EXTRA_LEN-5,BOARD_WIDTH-5);
   
    setbkmode(TRANSPARENT);   
    setorigin(BOARD_LEN+5,EXTRA_LEN+5);        // 上面的矩形 白子
    outtextxy(20,20,_T("undefined"));
    print_msg();
       
    setorigin(BOARD_LEN+5,BOARD_WIDTH/2+EXTRA_LEN+5);        // 下面的矩形 黑子
    outtextxy(20,20,_T("电  脑"));
    print_msg();

    setcolor(BLACK);
    setorigin(m_x,m_y);                        // 设置原点
    for (i = 0; i <= ROW; i++)
    {
        line(0,0+i*SIZE,0+SIZE*ROW,0+i*SIZE);        // 横线
        line(0+i*SIZE,0,0+i*SIZE,0+SIZE*ROW);        // 竖线
    }
}

void init_img()
{
    int i = 0;

    loadimage(&img_chessboard,_T("./res/chess_board.jpg"),BOARD_LEN,BOARD_WIDTH,true);
    loadimage(&img_box_white,_T("./res/box_white1.bmp"),EXTRA_LEN,EXTRA_LEN,true);
    loadimage(&img_box_black,_T("./res/box_black1.bmp"),EXTRA_LEN,EXTRA_LEN,true);
    loadimage(&img_bkbox,_T("./res/bkbox.bmp"),EXTRA_LEN,BOARD_WIDTH,true);
    loadimage(&img_time,_T("./res/time.bmp"),15,250,true);

    SetWorkingImage(&img_time);
    for (i = 0; i < 10; i++)                // 初始化十个数字
        getimage(&img_count[i],0,i*25,15,25);
    loadimage(&img_count[10],_T("./res/dot.bmp"),15,25,true);
    SetWorkingImage(NULL);
}

void init_system()
{
    int i = 0, j = 0;

    initgraph(BOARD_LEN+EXTRA_LEN+10,BOARD_WIDTH+10);

    init_chessboard();
    replay = true;
    ZeroMemory(gobang,(ROW+1)*(ROW+1));        // 初始化数组为0
    b_oldtime = 0;
    w_oldtime = 0;
    start_time = GetTickCount();
}
请多给意见
搜索更多相关主题的帖子: 五子棋 游戏 
2013-07-26 01:41
thematrix123
Rank: 2
等 级:论坛游民
帖 子:8
专家分:52
注 册:2013-7-10
收藏
得分:0 
界面实现得不错,不过只能两个人下未免有些单调,可以考虑加个AI
2013-07-26 04:43
Fisher~
Rank: 4
等 级:业余侠客
帖 子:93
专家分:222
注 册:2012-11-10
收藏
得分:0 
回复 2楼 thematrix123
才开始写不会啊,正在想呢
2013-07-26 08:09
幻影之锁
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-7-24
收藏
得分:0 
回复 3楼 Fisher~
我也想学。可否教教
2013-07-26 11:19
Fisher~
Rank: 4
等 级:业余侠客
帖 子:93
专家分:222
注 册:2012-11-10
收藏
得分:0 
回复 4楼 幻影之锁
给你推荐个网站,里面都是各种初学者写的小游戏,还有教程,你可以先看看http://www.    还有你可以搜索eaxyx贴吧里面也有很多      
2013-07-26 16:10
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
往事随风?

重剑无锋,大巧不工
2013-07-26 17:58
西边
Rank: 1
等 级:新手上路
帖 子:27
专家分:2
注 册:2013-7-25
收藏
得分:0 
吊炸天
2013-07-26 22:23
Fisher~
Rank: 4
等 级:业余侠客
帖 子:93
专家分:222
注 册:2012-11-10
收藏
得分:0 
回复 6楼 beyondyf
怎么了?我qq名
2013-07-29 12:38
快速回复:第四个游戏五子棋
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049652 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved