Toggle navigation
Toggle navigation
This project
Loading...
Sign in
2021-1-open-source
/
BaseBallSimulator
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
정주희
2021-06-10 06:14:16 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
ec855c55b682d808c3657ff51478e9ffae25ab49
ec855c55
1 parent
5d7099ab
Rearrange Files
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
399 additions
and
101 deletions
README.md
main.html
player.js
predict.js
server.js
simulation.css
simulation.html
temp_algorithm.js
README.md
View file @
ec855c5
# 적중률 99% 야구 결과 시뮬레이터
원하는 팀과 선수로 여러분만의 경기를 만들고 그 결과를 확인하세요!
## About the project
저희는 여러분에게 다양한 기능을 제공합니다. 한국의 프로야구 팀 중 두 팀을 사용자가 선택하고, 투수와 타자를 포함한 모든 선수를 사용자가 선출하여 팀을 구성할 수 있습니다. 이렇게 두 팀을 구성하게 되면 어느 팀이 이길지, 승률은 얼마인지에 대한 결과를 제공합니다!
추가적으로, 각 팀의 경기 일정과 경기 관련 영상을 확인하실 수 있습니다!
### Built with
+
HTML
+
CSS
+
Javascript
+
Express
+
pm2
+
AWS EC2
+
AWS Route 53
## Getting Started
+
https://2020105636.oss-2021.tk:23023/ 도메인 접속으로 바로 이용 가능합니다.
### 로컬 서버를 이용하여 구동하는 방법
(1) 원하는 디렉토리에서 git bash를 열어 다음 코드를 이용하여 clone을 진행합니다.
$ git clone http://khuhub.khu.ac.kr/2021-1-open-source/BaseBallSimulator.git
(2) ./BaseBallSimulator/의 위치로 이동한 후 다음 코드를 이용하여 필요한 요소들을 설치합니다.
$ npm install
(3) 다음의 코드를 입력하여 로컬 서버를 구동합니다.
$ node server.js
(4) localhost:8080 에 접속하시면 시뮬레이터를 이용하실 수 있습니다.
## Usage
+
Home 화면에서는 팀 순위와 경기 일정, 그리고 경기 기록이 우수한 선수들과 경기 관련 영상을 확인할 수 있습니다.
+
Introduction 화면
+
Calendar 화면에서는 각 팀의 로고를 클릭하면 해당 팀의 시즌 경기 일정을 확인할 수 있습니다.
+
Simulation 화면
1) 원정 팀과 홈 팀을 선택하고 각 팀의 1~9번 타자와 선발 투수를 선택합니다.
2) 시뮬레이션 버튼을 클릭하면 각 이닝별 베이스 상태와 아웃카운트, 스코어 등이 출력되며, 이를 기반으로 예측된 최종 스코어로 승리 팀과 패배 팀을 도출하여 출력합니다.
3)
## RoadMap
## Contributor
+
김건우(2020105583) : 정보 수집 및 전반적인 알고리즘 구축, Javascript
+
오진혁(2020105636) : 정보 수집 및 서버 구축, Nodejs
+
정주희(2020105660) : 프론트 및 알고리즘 적용, HTML, CSS, Javascript
\ No newline at end of file
'적중률 99%' 야구 결과 시뮬레이션
프로젝트 참여자 : 김건우(2020105583), 오진혁(2020105636), 정주희(2020105660)
프로젝트 소개 : {
목적 : 야구 경기 시뮬레이션과 경기 일정 등을 종합적으로 제공하는 서비스
구현 계획 :
[
1.
node.js or js로 크롤링하여 순위, 일정 등을 불러들여 제공(미완) -> 임시 사진 대체. 링크만 걸어놓음
2.
구현 서비스, 과정을 담은 영상을 home에 연결(미완) -> 야구 경기 하이라이트로 대체.
3.
전반적인 4개의 site(main, introduction, calendar, simulation) 구축
-> main은 위 1, 2번 문제에 해당됨.
-> introduction은 readme.md 완성 시 update할 예정.
-> simulation은 구단 클릭 시 선수 list를 불러와 원하는 구단과 선수 명단을 짜고, 이를 바탕으로 시뮬레이션 하도록 프로그래밍 요망.
현재는 임시로 KIA(원정)VS두산(홈)의 구도와 9명의 짜여진 라인업, 1명의 투수로 시뮬레이션 진행하도록 설계함.
오류 발생하는 대로 수정하여 update&commit 예정.
]
}
알고리즘 소개 : {
업데이트 예정 ...
참고사항 : 기계학습, 딥러닝 사용하지 않아 99% 적중하기는 힘들다.
}
역할 분담 : {
김건우 : 전반적인 알고리즘 구축(with javascript), calendar 사진 및 기본 틀 구축, 정보 업데이트,
오진혁 : 서버 구축 담당(with node.js), main 기본 틀 구축, shuffle 알고리즘 구축, 정보 업데이트,
정주희 : 전반적인 프론트엔드(with html, css, javascript), 알고리즘 수정 및 적용
}
\ No newline at end of file
...
...
main.html
View file @
ec855c5
...
...
@@ -25,10 +25,10 @@
</ul>
</nav>
<div
class=
"container2"
>
<a
href=
"https://sports.news.naver.com/kbaseball/record/index.nhn?category=kbo&year=2021"
><img
src=
"pngs/rank.
jpg
"
style=
"display:block; margin:0 auto; width:600px; height:400px;"
></a>
<a
href=
"https://sports.news.naver.com/kbaseball/record/index.nhn?category=kbo&year=2021"
><img
src=
"pngs/rank.
JPG
"
style=
"display:block; margin:0 auto; width:600px; height:400px;"
></a>
</div>
<div
class=
"container3"
>
<a
href=
"https://sports.news.naver.com/kbaseball/schedule/index.nhn"
><img
src=
"pngs/today.
jpg
"
style=
"display:block; margin:0 auto; width:655px; height:150px;"
></a>
<a
href=
"https://sports.news.naver.com/kbaseball/schedule/index.nhn"
><img
src=
"pngs/today.
JPG
"
style=
"display:block; margin:0 auto; width:655px; height:150px;"
></a>
</div>
<div
class=
"container4"
>
<img
src=
"pngs/1.jpg"
style=
"display:block; margin:0 auto; width:200px; height:100px;"
>
...
...
player.js
View file @
ec855c5
This diff is collapsed. Click to expand it.
predict.js
0 → 100644
View file @
ec855c5
function
add_predict
(){
var
s
=
""
;
s
+=
(
"<option value="
+
10
+
">"
+
10
+
"</option>"
);
s
+=
(
"<option value="
+
20
+
">"
+
20
+
"</option>"
);
s
+=
(
"<option value="
+
50
+
">"
+
50
+
"</option>"
);
s
+=
(
"<option value="
+
70
+
">"
+
70
+
"</option>"
);
s
+=
(
"<option value="
+
100
+
">"
+
100
+
"</option>"
);
s
+=
(
"<option value="
+
500
+
">"
+
500
+
"</option>"
);
s
+=
(
"<option value="
+
1000
+
">"
+
1000
+
"</option>"
);
s
+=
(
"<option value="
+
5000
+
">"
+
5000
+
"</option>"
);
s
+=
(
"<option value="
+
10000
+
">"
+
10000
+
"</option>"
);
s
+=
(
"<option value="
+
50000
+
">"
+
50000
+
"</option>"
);
s
+=
(
"<option value="
+
100000
+
">"
+
100000
+
"</option>"
);
document
.
getElementById
(
'pr'
).
innerHTML
=
s
;
}
function
predict
(
value
,
hitter_list1
,
hitter_list2
,
pitcher1
,
pitcher2
){
var
score
=
[
0
,
0
];
var
w
=
0
;
var
h
=
0
;
var
d
=
0
;
for
(
var
i
=
0
;
i
<
value
;
i
++
){
score
=
algorithms
(
hitter_list1
,
hitter_list2
,
pitcher1
,
pitcher2
);
if
(
score
[
0
]
>
score
[
1
]){
w
++
;
}
else
if
(
score
[
0
]
<
score
[
1
]){
h
++
;
}
else
{
d
++
;
}
}
document
.
getElementById
(
'jstest'
).
innerHTML
=
"예측 결과"
+
"<br\>"
+
"TEST "
+
value
+
"번"
+
"<br\><br\>"
+
"원정팀 승리 횟수 : "
+
w
+
"<br\>"
+
"홈팀 승리 횟수 : "
+
h
+
"<br\>"
+
"무승부 횟수 : "
+
d
+
"<br\><br\>"
+
"원정팀 승리 확률 : "
+
w
*
100
/
value
+
"%"
+
"<br\>"
+
"홈팀 승리 확률 : "
+
h
*
100
/
value
+
"%"
+
"<br\>"
;
}
function
algorithms
(
hitter_list1
,
hitter_list2
,
pitcher1
,
pitcher2
){
var
base1
=
0
;
var
base2
=
0
;
var
base3
=
0
;
//1이면 주자 있고 0이면 비어있는것
var
out
=
0
;
var
ining
=
1
;
var
home_away
=
1
;
//아웃카운트, 이닝, home이면 1이고 away이면 2.
var
score1
=
0
;
var
score2
=
0
;
var
hitter_num1
=
1
;
var
hitter_num2
=
1
;
var
hit
=
false
;
while
(
true
){
if
(
ining
==
9
&&
home_away
==
2
&&
score1
<
score2
){
//9회 초 후 home팀이 이기고 있을 때!
break
;
}
else
if
(
ining
==
10
&&
home_away
==
1
&&
score1
>
score2
&&
hit
==
false
){
//9회 말 후 home팀이 이기고 있을 때!
break
;
}
else
if
(
ining
>
9
&&
score1
<
score2
){
//9회 말 후 home팀이 이기고 있을 때!
break
;
}
else
if
(
ining
>=
11
&&
home_away
==
1
&&
hit
==
false
&&
score1
>
score2
){
//연장 이후 원정팀이 이기고 있을 때!
break
;
}
else
if
(
ining
>=
10
&&
home_away
==
2
&&
hit
==
true
&&
score1
<
score2
){
//끝내기
break
;
}
else
if
(
ining
==
13
&&
score1
==
score2
){
//무승부
break
;
}
if
(
home_away
==
1
){
var
hitter
=
hitter_list1
[
hitter_num1
];
//hitter = hitter_list1[hitter_number1%9]
var
pitcher
=
pitcher2
;
//pitcher = pitcher1
}
else
if
(
home_away
==
2
){
var
hitter
=
hitter_list2
[
hitter_num2
];
//hitter = hitter_list2[hitter_number2%9]
var
pitcher
=
pitcher1
;
//pitcher = pitcher2
}
var
num
=
Math
.
random
();
//hitter_number1 = hitter_number(kia); hitter_number2 = hitter_number(dusan);
var
one
=
0
;
var
two
=
0
;
var
three
=
0
;
var
homerun
=
0
;
one
=
pitcher
[
2
]
*
(
hitter
[
2
]
-
hitter
[
3
]
-
hitter
[
4
]
-
hitter
[
5
])
/
hitter
[
2
];
two
=
pitcher
[
2
]
*
hitter
[
3
]
/
hitter
[
2
];
three
=
pitcher
[
2
]
*
hitter
[
4
]
/
hitter
[
2
];
homerun
=
pitcher
[
2
]
*
hitter
[
5
]
/
hitter
[
2
];
hit
=
true
;
if
(
num
<=
one
){
//안타
var
num1
=
Math
.
random
();
if
(
num1
<=
0.5
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
;
break
;
case
2
:
score2
=
score2
+
base3
;
break
;
}
base3
=
base2
;
base2
=
base1
;
base1
=
1
;
}
else
{
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
;
break
;
}
base3
=
base1
;
base2
=
0
;
base1
=
1
;
}
}
else
if
((
one
<
num
)
&&
(
num
<=
one
+
two
)){
//2루타
var
num2
=
Math
.
random
();
if
(
num2
<=
0.4
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
;
break
;
}
base3
=
base1
;
base2
=
1
;
base1
=
0
;
}
else
if
(
0.4
<
num2
&&
num2
<=
0.7
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
+
base1
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
+
base1
;
break
;
}
base3
=
0
;
base2
=
1
;
base1
=
0
;
}
else
{
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
;
break
;
}
base3
=
0
;
base2
=
1
;
base1
=
0
;
}
}
else
if
((
one
+
two
<
num
)
&&
(
num
<=
one
+
two
+
three
)){
//3루타
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
+
base1
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
+
base1
;
break
;
}
base3
=
1
;
base2
=
0
;
base1
=
0
;
}
else
if
(
one
+
two
+
three
<
num
&&
num
<=
one
+
two
+
three
+
homerun
){
//홈런
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
+
base1
+
1
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
+
base1
+
1
;
break
;
}
base3
=
0
;
base2
=
0
;
base1
=
0
;
}
else
if
(
pitcher
[
2
]
<
num
&&
(
num
<=
pitcher
[
2
]
+
pitcher
[
1
]
*
0.01
)){
//볼넷
if
(
base1
==
1
&&
base2
==
1
&&
base3
==
1
){
//만루 밀어내기 득점 -> 스코어 ++
if
(
home_away
==
1
){
score1
++
;
}
else
{
score2
++
;
}
}
else
{
//스코어 추가되지 않는 경우
if
((
base2
==
1
&&
base1
==
0
)
||
(
base3
==
1
&&
base1
==
0
)
||
(
base2
==
1
&&
base3
==
1
&&
base1
==
0
)){
//2루만 채워져있거나 3루만 채워져있거나 2,3루만 채워져있거나
base1
=
1
;
}
else
if
(
base1
==
1
&&
base3
==
1
&&
base2
==
0
){
//1루 3루 채워져있고 2루 비워져있거나
base2
=
base1
;
base1
=
1
;
}
else
{
base3
=
base2
;
base2
=
base1
;
base1
=
1
;
}
}
}
else
{
//아웃
out
++
;
}
if
(
out
>=
3
){
switch
(
home_away
){
case
1
:
home_away
=
2
;
hit
=
false
;
break
;
case
2
:
home_away
=
1
;
ining
++
;
hit
=
false
;
break
;
}
out
=
0
;
base1
=
0
;
base2
=
0
;
base3
=
0
;
}
else
{
if
(
home_away
==
1
){
hitter_num1
++
;
if
(
hitter_num1
>=
10
){
hitter_num1
=
1
;
}
}
else
if
(
home_away
==
2
){
hitter_num2
++
;
if
(
hitter_num2
>=
10
){
hitter_num2
=
1
;
}
}
}
}
var
score
=
[
score1
,
score2
];
return
score
;
}
server.js
View file @
ec855c5
const
express
=
require
(
'express'
);
const
app
=
express
();
app
.
use
(
express
.
static
(
__dirname
));
app
.
listen
(
8080
,
function
(){
console
.
log
(
'listening on 8080'
);
});
app
.
get
(
'/'
,
function
(
req
,
res
){
res
.
send
File
(
__dirname
+
'/main.html'
);
app
.
get
(
'/
test
'
,
function
(
req
,
res
){
res
.
send
(
'test'
);
});
app
.
get
(
'/
main.html
'
,
function
(
req
,
res
){
app
.
get
(
'/'
,
function
(
req
,
res
){
res
.
sendFile
(
__dirname
+
'/main.html'
);
});
app
.
get
(
'/introduction.html'
,
function
(
req
,
res
){
res
.
sendFile
(
__dirname
+
'/introduction.html'
);
});
app
.
get
(
'/calendar.html'
,
function
(
req
,
res
){
res
.
sendFile
(
__dirname
+
'/calendar.html'
);
});
app
.
get
(
'/simulation.html'
,
function
(
req
,
res
){
res
.
sendFile
(
__dirname
+
'/simulation.html'
);
});
res
.
sendFile
(
__dirname
+
'/main.css'
);
});
\ No newline at end of file
...
...
simulation.css
View file @
ec855c5
...
...
@@ -78,6 +78,10 @@ body{
font-size
:
15px
;
border-radius
:
5px
;
}
.t1
:hover
{
color
:
#0053b3
;
background-color
:
#2E294E
;
}
.row
{
display
:
flex
;
justify-content
:
space-evenly
;
...
...
@@ -102,6 +106,10 @@ body{
font-size
:
15px
;
border-radius
:
5px
;
}
.t2
:hover
{
color
:
#be4209
;
background-color
:
#2E294E
;
}
.l
{
width
:
33%
;
height
:
200px
;
...
...
@@ -118,24 +126,26 @@ body{
text-align
:
center
;
}
.simul
{
width
:
50%
;
height
:
150px
;
display
:
flex
;
float
:
left
;
margin-top
:
50px
;
margin-left
:
250px
;
}
.but
{
height
:
150px
;
margin
:
0px
auto
;
margin
:
auto
;
text-align
:
center
;
}
.simulbtr
{
width
:
2
5
0px
;
width
:
2
0
0px
;
height
:
50px
;
color
:
#c9d6de
;
border
:
1px
solid
#c9d6de
;
background
:
black
;
font-size
:
30px
;
margin-top
:
50px
;
font-size
:
20px
;
border-radius
:
5px
;
margin-right
:
5px
;
}
.simulbtr
:hover
{
color
:
#7700ff
;
background-color
:
#2E294E
;
}
.tb
{
padding
:
10px
0px
0px
90px
;
...
...
@@ -155,4 +165,10 @@ td{
overflow-y
:
scroll
;
overflow-x
:
auto
;
background-color
:
white
;
}
#select_list
{
width
:
50%
;
margin
:
auto
;
text-align
:
center
;
margin-bottom
:
50px
;
}
\ No newline at end of file
...
...
simulation.html
View file @
ec855c5
...
...
@@ -6,6 +6,7 @@
<script
src =
"player.js"
></script>
<script
src =
"temp_algorithm.js"
></script>
<script
src =
"simulation.js"
></script>
<script
src =
"predict.js"
></script>
</head>
<body>
<div
class=
"container1"
>
...
...
@@ -125,12 +126,11 @@
<img
src=
"pngs/dusan.png"
id=
"home"
class=
"vs"
>
</div>
<div
class=
"simul"
>
<div
class=
"but"
>
<input
type=
"button"
onclick=
"pre_algorithm(hitter_list1, hitter_list2, pitcher1, pitcher2);"
class=
"simulbtr"
value=
"시뮬레이션"
>
</div>
<div
class=
"result"
>
</div>
<input
type=
"button"
onclick=
"pre_algorithm(hitter_list1, hitter_list2, pitcher1, pitcher2);"
class=
"simulbtr"
value=
"시뮬레이션"
>
<input
type=
"button"
onclick=
"add_predict();"
class=
"simulbtr"
value=
"승률예측"
>
</div>
<div
id=
"select_list"
>
<select
name=
"pr"
id=
"pr"
onclick=
"predict(this.value, hitter_list1, hitter_list2, pitcher1, pitcher2);"
></select>
</div>
<div
id=
"jstest"
></div>
</div>
...
...
temp_algorithm.js
View file @
ec855c5
...
...
@@ -193,8 +193,84 @@ function pre_algorithm(hitter_list1, hitter_list2, pitcher1, pitcher2){//algorit
}
else
{
//아웃
out
++
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"아웃!"
);
var
ran
=
Math
.
random
()
*
0.2
;
if
(
ran
>
0.197
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
+
base1
+
1
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
+
base1
+
1
;
break
;
}
base3
=
0
;
base2
=
0
;
base1
=
0
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"홈런!"
);
}
else
if
(
ran
>
0.1955
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
+
base1
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
+
base1
;
break
;
}
base3
=
1
;
base2
=
0
;
base1
=
0
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"3루타!"
);
}
else
if
(
ran
>
0.18
){
var
n
=
Math
.
random
();
if
(
n
<=
0.4
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
;
break
;
}
base3
=
base1
;
base2
=
1
;
base1
=
0
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"2루타!"
);
}
else
if
(
0.4
<
n
&&
n
<=
0.7
){
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
+
base1
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
+
base1
;
break
;
}
base3
=
0
;
base2
=
1
;
base1
=
0
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"2루타!"
);
}
else
{
switch
(
home_away
){
case
1
:
score1
=
score1
+
base3
+
base2
;
break
;
case
2
:
score2
=
score2
+
base3
+
base2
;
break
;
}
base3
=
0
;
base2
=
1
;
base1
=
0
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"2루타!"
);
}
}
else
{
out
++
;
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"아웃!"
);
}
}
...
...
@@ -234,4 +310,6 @@ function pre_algorithm(hitter_list1, hitter_list2, pitcher1, pitcher2){//algorit
}
document
.
getElementById
(
'jstest'
).
innerHTML
+=
(
"<br\><br\>"
+
"최종스코어 : "
+
score1
+
"vs"
+
score2
);
var
score
=
[
score1
,
score2
];
return
score
;
}
\ No newline at end of file
...
...
Please
register
or
login
to post a comment