网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
02月03日漏签0天
c语言吧 关注:801,843贴子:4,375,728
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 10回复贴,共1页
<<返回c语言吧
>0< 加载中...

C语言 _ XOXO 井字游戏 Tic-Tac-Toe [开源]

  • 只看楼主
  • 收藏

  • 回复
  • AutoRunAs
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用C语言写个小游戏练练,一下写不完,先画个游戏界面!
游戏名称: XOXO 井字游戏
系统平台: Linux 桌面发行版 Ubuntu
编程语言: C语言
相关库: Cairo , GTK+-3.0
源码许可证: GPL第一版


  • bc12358
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
请将许可信息放在源码最前面


2026-02-03 07:38:45
广告
不感兴趣
开通SVIP免广告
  • AutoRunAs
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/*游戏名称 : XOXO 井字游戏
*系统平台 : Linux 桌面发行版 Ubuntu
*编程语言 : C语言
*相关库 : Cairo , GTK+-3.0
*源码许可证: GPL第一版
*程序作者 : AutoRunAs
*/
源码下载
http://pan.baidu.com/s/1kTAcaLx
C语言 > zzgtkcairo > gtkcairo004.7z


  • AutoRunAs
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/*游戏名称 : XOXO 井字游戏
*系统平台 : Linux 桌面发行版 Ubuntu
*编程语言 : C语言
*相关库 : Cairo , GTK+-3.0
*源码许可证: GPL第一版
*程序作者 : AutoRunAs
*/
/* 本程序尚未完成 */
/* 程序太长,只贴了一部分,想看的去网盘下吧! */
/* gtkcairo004.c XOXO 井字游戏 Tic-Tac-Toe */
#include <gtk/gtk.h>
#include <stdlib.h>
typedef struct df_point
{
double x;
double y;
}point;
struct df_game_data
{
point grid[16]; /* 四条直线组成十六个点 */
point center[9]; /* 九个方格中心坐标 */
int data[9]; /* 每个方格数据 0代表空, 1代表X, 5代表O */
int status; /* 游戏运行状态 0游戏初始化 1玩家X 5玩家O*/
double width; /* 游戏界面宽 */
double height; /* 游戏界面高 */
double radius; /* 网格半径 */
};
static struct df_game_data *xoxo = NULL; /* 全局游戏数据指针 */
static cairo_surface_t *surface = NULL; /* 全局画布指针 */
/* df_init_gamedata 初始化游戏数据 xoxo -> data */
static void df_init_gamedata (void)
{
int i;
for (i = 0; i < 9; i++)
xoxo -> data[i] = 0;
}
/* df_init_gui_data 初始化界面数据 * width, height 游戏界面宽与高 */
static void df_init_gui_data (double width, double height)
{
int i, j;
xoxo -> width = width;
xoxo -> height = height;
xoxo -> radius = (xoxo -> width < xoxo -> height) ? xoxo -> width / 6 : xoxo -> height / 6;
/* 设置界面十六个点坐标 */
for (i = 0; i < 16; i += 4)
{
for (j = 0; j < 4; j++)
{
xoxo -> grid[i + j].x = j * xoxo -> width / 3;
xoxo -> grid[i + j].y = i / 4 * xoxo -> height / 3;
}
}
/* 设置界面九个中心点坐标 */
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
xoxo -> center[i + j * 3].x = (2 * i + 1) * xoxo -> width / 6;
xoxo -> center[i + j * 3].y = (2 * j + 1) * xoxo -> height / 6;
}
}
/* 终端命令行打印十六个点坐标 */
g_print (" %f , %f , %f \n ", xoxo -> width, xoxo -> height, xoxo -> radius);
for (i = 0; i < 16; i++)
{
g_print ("网格坐标%2d : %12f %12f \n", i, xoxo -> grid[i].x, xoxo -> grid[i].y);
}
/* 终端命令行打印九个中心点坐标 */
for (i = 0; i < 9; i++)
{
g_print ("方格中心坐标%2d : %12f %12f \n", i, xoxo -> center[i].x, xoxo -> center[i].y);
}
}
/* df_show_game_gui 显示由四条直线构成的界面 */
static void df_show_game_gui (void)
{
cairo_t * cr;
cr = cairo_create (surface);
cairo_set_line_width (cr, 10.0);
cairo_set_source_rgba (cr, 0.2, 0.1, 0.5, 0.8);
cairo_move_to (cr, xoxo -> grid[1].x, xoxo -> grid[1].y);
cairo_line_to (cr, xoxo -> grid[13].x, xoxo -> grid[13].y);
cairo_move_to (cr, xoxo -> grid[2].x, xoxo -> grid[2].y);
cairo_line_to (cr, xoxo -> grid[14].x, xoxo -> grid[14].y);
cairo_move_to (cr, xoxo -> grid[4].x, xoxo -> grid[4].y);
cairo_line_to (cr, xoxo -> grid[7].x, xoxo -> grid[7].y);
cairo_move_to (cr, xoxo -> grid[8].x, xoxo -> grid[8].y);
cairo_line_to (cr, xoxo -> grid[11].x, xoxo -> grid[11].y);
cairo_stroke (cr);
cairo_destroy (cr);
}
static void df_game_button_press (GtkWidget *widget, gdouble x, gdouble y)
{
int i, j;
/* 判断鼠标所在方格位置 */
j = -1; /* 记录鼠标所在方格 */
for (i = 0; i < 9; i++)
{
switch (i)
{
case 0:
if ((x > xoxo -> grid[0].x && x < xoxo -> grid[5].x) && (y > xoxo -> grid[0].y && y < xoxo -> grid[5].y))
j = 0;
break;
case 1:
if ((x > xoxo -> grid[1].x && x < xoxo -> grid[6].x) && (y > xoxo -> grid[1].y && y < xoxo -> grid[6].y))
j = 1;
break;
case 2:
if ((x > xoxo -> grid[2].x && x < xoxo -> grid[7].x) && (y > xoxo -> grid[2].y && y < xoxo -> grid[7].y))
j = 2;
break;
case 3:
if ((x > xoxo -> grid[4].x && x < xoxo -> grid[9].x) && (y > xoxo -> grid[4].y && y < xoxo -> grid[9].y))
j = 3;
break;
case 4:
if ((x > xoxo -> grid[5].x && x < xoxo -> grid[10].x) && (y > xoxo -> grid[5].y && y < xoxo -> grid[10].y))
j = 4;
break;
case 5:
if ((x > xoxo -> grid[6].x && x < xoxo -> grid[11].x) && (y > xoxo -> grid[6].y && y < xoxo -> grid[11].y))
j = 5;
break;
case 6:
if ((x > xoxo -> grid[8].x && x < xoxo -> grid[13].x) && (y > xoxo -> grid[8].y && y < xoxo -> grid[13].y))
j = 6;
break;
case 7:
if ((x > xoxo -> grid[9].x && x < xoxo -> grid[14].x) && (y > xoxo -> grid[9].y && y < xoxo -> grid[14].y))
j = 7;
break;
default:
j = 8;
break;
}
if (j >= 0) break;
}
g_print ("x : %12f , y : %12f ,鼠标所在方格 : %d \n ", x, y, j);
}


  • graykis酱
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
敢问本吧讨论C++与C#吗?


  • 游梦迷途
  • 彩虹面包
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
腻害,绝对腻害


  • 不与鄙共
  • 帕秋莉糕
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
然而我学了这么久还是感觉一窍不通,不,狗屁不通


  • AutoRunAs
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/* XOXO 井字游戏 主要功能完成 (无AI) */
/* 下面只贴了些下功能函数 */
/* df_game_winner 检测谁赢了, X玩家和值3赢,O玩家和值15赢 */
static void df_game_winner (int player)
{
int i, j, k;
cairo_t * cr;
cr = cairo_create (surface);
j = -1;
k = -1;
/* 检测三横和值 */
for (i = 0; i < 9; i += 3)
{
if (xoxo -> data[i] + xoxo -> data[i+1] + xoxo -> data[i+2] == player * 3)
{
j = i;
k = i + 2;
break;
}
}
/* 检测三纵和值 */
for (i = 0; i < 3; i++)
{
if (xoxo -> data[i] + xoxo -> data[i + 3] + xoxo -> data[i + 6] == player * 3)
{
j = i;
k = i + 6;
break;
}
}
/* 检测两斜线和值 */
if (xoxo -> data[0] + xoxo -> data[4] + xoxo -> data[8] == player * 3)
{
j = 0;
k = 8;
}
if (xoxo -> data[2] + xoxo -> data[4] + xoxo -> data[6] == player * 3)
{
j = 2;
k = 6;
}
/* 有人胜出,画连线表示完成 */
if (j >= 0)
{
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
cairo_set_line_width (cr, xoxo -> radius * 0.2);
cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 0.6);
cairo_move_to (cr, xoxo -> center[j].x, xoxo -> center[j].y);
cairo_line_to (cr, xoxo -> center[k].x, xoxo -> center[k].y);
xoxo -> status = 255;
cairo_stroke (cr);
}
cairo_destroy (cr);
}
/* df_init_gui_data 初始化界面数据 * width, height 游戏界面宽与高 */
static void df_init_gui_data (double width, double height)
{
int i, j;
xoxo -> width = width;
xoxo -> height = height;
xoxo -> radius = (xoxo -> width < xoxo -> height) ? xoxo -> width / 6 : xoxo -> height / 6;
/* 设置界面十六个点坐标 */
for (i = 0; i < 16; i += 4)
{
for (j = 0; j < 4; j++)
{
xoxo -> grid[i + j].x = j * xoxo -> width / 3;
xoxo -> grid[i + j].y = i / 4 * xoxo -> height / 3;
}
}
/* 设置界面九个中心点坐标 */
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
xoxo -> center[i + j * 3].x = (2 * i + 1) * xoxo -> width / 6;
xoxo -> center[i + j * 3].y = (2 * j + 1) * xoxo -> height / 6;
}
}
/* 终端命令行打印十六个点坐标 */
g_print (" %f , %f , %f \n ", xoxo -> width, xoxo -> height, xoxo -> radius);
for (i = 0; i < 16; i++)
{
g_print ("网格坐标%2d : %12f %12f \n", i, xoxo -> grid[i].x, xoxo -> grid[i].y);
}
/* 终端命令行打印九个中心点坐标 */
for (i = 0; i < 9; i++)
{
g_print ("方格中心坐标%2d : %12f %12f \n", i, xoxo -> center[i].x, xoxo -> center[i].y);
}
}
/* 在指定的中心坐标画 玩家标志X */
static void df_game_draw_x (int index)
{
int i, k;
cairo_t *cr;
k = xoxo -> radius - 50;
cr = cairo_create (surface);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
for (i = 0; i < 2; i++)
{
if (i == 0)
{
cairo_set_line_width (cr, xoxo -> radius * 0.4);
cairo_set_source_rgb (cr, 0.8, 0.7, 0.0);
}
else
{
cairo_set_line_width (cr, xoxo -> radius * 0.3);
cairo_set_source_rgb (cr, 0.4, 0.2, 0.0);
}
cairo_move_to (cr, xoxo -> center[index].x - k, xoxo -> center[index].y - k);
cairo_line_to (cr, xoxo -> center[index].x + k, xoxo -> center[index].y + k);
cairo_move_to (cr, xoxo -> center[index].x - k, xoxo -> center[index].y + k);
cairo_line_to (cr, xoxo -> center[index].x + k, xoxo -> center[index].y - k);
cairo_stroke (cr);
}
cairo_destroy (cr);
}
/* 在指定的中心坐标画 玩家标志O */
static void df_game_draw_o (int index)
{
cairo_t *cr;
cr = cairo_create (surface);
cairo_set_line_width (cr, xoxo -> radius * 0.4);
cairo_set_source_rgb (cr, 0.2, 0.7, 0.9);
cairo_arc (cr, xoxo -> center[index].x, xoxo -> center[index].y, xoxo -> radius - 60, 0, 2 * M_PI);
cairo_stroke (cr);
cairo_set_line_width (cr, xoxo -> radius * 0.3);
cairo_set_source_rgb (cr, 0.1, 0.4, 0.5);
cairo_arc (cr, xoxo -> center[index].x, xoxo -> center[index].y, xoxo -> radius - 60, 0, 2 * M_PI);
cairo_stroke (cr);
cairo_destroy (cr);
}
/* 依据方格数据全部重绘 */
static void df_game_draw_all (void)
{
int i;
for (i = 0; i < 9; i++)
{
switch (xoxo -> data[i])
{
case 1: /* 玩家 X */
df_game_draw_x (i);
break;
case 5: /* 玩家 O */
df_game_draw_o (i);
break;
default:
break;
}
}
}
/* 处理鼠标按键按下后的数据处理 */
static void df_game_button_press (GtkWidget *widget, gdouble x, gdouble y)
{
int i, j;
/* 判断鼠标所在方格位置 */
j = -1; /* 记录鼠标所在方格 */
for (i = 0; i < 9; i++)
{
switch (i)
{
case 0:
if ((x > xoxo -> grid[0].x && x < xoxo -> grid[5].x) && (y > xoxo -> grid[0].y && y < xoxo -> grid[5].y))
j = 0;
break;
case 1:
if ((x > xoxo -> grid[1].x && x < xoxo -> grid[6].x) && (y > xoxo -> grid[1].y && y < xoxo -> grid[6].y))
j = 1;
break;
case 2:
if ((x > xoxo -> grid[2].x && x < xoxo -> grid[7].x) && (y > xoxo -> grid[2].y && y < xoxo -> grid[7].y))
j = 2;
break;
case 3:
if ((x > xoxo -> grid[4].x && x < xoxo -> grid[9].x) && (y > xoxo -> grid[4].y && y < xoxo -> grid[9].y))
j = 3;
break;
case 4:
if ((x > xoxo -> grid[5].x && x < xoxo -> grid[10].x) && (y > xoxo -> grid[5].y && y < xoxo -> grid[10].y))
j = 4;
break;
case 5:
if ((x > xoxo -> grid[6].x && x < xoxo -> grid[11].x) && (y > xoxo -> grid[6].y && y < xoxo -> grid[11].y))
j = 5;
break;
case 6:
if ((x > xoxo -> grid[8].x && x < xoxo -> grid[13].x) && (y > xoxo -> grid[8].y && y < xoxo -> grid[13].y))
j = 6;
break;
case 7:
if ((x > xoxo -> grid[9].x && x < xoxo -> grid[14].x) && (y > xoxo -> grid[9].y && y < xoxo -> grid[14].y))
j = 7;
break;
default:
j = 8;
break;
}
if (j >= 0) break;
}
if (j < 0) return;
g_print ("x : %12f , y : %12f ,鼠标所在方格 : %d Status %3d \n ", x, y, j, xoxo -> status);
/* 如果方格所在的值大于0,说明该位置已经被占用,就直接返回 */
if (xoxo -> data[j]) return;
/* 根据游戏状态,处理游戏数据 */
switch (xoxo -> status)
{
case 1: /* 玩家X */
df_game_draw_x (j);
xoxo -> data[j] = 1;
xoxo -> status = 5; /* 设置为O玩家状态 */
df_game_winner (1); /* 判断玩家X是否赢得游戏 */
break;
case 5: /* 玩家O */
df_game_draw_o (j);
xoxo -> data[j] = 5;
xoxo -> status = 1;
df_game_winner (5);
break;
case 255:
break;
default:
break;
}
}


2026-02-03 07:32:45
广告
不感兴趣
开通SVIP免广告
  • 浮生未歇
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个可以用vc6.0运行吗


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 10回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示