猜拳游戏(C语言-Linux-简单可视化)

注释很详细,可以看看

#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),"平局");
	
	}

运行

在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值