【进度】“黄金点游戏”开发进度报告2

“黄金点游戏”进度报告:2

2018141461192—梁源、2018141461103—洪华健

截至2020年11月16日,“黄金点游戏”的开发进度如下:

Introduction

黄金点游戏的开发方向基本上已经确定,我们组使用了Qt和C++进行开发。游戏的进行在==局域网==中进行,这也限定了网络游戏的范围,即不能远程网络连接游玩,但处于同一网络下的主机之间可以游玩。发起游戏的主机会作为整场游戏的服务器来接收发送消息。

Function

1
2
3
4
5
6
graph LR;
A[进入程序]--发起-->B[进入发起界面]
A--参与-->C[服务器列表界面]
B--等待人满-->D[游戏界面]
C--加入指定服务器-->E[等待界面]
E--等待人满-->D

发起界面

发起界面事实上就是房主的设置界面,可以在此页面内设置游玩的人数和游玩的最大回合数。一旦点击发起后,其他处于局域网内的用户就可以搜索到该游戏并且参与。当且仅当人数到达了设定的游玩人数时,才可以点击开始游戏按钮进行游玩。

服务器列表界面

参与游戏的人可以在此界面搜索到同一网络下的有效的游戏端口并加入。所有有效的游戏都会以按钮列表的形式返回到界面上。

等待界面

实际上就是一个Dialog窗口,用于显示当前人数和最大人数,两者相等时该窗口关闭,参与者就可以进入游戏界面。(无实机演示图)

New APIs

游戏服务端实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#pragma once
#include <iostream>
#include <qobject.h>
#define playlimit 50
#include <winsock.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
class game:public QObject
{
Q_OBJECT
public:
int playnum;
int roundnum;
int currentplayer;
int currentround;
string toconsult_buf;
string toclient_buf[playlimit];
string fromclient_buf[playlimit];
SOCKET s_consult;
SOCKET s_server;
SOCKET s_accept[playlimit];
int len = sizeof(SOCKADDR);
SOCKADDR_IN consult_addr;
SOCKADDR_IN server_addr;
SOCKADDR_IN accept_addr[playlimit];
double select[playlimit];
int score[playlimit];
//初始化
void init(int p,int r){
playnum = p;
roundnum = r;
currentplayer = 0;
}
//接受信号处理,回复信息
void reserve() {
if (currentplayer < playnum) {
s_consult= accept(s_server, (SOCKADDR*)&consult_addr, &len);
send(s_consult, toconsult_buf.c_str(), 100, 0);
}
}
//SOCKET 版本初始化
void initialization() {
WORD w_req = MAKEWORD(2, 2);//版本号
WSADATA wsadata;
WSAStartup(w_req, &wsadata);
LOBYTE(wsadata.wVersion);
HIBYTE(wsadata.wHighVersion);

}
//服务端初始化
void launch() {
initialization();
//填充服务端地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(5014);
//创建套接字
s_server = socket(AF_INET, SOCK_STREAM, 0);
bind(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR));
}
//生成传送字符
void sendbuf(int i) {
if (currentplayer < playnum) {
toconsult_buf = to_string(0) + " " + to_string(currentplayer) + " " + to_string(playnum) + " " + to_string(roundnum);
}
else {
toclient_buf[i] = to_string(1) + " " + to_string(score[i]);
}
}
//生成本轮结果
void createresult() {
int s = 0;
for (int i = 0; i < playnum; i++) {
s = s + select[i];
}
s = (0.618 * s) / playnum;
int min = 100;
int max = 0;
int minp;
int maxp;
for (int i = 0; i < playnum; i++) {
if (min > abs(s - select[i])) {
min = abs(s - select[i]);
minp = i;
}
if (max < abs(s - select[i])) {
max = abs(s - select[i]);
maxp = i;
}
}
ZeroMemory(score, sizeof(int) * playlimit);
score[minp] = playnum;
score[max] = -1;
}
};

launch界面功能实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_GameLaunch.h"
#include "game.h"
class GameLaunch : public QMainWindow
{
Q_OBJECT

public:
GameLaunch(QWidget* parent = Q_NULLPTR);

Ui::GL ui;
game ga;
void processdisplay(int i) {
QString s;
s.number(i);
s = "Player " + s + " Has Joined";

switch(i){
case -1:ui.plainTextEdit_state->appendPlainText("Launching Game Succeed"); break;
case 0:ui.plainTextEdit_state->appendPlainText("Prepared For Begining"); break;
default:ui.plainTextEdit_state->appendPlainText(s); break;
}
}
public slots:
void launch() {
ga.init(ui.spinBox_p->value(), ui.spinBox_r->value());
ga.launch();
listen(ga.s_server, SOMAXCONN);
ga.reserve();
}
};
-------------FIN-------------

本文标题:【进度】“黄金点游戏”开发进度报告2

文章作者:吃草莓糖葫芦

发布时间:2020年11月16日 - 13:11

最后更新:2020年11月16日 - 17:11

原始链接:https://tsuinterukonsigure.github.io/2020/11/16/%E3%80%90%E8%BF%9B%E5%BA%A6%E3%80%91%E2%80%9C%E9%BB%84%E9%87%91%E7%82%B9%E6%B8%B8%E6%88%8F%E2%80%9D%E5%BC%80%E5%8F%91%E8%BF%9B%E5%BA%A6%E6%8A%A5%E5%91%8A2/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

如果文章对你有用,不妨捐助一下作者小哥哥叭~