主頁 > 軟體設計 > C語言從入門到入土(入門特別篇)三子棋小游戲及如何讓朋友也能玩自己寫的游戲(程式)(exe如何附帶元件dll)

C語言從入門到入土(入門特別篇)三子棋小游戲及如何讓朋友也能玩自己寫的游戲(程式)(exe如何附帶元件dll)

2021-11-11 08:40:04 軟體設計

目錄

一:三子棋

1.游戲的基本開始流程()

2.三子棋的實作

2.1第一步寫出基本流程

2.2第二步列印選單

2.3游戲的實作

2.3.1初始化棋盤

2.3.2列印棋盤

2.3.3玩家下棋

2.3.4電腦下棋

2.3.5判斷

2.4游戲的整個代碼

game.c:

2.5三子棋的擴展

二:vs如何發布exe檔案并附帶元件

第一步:vs->工具->命令列->開發者 PowerShell(P)

第二步:查看vs 是Debug還是Releas 是x86還是x64

第三步:找到exe所在位置

第四步:查詢你exe檔案所需要的的元件(dll)


一:三子棋

1.游戲的基本開始流程()

首先肯定是main函式的創建:

test.c:

int main()
{
	test();
	return 0;
}

這里我們為了使其看起來簡單就把后續的流程用test函式去接收

test.c:

//這是我們剛才的test函式
void test()
{
	//這里我們創建input 來接收我們剛開始要去選擇的值
	int input = 0;
	//我們進來后就可以列印一個選單,告訴玩家有哪些選項
	menu();
	//對于游戲開始,我們可以使用do while回圈(先使用,后判斷),因為只要玩家
	//點擊進來就一定要進行選擇,
	//這整個就是一個最初始的模板,大家一定要記住哈!
	//這樣以后自己去寫的話思路就很清晰,只有自己思路清晰了才能寫出好的代碼,當然出BUG的
	//概率也會小很多哈!別一杯茶一支煙,一個BUG一整天哈哈!(前兩天體驗過了QAQ)
	do
	{
		printf("請選擇:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("開始游戲\n");
			game();
			break;
			//這個case 0 為退出大家最好以后就這么規定,為什么看下面的補充
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯誤,請重新選擇\n");
			break;
		}
		//接上,因為如果input==0,我們想要退出時輸入0,上面會列印退出游戲,
		//但真正要退出游戲還是要看while()里面的值是否為0,但如果我們把input
		//傳進while()里面,當我們輸入0時 while回圈判斷為假,就真正的退出回圈也就
		//是退出游戲了哈!所以大家記住這兩點哈,1是case: 0退出游戲
		//2是while()里面放input,
	} while (input);
}

以上就是對于大部分游戲的基本流程,接下來我們來進行補充,

2.三子棋的實作

開始之前,我先為大家說明,當我們實作較為復雜的代碼時,我們一般會創建三個專案,以我們這個游戲為例,我們就創建了 test.c game.c game.h,前面的是我們測驗代碼的地方,后面兩個合起來為游戲的實作,

好的接下來我們正式開始:

有了上面的游戲基本流程,就到了游戲的實作,我們還是要先有一個思路,要知道我們要干什么,怎么干是后面的事情,重點思路還是要清晰,

這個三子棋的樣子我先給大家展示:

可以知道我們游戲實作的思路大致為5點:

1.初始化棋盤
2.列印棋盤
3.玩家下棋
4.電腦下棋
5.判斷

2.1第一步寫出基本流程

test.c:

void test()
{
	int input = 0;
	menu();
	do
	{
		printf("請選擇:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("開始游戲\n");
			game();
			break;
	
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯誤,請重新選擇\n");
			break;
		}
	} while (input);
}

2.2第二步列印選單

這個里面就自己設計就行,但是最好遵循我上面說的兩點:

test.c:

void menu()
{
	printf("**********************************\n");
	printf("******         1.play       ******\n");
	printf("******         2.exit       ******\n");
	printf("**********************************\n");
}

2.3游戲的實作

這里提一點,我們用#define來定義 ROW(行)和COL(列),因為這樣我們可以更好地去維護我們的代碼,后期想要改成更大的棋盤直接改這兩個值就可以了,而且對于寫的較多代碼的實作,我們盡可能去用有意義的值去定義他們,以便于提升代碼的閱讀能力,

test.c:

void game()
{
	char Board[ROW][COL] = { 0 };
	//初始化棋盤
	InitBoard(Board, ROW, COL);
	//列印棋盤
	DisplayBoard(Board, ROW, COL);
	//下棋
	while (1)
	{
		
		//玩家下棋  *
		printf("玩家下棋:\n");
		Player_move(Board, ROW, COL);
		DisplayBoard(Board, ROW, COL);
		//電腦下棋  #
		printf("電腦下棋\n");
		Computer_move(Board, ROW, COL);
		DisplayBoard(Board, ROW, COL);

	}

當然寫到這里了就少不了函式的宣告,前面我們說了,我們要把函式的宣告放在一個叫做game.h的頭檔案當中,這里我就直接把所有的代碼發出來了防止大家代碼太多搞混:

game.h:

#pragma once
//上面這行大家不用管哈,等檔案操作部分會講,但是可以提一下這個的意思就是當有兩個一樣的
//頭檔案被宣告時就只會保留一個就這個意思哈!

#define ROW 3
#define COL 3
//這是剛剛定義的行和列

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//對于函式的名稱大家可以發現都是有特殊意義的,這是很重要的哈!不然寫完了自己不知道寫的什么
//別人也不知道那就尷尬了哈!
//初始化棋盤宣告
void InitBoard(char Board[ROW][COL],int row,int col);

//列印棋盤宣告
void DisplayBoard(char Board[ROW][COL],int row,int col);

//玩家下棋宣告
void Player_move(char Board[ROW][COL], int row, int col);

//電腦下棋宣告
void Computer_move(char Board[ROW][COL], int row,int col);

//勝利宣告
char Is_win(char Board[ROW][COL], int row, int col);

//平局宣告
int Is_full(char Board[ROW][COL], int row, int col);

然后提一下,這里我們傳的引數都是陣列和他的行數和列數

還有這路的row和col都是小寫并不是大寫是因為大寫的已經被定義了,我們不能重復使用因為他們根本就不是一個東西,還有個很重要的原因就是接收的行參一定要是變數!這里的大寫已經被定義為常量了所以一定不能傳過去

再然后就是接收陣列或者常數的時候在前面要加上型別名,后面用 “;” 結尾,還有不用寫回傳型別,因為是函式的宣告(只告訴程式有這么個函式),回傳型別在函式的定義里面寫,然后函式的定義是寫在game.c里面的,

2.3.1初始化棋盤

由圖我們發現格式是 空格%c空格| 的形式,我們先把棋盤的元素都賦值為空格:

void InitBoard(char Board[ROW][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			Board[i][j] = ' ';
		}
	}
}

2.3.2列印棋盤

還是先分析

但是我們發現如果直接列印三部分對于后續的改變代碼適應性就很差

這兩條紅色的應該是上面連著下面的,但是怕大家看不清楚就畫出了第二行的

但這也是三部分這兩條,只是說最右邊少了" |" 所以我們用了if哈

對于上述代碼我們就可以發現有很強的適應性,我們可以用row和col來控制列印的多少,

如下:

game.c:

void DisplayBoard(char Board[ROW][COL], int row, int col)
{
	
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		//列印行
		for (j = 0; j < COL; j++)
		{
			printf(" %c ", Board[i][j]);
			if(j<COL-1)
			printf("|");
		}
		printf("\n");
		//列印列
		for (j = 0; j < COL; j++)
		{
			printf("---");
			if (j < COL-1)
				printf("|");
		}
		printf("\n");
	}
	
}

2.3.3玩家下棋

game.c:

void Player_move(char Board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Board[x - 1][y - 1] == ' ')
			{
				Board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("輸過啦!!!\n");
			}
		}
		else
		{
			printf("輸出去啦!!!!\n請重新輸入:\n");
		}

	}
}

這里我們用了一個whle回圈,只有當玩家真正把數輸入進去的時候才能跳出回圈,所以在此之前我們要進行判斷,并且輸入的要是有效值,

2.3.4電腦下棋

game.c:

void Computer_move(char Board[ROW][COL], int row, int col)
{

	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (Board[x][y] == ' ')
		{
			Board[x][y] = '#';
			break;
		}
	}
}

在這里我們電腦下棋使用的是亂數生成法,是最簡單的實作方法,這里值得注意的是

rand()%ROW 生成的數屬于0到2,然后還是和上面一樣,找到空格就輸入,(因為這里生成的數都在0到2所以不可能出現越出棋盤,所以就不需要輸入判斷),當然我使用rand()函式要再用srand生成亂數種子,然后用時間戳去生成種子即:(unsigned int)srand(time(NULL)),再把這個式子放在:

test.c:

就可以生成偽亂數而且不重復啦,至于原理目前了解就行,目前不用理解,

2.3.5判斷

對于玩家和電腦下棋后我們要對棋盤進行判斷輸(#)贏(*)或者平局(Q)又或者繼續(C)

game.c:

char Is_win(char Board[ROW][COL], int row, int col)
{
	int i = 0;
	//三行
	for (i = 0; i < row; i++)
	{
		if (Board[i][0] == Board[i][1] && Board[i][1] == Board[i][2] && Board[i][1] != ' ')
		{
			return Board[i][1];
		}
	}
	//三列
	for (i = 0; i < col; i++)
	{
		if (Board[0][i] == Board[1][i] && Board[1][i] == Board[2][i] && Board[1][i] != ' ')
		{
			return Board[1][i];
		}
	}
	//對角線的判斷
	if (Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] != ' ')
	{
		return Board[1][1];
	}

	if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[1][1] != ' ')
	{
		return Board[1][1];
	}

	//判斷平局
	if (1 == Is_full(Board, row, col))
	{
		return 'Q';
	}
	//繼續
	return 'C';
}

在這里面我們又參考了一個函式Is_full()來進行平局的判斷,因為如果棋盤滿了的話都還沒有贏就是平局了,當然,如果都不是,那就要繼續游戲,

game.c:

int Is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

這里我們發現這個函式是有回傳值的(int),因為我們要對其回傳值進行接收判斷,所以我們還要再定義一個變數去接收(ret),

這樣游戲全部思路就完成啦!!!

大家可以好好回憶一下!!!

2.4游戲的整個代碼

test.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
	printf("**********************************\n");
	printf("******         1.play       ******\n");
	printf("******         2.exit       ******\n");
	printf("**********************************\n");
}

//1.初始化棋盤
//2.列印棋盤
//3.玩家下棋
//4.電腦下棋
//5.判斷

void game()
{
	char Board[ROW][COL] = { 0 };
	//初始化棋盤
	InitBoard(Board, ROW, COL);
	//列印棋盤
	DisplayBoard(Board, ROW, COL);
	//下棋
	int ret = 0;
	while (1)
	{

		//玩家下棋  *
		printf("玩家下棋:\n");
		Player_move(Board, ROW, COL);
		DisplayBoard(Board, ROW, COL);
		ret = Is_win(Board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//電腦下棋  #
		printf("電腦下棋\n");
		Computer_move(Board, ROW, COL);
		DisplayBoard(Board, ROW, COL);
		ret = Is_win(Board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家勝利!!!\n");
	}
	else if (ret == '#')
	{
		printf("電腦勝利!!!\n");
	}

	else
	{
		printf("平局\n");
	}
}

void test()
{
	int input = 0;

	srand((unsigned)time(NULL));
	menu();
	do
	{
		printf("請選擇:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("開始游戲\n");
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯誤,請重新選擇\n");
			break;
		}
	} while (input);
}


int main()
{
	test();
	return 0;
}

game.h:

#pragma once


#define ROW 3
#define COL 3

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


//初始化棋盤宣告
void InitBoard(char Board[ROW][COL], int row, int col);

//列印棋盤宣告
void DisplayBoard(char Board[ROW][COL], int row, int col);

//玩家下棋宣告
void Player_move(char Board[ROW][COL], int row, int col);

//電腦下棋宣告
void Computer_move(char Board[ROW][COL], int row, int col);

//勝利宣告
char Is_win(char Board[ROW][COL], int row, int col);

//平局宣告
int Is_full(char Board[ROW][COL], int row, int col);

game.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void InitBoard(char Board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			Board[i][j] = ' ';
		}
	}
}

void DisplayBoard(char Board[ROW][COL], int row, int col)
{

	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		//列印行
		for (j = 0; j < COL; j++)
		{
			printf(" %c ", Board[i][j]);
			if (j < COL - 1)
				printf("|");
		}
		printf("\n");
		//列印列
		for (j = 0; j < COL; j++)
		{
			printf("---");
			if (j < COL - 1)
				printf("|");
		}
		printf("\n");
	}

}

void Player_move(char Board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Board[x - 1][y - 1] == ' ')
			{
				Board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("輸過啦!!!\n");
			}
		}
		else
		{
			printf("輸出去啦!!!!\n請重新輸入:\n");
		}

	}
}

void Computer_move(char Board[ROW][COL], int row, int col)
{

	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (Board[x][y] == ' ')
		{
			Board[x][y] = '#';
			break;
		}
	}
}

int Is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}



//玩家贏回傳 *
//電腦贏回傳 #
//平局  回傳 Q
//繼續  回傳 C
char Is_win(char Board[ROW][COL], int row, int col)

{
	int i = 0;
	//三行
	for (i = 0; i < row; i++)
	{
		if (Board[i][0] == Board[i][1] && Board[i][1] == Board[i][2] && Board[i][1] != ' ')
		{
			return Board[i][1];
		}
	}
	//三列
	for (i = 0; i < col; i++)
	{
		if (Board[0][i] == Board[1][i] && Board[1][i] == Board[2][i] && Board[1][i] != ' ')
		{
			return Board[1][i];
		}
	}
	//對角線的判斷
	if (Board[0][0] == Board[1][1] && Board[1][1] == Board[2][2] && Board[1][1] != ' ')
	{
		return Board[1][1];
	}

	if (Board[0][2] == Board[1][1] && Board[1][1] == Board[2][0] && Board[1][1] != ' ')
	{
		return Board[1][1];
	}

	//判斷平局
	if (1 == Is_full(Board, row, col))
	{
		return 'Q';
	}
	//繼續
	return 'C';
}



2.5三子棋的擴展

大家可以發現,目前我們的電腦走時是靠亂數的生成,所以電腦就表現得十分笨拙,所以我們可以自己去思考一下,比如如果電腦發現自己有兩個連在一起了,就直接放在第三個取得勝利,有還有如果發現玩家要連在一起了,就去阻斷玩家等,這是個思考題哈!

二:vs如何發布exe檔案并附帶元件

們在學習的時候經常編一些自己寫的程式,在 自己的電腦上我們肯定是 可以運行的,但是有時候在別人的電腦上,我們就會發現,有些程式并不能運行

這是因為你的exe移植到另一臺電腦上,沒有包含程式所需要的元件(dll),因此程式不能運行,

接下來就教大家如何用vs發布exe檔案并附帶元件哈:

當然在正式開始之前我們先勾選檔案擴展名以至于我們更好查找

第一步:vs->工具->命令列->開發者 PowerShell(P)

第二步:查看vs 是Debug還是Releas 是x86還是x64

第三步:找到exe所在位置

第四步:查詢你exe檔案所需要的的元件(dll)

dumpbin /dependents 你的程式名字.exe (這個是指令)(dumpbin后面有空格注意了)


今天的內容就到這里了哈!!!

肝了幾天,實屬不易QAQ(字數1w+)!要是認為作者有一點幫助你的話!

就來一個點贊加關注吧!!!當然訂閱是更是求之不得!

最后的最后謝謝大家的觀看!!!

你們的支持是作者寫作的最大動力!!!

下期見哈!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355379.html

標籤:其他

上一篇:如果還學不會什么是UDP、TCP和DHCP協議,請私信我

下一篇:cgb2109-day09

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more