C#編寫游戲客戶端的實(shí)現(xiàn)代碼
一、連接客戶端原理流程圖

二、功能要求
1)連接成功后,可以將服務(wù)器發(fā)來的消息不停地顯示在 listbox 中;
2) 客戶端要發(fā)給服務(wù)器的數(shù)據(jù),通過 textbox輸入 或者點(diǎn)擊button;
3) 能夠播放背景音樂;
4) 每隔30秒,變換一次游戲背景圖片。
三、代碼實(shí)現(xiàn)
新建一個(gè)Windows窗體應(yīng)用

下面是界面的布置,記得還有一個(gè)Timer,并且timer要使能,interval也要設(shè)置,這里3000為3秒

定義的變量
private NetworkStream stream;
private TcpClient tcpClient;
SoundPlayer player = new SoundPlayer("D:/新建文件夾 (2)/p3r68-cdx67/59tp0-mg2nx.wav");
//定義發(fā)送數(shù)據(jù)的套接字
Socket socket_send;
receiver_stream函數(shù),功能是接收網(wǎng)絡(luò)流并顯示在listbox里顯示,其中關(guān)于GBK的編碼請(qǐng)參考這里
C# 中使用GB2312或GBK編碼報(bào)錯(cuò)
/*
* 將字節(jié)流用GBK格式編碼在listbox里顯示
*/
void receive_stream()
{
byte[] receive_data = new byte[1024];
//定義編碼格式
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);//為使用GB2312做準(zhǔn)備
System.Text.Encoding GBK = System.Text.Encoding.GetEncoding("GBK");
if (stream.CanRead)
{
int len = stream.Read(receive_data, 0, receive_data.Length);
string msg = GBK.GetString(receive_data, 0, receive_data.Length);
string str = "\r\n";
char[] str1 = str.ToCharArray();
//亂碼集合
string[] messy_code = { "??[2J ", "[5m", "[44m", "[37;0m", "[1;33m", "[1;32m", "[1;31m" };
string[] msg1 = msg.Split(str1);//以換行符為分隔符
for (int j = 0; j < msg1.Length; j++)//逐行顯示
{
//過濾亂碼
msg1[j] = msg1[j].Replace(messy_code[0], " ");
msg1[j] = msg1[j].Replace(messy_code[1], " ");
msg1[j] = msg1[j].Replace(messy_code[2], " ");
msg1[j] = msg1[j].Replace(messy_code[3], " ");
msg1[j] = msg1[j].Replace(messy_code[4], " ");
msg1[j] = msg1[j].Replace(messy_code[5], " ");
msg1[j] = msg1[j].Replace(messy_code[6], " ");
listBox1.Items.Add(msg1[j]);
}
}
}
send_stream函數(shù),發(fā)送網(wǎng)絡(luò)流的函數(shù)
void send_stream(string str)
{
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);//為使用GB2312做準(zhǔn)備
System.Text.Encoding GBK = System.Text.Encoding.GetEncoding("GBK");
byte[] buffer = GBK.GetBytes(str+"\n");
stream.Write(buffer, 0, buffer.Length);
}
連接客戶端
private void start_game_Click(object sender, EventArgs e)
{
tcpClient = new TcpClient();
//套接字建立連接
socket_send = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Parse("10.1.230.74"), 3900);
socket_send.Connect(point);
try
{
//向指定的IP地址的服務(wù)器發(fā)送連接請(qǐng)求
tcpClient.Connect("10.1.230.74", 3900);
listBox1.Items.Add("連接成功");
stream = tcpClient.GetStream();
receive_stream();//接收字節(jié)流并顯示在屏幕上
}
catch
{
listBox1.Items.Add("服務(wù)器未啟動(dòng)");
}
}
退出游戲
private void end_game_Click(object sender, EventArgs e)
{
if (stream != null)//關(guān)閉連接,關(guān)閉流
{
stream.Close();
tcpClient.Close();
socket_send.Close();
}
listBox1.Items.Add("已經(jīng)退出游戲");
}
獲取textbox里的值并發(fā)送
private void send_msg_Click(object sender, EventArgs e)
{
if (tcpClient.Connected) {
string action = textBox1.Text.ToString();
listBox1.Items.Add("輸入的信息為:" + action);
send_stream(action);
receive_stream();
}
else
{
listBox1.Items.Add("連接已斷開");
}
}
播放音樂,這里的play好像就是在子線程播放,所以不用寫新線程
private void play_Click(object sender, EventArgs e)
{
player.Load();
player.Play();
}
停止播放
private void stop_Click(object sender, EventArgs e)
{
player.Stop();
}
定時(shí)切換圖片
private void timer1_Tick(object sender, EventArgs e)
{
Thread th = new Thread(play_pic);
th.IsBackground=true;
th.Start();
}
void play_pic()
{
flag++;
string picturePath = @"D:\testpic\" + flag + ".jpg";
pictureBox1.Image = Image.FromFile(picturePath);
if (flag == 5)
{
flag = 0;
}
}
效果

四、總結(jié)
C#做可視化界面很方便,比QT還簡(jiǎn)單,代碼格式有點(diǎn)像Java,基本上可以直接上手了,搭建網(wǎng)絡(luò)連接也很方便,不過有時(shí)候界面的設(shè)置不小心就看過了。這次還是遇到麻煩的,本來想用Windows media player來播放音樂,但因?yàn)殡娔X一直更新走的,版本不適配用不了,最后用的是自帶的播放器,只能播放wav文件,直接改后綴還不行,需要轉(zhuǎn)化一下。
五、參考
C# 中使用GB2312或GBK編碼報(bào)錯(cuò)
到此這篇關(guān)于C#編寫游戲客戶端的文章就介紹到這了,更多相關(guān)C#編寫游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)簡(jiǎn)單的RSA非對(duì)稱加密算法示例
這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單的RSA非對(duì)稱加密算法,結(jié)合實(shí)例形式分析了C#實(shí)現(xiàn)RSA加密的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
C#編程中使用ref和out關(guān)鍵字來傳遞數(shù)組對(duì)象的用法
這篇文章主要介紹了C#編程中使用ref和out關(guān)鍵字來傳遞數(shù)組對(duì)象的用法,在C#中數(shù)組也是對(duì)象可以被傳遞,需要的朋友可以參考下2016-01-01
C#實(shí)現(xiàn)winform中RichTextBox在指定光標(biāo)位置插入圖片的方法
這篇文章主要介紹了C#實(shí)現(xiàn)winform中RichTextBox在指定光標(biāo)位置插入圖片的方法,涉及RichTextBox控件及剪切板的相關(guān)操作技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-06-06
C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法
這篇文章主要介紹了C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法,涉及C#動(dòng)態(tài)鏈接庫(kù)的使用及延遲的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-09-09
C# 創(chuàng)建EXCEL圖表并保存為圖片的實(shí)例
C#調(diào)用FFmpeg操作音視頻的實(shí)現(xiàn)示例

