注释很详细,可以看看
#include <gtk/gtk.h>
#include <time.h>
void show(GtkButton *button, gpointer user_data);
void replay(GtkButton *button,gpointer user_data);
//GtkWidget是GTK+控件类型,GtkWidget * 能指向任何控件的指针类型。
GtkWidget* l_4;
GtkWidget* l_5;
GtkWidget* l_6;
GtkWidget* l_7;
int x1, x2;
int a = 1;
int b = 2;
int c = 3;
int main(int argc, char *argv[])
{
gtk_init(&argc,&argv); //初始化
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //创建一个窗口
gtk_window_set_title(GTK_WINDOW(window),"鑫哥的小游戏");//设置标题
gtk_widget_set_size_request(window,500,300); //设置窗口宽高
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); // 窗口在显示器位置的设置 GTK_WIN_POS_CENTER: 居中
gtk_window_set_resizable(GTK_WINDOW(window), FALSE); // 窗口大小不变不能拉伸
GtkWidget* table = gtk_table_new(5,3,TRUE); // 创建一个5行3列的窗口
gtk_container_add(GTK_CONTAINER(window),table); //把控件添加到窗口容器里
//设置标题中文的 没啥影响
GtkWidget* l_0 = gtk_label_new("电脑大战鑫哥");
gtk_table_attach_defaults(GTK_TABLE(table),l_0,1,2,0,1);
GtkWidget* l_1 = gtk_label_new("鑫哥");
gtk_table_attach_defaults(GTK_TABLE(table),l_1,0,1,1,2);
GtkWidget* l_2 = gtk_label_new("VS");
gtk_table_attach_defaults(GTK_TABLE(table),l_2,1,2,1,2);
GtkWidget* l_3 = gtk_label_new("电脑");
gtk_table_attach_defaults(GTK_TABLE(table),l_3,2,3,1,2);
//因为下面的可能要变,要全局变量
gtk_container_add(GTK_CONTAINER(window),table);//把控件添加到窗口容器里
l_4 = gtk_label_new(""); //1.4是上面定义的GtkWidget*1_4 表明是字符串的地址
// 下面添加控件到布局容器中 表明这个位置是个字符串;
gtk_table_attach_defaults(GTK_TABLE(table),l_4,0,1,2,3);
l_5 = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),l_5,1,2,2,3);
l_6 = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),l_6,2,3,2,3);
//这个应该是最后一行的比分
l_7 = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),l_7,1,2,4,5);
//创建按钮
GtkWidget* button1 = gtk_button_new_with_label("石头");
gtk_table_attach_defaults(GTK_TABLE(table),button1,0,1,3,4);
GtkWidget* button2 = gtk_button_new_with_label("剪刀");
gtk_table_attach_defaults(GTK_TABLE(table),button2,1,2,3,4);
GtkWidget* button3 = gtk_button_new_with_label("布");
gtk_table_attach_defaults(GTK_TABLE(table),button3,2,3,3,4);
GtkWidget* button4 = gtk_button_new_with_label("重来");
gtk_table_attach_defaults(GTK_TABLE(table),button4,2,3,4,5);
//连接信号
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL); //这个是结束程序后Linux返回没影响
//下面的分别是石头,剪刀,布和重来的信号连接和返回值
g_signal_connect(button1,"pressed",G_CALLBACK(show), &a);//int a = 1;代表出石头为1
g_signal_connect(button2,"pressed",G_CALLBACK(show), &b);//int b = 2; 代表出剪刀为2
g_signal_connect(button3,"pressed",G_CALLBACK(show), &c); //int c = 3;代表出布为3
g_signal_connect(button4,"pressed",G_CALLBACK(replay),l_7); //重来
//gtk_label_set_text(GTK_LABEL(l_5),"平局");
//gtk_label_set_text(GTK_LABEL(l_6),"布");
gtk_widget_show_all(window);
gtk_main();
return 0;
}
//判断谁赢和电脑自动
void show(GtkButton *button, gpointer user_data)
{
int t;
srand((unsigned)time(NULL)); //设置随机种子
const char * haha = gtk_button_get_label(button); // 获得按钮的文本内容到haha这个字符串中
//printf("%s\n", haha);
gtk_label_set_text(GTK_LABEL(l_4),haha); //设置1_4的内容为haha字符串的内容
t = rand() % 3 + 1; //t为1-3
char buf[20];
const char* p; // 定义p字符型指针
switch(t)
{
case 1:
p = "石头";
break;
case 2:
p = "剪刀";
break;
case 3:
p = "布";
break;
default:
p = "错误";
break;
}
gtk_label_set_text(GTK_LABEL(l_6), p); //设置1_6的内容为p的内容
//比较电脑出的拳为t数字==user_data 就是按钮信号连接返回的值
//这里的*(int *)是强行转换后去指针指向变量的值
//(int*)是强行转换
if(t == *(int *)user_data)
{
gtk_label_set_text(GTK_LABEL(l_5), "平");
}
//特殊情况 if t-1=用户 或者 t=3(布) 并且 t=1(石头),用户为3(布)时候
else if(t-1 == *(int *)user_data || (t == 1 && *(int*)user_data == 3))
{
gtk_label_set_text(GTK_LABEL(l_5), "胜"); // 用户胜利
x1++; //用户的积分+1;
}
else
{
gtk_label_set_text(GTK_LABEL(l_5), "败"); //其他情况用户输
x2++; //电脑积分+1;
}
//把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串
sprintf(buf, "%d:%d", x1, x2); // 把x1,x2写进buf字符串 为 %d:%d;
gtk_label_set_text(GTK_LABEL(l_7), buf); //设置1_7的内容为buf的内容,是一个比分字符串
return;
}
//这个是重来函数
void replay(GtkButton *button,gpointer user_data)
{
//const char * haha = gtk_button_get_label(button);
gtk_label_set_text(GTK_LABEL(user_data),"0:0");//把1_7的内容设置给 "0:0"比分串,重新了
return;
}
运行效果如下
参考文献:https://blog.csdn.net/jk_kan/article/details/106861150?utm_source=app&app_version=4.5.5
link
下面讲解下我简单的流程
#include <gtk/gtk.h>
GtkWidget* label_dns;
GtkWidget* label_vss;
GtkWidget* label_wjs;
void my_haha(GtkButton* button, gpointer user_data);
int main(int argc, char *argv[])
{
gtk_init(&argc,&argv);
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget* table = gtk_table_new(4,3,TRUE);
gtk_container_add(GTK_CONTAINER(window),table);
GtkWidget* label_title = gtk_label_new("猜拳游戏");
gtk_table_attach_defaults(GTK_TABLE(table),label_title,0,3,0,1);
GtkWidget* label_dn = gtk_label_new("电脑");
gtk_table_attach_defaults(GTK_TABLE(table),label_dn,0,1,1,2);
GtkWidget* label_vs = gtk_label_new("VS");
gtk_table_attach_defaults(GTK_TABLE(table),label_vs,1,2,1,2);
GtkWidget* label_wj = gtk_label_new("玩家");
gtk_table_attach_defaults(GTK_TABLE(table),label_wj,2,3,1,2);
//全局的label
label_dns = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),label_dns,0,1,2,3);
label_vss = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),label_vss,1,2,2,3);
label_wjs = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),label_wjs,2,3,2,3);
GtkWidget* button_st = gtk_button_new_with_label("石头");
gtk_table_attach_defaults(GTK_TABLE(table),button_st,0,1,3,4);
GtkWidget* button_jd = gtk_button_new_with_label("剪刀");
gtk_table_attach_defaults(GTK_TABLE(table),button_jd,1,2,3,4);
GtkWidget* button_bu = gtk_button_new_with_label("布儿");
gtk_table_attach_defaults(GTK_TABLE(table),button_bu,2,3,3,4);
gtk_widget_show_all(window);
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
g_signal_connect(button_st,"pressed",G_CALLBACK(my_haha),NULL);
g_signal_connect(button_jd,"pressed",G_CALLBACK(my_haha),NULL);
g_signal_connect(button_bu,"pressed",G_CALLBACK(my_haha),NULL);
gtk_main();
return 0;
}
void my_haha(GtkButton* button, gpointer user_data)
{
//1.获取按钮内容
const char * but = gtk_button_get_label(button);
//2.设置到label_wjs上
gtk_label_set_text(GTK_LABEL(label_wjs),but);
//3.生成随机的012//4.设置对应的在label_dns上
srand(time(NULL));
int dn = rand()%3;
if(dn == 0)
gtk_label_set_text(GTK_LABEL(label_dns),"石头");
else if(dn == 1)
gtk_label_set_text(GTK_LABEL(label_dns),"布儿");
else
gtk_label_set_text(GTK_LABEL(label_dns),"剪刀");
//5.比较
//先将自己的也变成012
int wj = 0;
if(0==strcmp(but,"石头"))
wj = 0;
else if(0==strcmp(but,"布儿"))
wj = 1;
else
wj = 2;
if(wj == 0 && dn == 2)
gtk_label_set_text(GTK_LABEL(label_vss),"玩家赢");
else if(wj == 2&& dn == 0)
gtk_label_set_text(GTK_LABEL(label_vss),"电脑赢");
else if(wj > dn)
gtk_label_set_text(GTK_LABEL(label_vss),"玩家赢");
else if(wj<dn)
gtk_label_set_text(GTK_LABEL(label_vss),"电脑赢");
else
gtk_label_set_text(GTK_LABEL(label_vss),"平局");
//6.设置结果在label_vss上
}
我的流程:
第一步写界面:已经知道分行分列
#include <gtk/gtk.h>
//定义全局变量
//就是那几个需要变的量
GtkWidget* dns; //表示电脑输出的结果
GtkWidget* yhs; //表示用户输出的结果
GtkWidget* vss; //表示VS输出的结果
int main(int argc, char *argv[])
{
gtk_init(&argc,&argv);//初始化
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建窗口
GtkWidget* table = gtk_table_new(4,3,TRUE); //创建4行3列
gtk_container_add(GTK_CONTAINER(window),table);//把控件添加到窗口容器里
//标题跟下面的“电脑VS玩家“
GtkWidget* label_title = gtk_label_new("猜拳游戏");
gtk_table_attach_defaults(GTK_TABLE(table),label_title,0,3,0,1);
GtkWidget* label_dn = gtk_label_new("电脑");
gtk_table_attach_defaults(GTK_TABLE(table),label_dn,0,1,1,2);
GtkWidget* label_vs = gtk_label_new("VS");
gtk_table_attach_defaults(GTK_TABLE(table),label_vs,1,2,1,2);
GtkWidget* label_wj = gtk_label_new("玩家");
gtk_table_attach_defaults(GTK_TABLE(table),label_wj,2,3,1,2);
运行如下
然后该弄全局变量
这几个了 电脑下面那行
//全局的label
dns = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),dns,0,1,2,3);
vss = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),vss,1,2,2,3);
yhs = gtk_label_new("");
gtk_table_attach_defaults(GTK_TABLE(table),yhs,2,3,2,3);
运行如下
把最下面的三个按钮写了:
//按钮
GtkWidget* button_st = gtk_button_new_with_label("石头");
gtk_table_attach_defaults(GTK_TABLE(table),button_st,0,1,3,4);
GtkWidget* button_jd = gtk_button_new_with_label("剪刀");
gtk_table_attach_defaults(GTK_TABLE(table),button_jd,1,2,3,4);
GtkWidget* button_bu = gtk_button_new_with_label("布");
gtk_table_attach_defaults(GTK_TABLE(table),button_bu,2,3,3,4);
运行如下
到这里第一部分完成
进行功能部分
找到按钮的位置
在下面写信息连接
my_haha是函数
三个按钮按下实现的功能都一样,所以让三个按钮调用一个函数就行了
//信号连接
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
g_signal_connect(button_st,"pressed",G_CALLBACK(my_haha),NULL);
g_signal_connect(button_jd,"pressed",G_CALLBACK(my_haha),NULL);
g_signal_connect(button_bu,"pressed",G_CALLBACK(my_haha),NULL);
然后定义函数
void my_haha(GtkButton* button, gpointer user_data)
{
//1.获取按钮内容
const char * but = gtk_button_get_label(button);
//2.设置到yhs 上
gtk_label_set_text(GTK_LABEL(yhs),but);
//3.生成随机的012
//4.设置对应的在dns上
srand(time(NULL)); //设置随机种子
int dn = rand()%3;//0-2
if(dn==0)
//如果电脑为0,赋值给dns为石头
gtk_label_set_text(GTK_LABEL(dns),"石头");
else if(dn == 1)
gtk_label_set_text(GTK_LABEL(dns),"布");
else
gtk_label_set_text(GTK_LABEL(dns),"剪刀");
比较语句如下
//5 比较
//先将用户的变为0,1,2;
int yh=0;
if(0==strcmp(but,"石头"))
yh=0;
if(0==strcmp(but,"布"))
yh=1;
else
yh=2;
if (yh==0&&dn==2) //用户为石头,电脑是剪刀,用户赢
//6.设置结果到vss上
gtk_label_set_text(GTK_LABEL(vss),"玩家赢");
else if(yh==2&&dn==0)
gtk_label_set_text(GTK_LABEL(vss),"电脑赢");
else if (yh>dn) //除了上面的特殊情况,只要用户数字大
// 就是用户赢
gtk_label_set_text(GTK_LABEL(vss),"玩家赢");
else if(yh<dn)
gtk_label_set_text(GTK_LABEL(vss),"电脑赢");
else
gtk_label_set_text(GTK_LABEL(vss),"平局");
}
运行