Novo Semestre

This commit is contained in:
Felipe Domingos 2023-02-08 07:02:11 -03:00
parent b7ab19b812
commit 7b1cdb2352
58 changed files with 0 additions and 10411 deletions

View File

@ -1,87 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
20
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 439550
I 1507410
R Burn Zombie Burn!
R Dredgers
R Immortal Soul: Black Survival
R NUTS
R Pilot Brothers
R Rage Wars
R Samurai Bringer
R Summoner
R Virtual Pool 4
Coloring Book for Kids
After The War
EDEN STAR
Battle Brothers
Fugl
Crypto Is Dead
BAD END THEATER
HUNTDOWN
Alien Prop Hunt
Motorama
BAD END THEATER
Homebrew - Patent Unknown
Football Manager 2019 Touch
Everreach: Project Eden
FIM

View File

@ -1,28 +0,0 @@
Coloring Book for Kids
=>raiz esq esq esq esq esq dir dir esq esq esq SIM
After The War
=>raiz esq esq esq esq esq esq esq dir dir NAO
EDEN STAR
=>raiz esq esq esq dir esq SIM
Battle Brothers
=>raiz esq esq esq esq esq dir esq esq dir esq NAO
Fugl
=>raiz esq esq dir esq esq dir NAO
Crypto Is Dead
=>raiz esq esq esq esq esq dir dir dir NAO
BAD END THEATER
=>raiz esq esq esq esq esq dir esq esq esq NAO
HUNTDOWN
=>raiz esq esq dir esq SIM
Alien Prop Hunt
=>raiz esq esq esq esq esq esq esq dir dir NAO
Motorama
=>raiz esq esq dir dir esq dir esq NAO
BAD END THEATER
=>raiz esq esq esq esq esq dir esq esq esq NAO
Homebrew - Patent Unknown
=>raiz esq esq dir SIM
Football Manager 2019 Touch
=>raiz esq esq dir esq esq dir NAO
Everreach: Project Eden
=>raiz esq esq esq dir esq dir esq NAO

View File

@ -1,82 +0,0 @@
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
FIM
19
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 1507410
R Burn Zombie Burn!
R Dredgers
R Immortal Soul: Black Survival
R NUTS
R Pilot Brothers
R Rage Wars
R Samurai Bringer
R Summoner
R Virtual Pool 4
Coloring Book for Kids
After The War
EDEN STAR
Battle Brothers
Fugl
Crypto Is Dead
BAD END THEATER
HUNTDOWN
Alien Prop Hunt
Motorama
BAD END THEATER
Homebrew - Patent Unknown
Football Manager 2019 Touch
Everreach: Project Eden
FIM

View File

@ -1,28 +0,0 @@
Coloring Book for Kids
raiz esq esq ESQ dir dir dir ESQ dir ESQ DIR DIR esq dir esq esq esq SIM
After The War
raiz esq esq ESQ esq ESQ esq esq dir dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
EDEN STAR
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ esq esq esq ESQ SIM
Battle Brothers
raiz esq esq ESQ dir esq ESQ dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
Fugl
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
Crypto Is Dead
raiz esq esq ESQ dir dir dir ESQ dir ESQ DIR DIR esq dir dir ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
BAD END THEATER
raiz esq esq ESQ esq ESQ dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
HUNTDOWN
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR SIM
Alien Prop Hunt
raiz esq esq ESQ esq ESQ esq esq dir dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
Motorama
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ dir ESQ ESQ DIR dir dir ESQ DIR DIR ESQ DIR dir dir ESQ dir dir ESQ DIR DIR ESQ dir esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
BAD END THEATER
raiz esq esq ESQ esq ESQ dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
Homebrew - Patent Unknown
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR dir SIM
Football Manager 2019 Touch
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
Everreach: Project Eden
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ esq esq esq ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO

View File

@ -1,87 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
20
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 439550
I 1507410
R Burn Zombie Burn!
R Dredgers
R Immortal Soul: Black Survival
R NUTS
R Pilot Brothers
R Rage Wars
R Samurai Bringer
R Summoner
R Virtual Pool 4
Coloring Book for Kids
After The War
EDEN STAR
Battle Brothers
Fugl
Crypto Is Dead
BAD END THEATER
HUNTDOWN
Alien Prop Hunt
Motorama
BAD END THEATER
Homebrew - Patent Unknown
Football Manager 2019 Touch
Everreach: Project Eden
FIM

View File

@ -1,28 +0,0 @@
Coloring Book for Kids
raiz esq esq dir esq esq SIM
After The War
raiz esq esq esq esq dir esq NAO
EDEN STAR
raiz esq esq dir dir SIM
Battle Brothers
raiz esq esq esq dir esq dir NAO
Fugl
raiz esq dir esq esq esq dir NAO
Crypto Is Dead
raiz esq esq dir esq dir dir NAO
BAD END THEATER
raiz esq esq esq dir esq esq NAO
HUNTDOWN
raiz esq dir esq esq SIM
Alien Prop Hunt
raiz esq esq esq esq dir esq NAO
Motorama
raiz esq dir dir dir esq NAO
BAD END THEATER
raiz esq esq esq dir esq esq NAO
Homebrew - Patent Unknown
raiz esq dir esq SIM
Football Manager 2019 Touch
raiz esq dir esq esq esq dir NAO
Everreach: Project Eden
raiz esq esq dir dir dir esq esq NAO

View File

@ -1,87 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
20
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 439550
I 1507410
R Burn Zombie Burn!
R Dredgers
R Immortal Soul: Black Survival
R NUTS
R Pilot Brothers
R Rage Wars
R Samurai Bringer
R Summoner
R Virtual Pool 4
Coloring Book for Kids
After The War
EDEN STAR
Battle Brothers
Fugl
Crypto Is Dead
BAD END THEATER
HUNTDOWN
Alien Prop Hunt
Motorama
BAD END THEATER
Homebrew - Patent Unknown
Football Manager 2019 Touch
Everreach: Project Eden
FIM

View File

@ -1,28 +0,0 @@
Coloring Book for Kids
raiz esq esq dir esq esq esq SIM
After The War
raiz esq esq esq esq dir esq NAO
EDEN STAR
raiz esq esq dir dir dir esq SIM
Battle Brothers
raiz esq esq esq dir esq dir NAO
Fugl
raiz esq dir esq esq esq dir NAO
Crypto Is Dead
raiz esq esq dir esq dir dir NAO
BAD END THEATER
raiz esq esq esq dir esq esq NAO
HUNTDOWN
raiz esq dir esq esq SIM
Alien Prop Hunt
raiz esq esq esq esq dir esq NAO
Motorama
raiz esq dir dir dir esq NAO
BAD END THEATER
raiz esq esq esq dir esq esq NAO
Homebrew - Patent Unknown
raiz esq dir esq esq dir dir SIM
Football Manager 2019 Touch
raiz esq dir esq esq esq dir NAO
Everreach: Project Eden
raiz esq esq dir dir dir esq dir NAO

View File

@ -1,59 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
Samurai Bringer
Another Otter
Chuhou Joutai 2: Paraided!
Mutant Mudds Deluxe
HUNTDOWN
A Detective's Novel
Solasta: Crown of the Magister
FIM

View File

@ -1,14 +0,0 @@
=> Samurai Bringer
Posicao: 18
=> Another Otter
Posicao: 19
=> Chuhou Joutai 2: Paraided!
Posicao: 28
=> Mutant Mudds Deluxe
Posicao: 15
=> HUNTDOWN
Posicao: 1
=> A Detective's Novel
Posicao: 2
=> Solasta: Crown of the Magister
Posicao: 23

View File

@ -1,59 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
Samurai Bringer
Another Otter
Chuhou Joutai 2: Paraided!
Mutant Mudds Deluxe
HUNTDOWN
A Detective's Novel
Solasta: Crown of the Magister
FIM

View File

@ -1,14 +0,0 @@
=> Samurai Bringer
Posicao: 18
=> Another Otter
Posicao: 20
=> Chuhou Joutai 2: Paraided!
NAO
=> Mutant Mudds Deluxe
Posicao: 16
=> HUNTDOWN
Posicao: 2
=> A Detective's Novel
NAO
=> Solasta: Crown of the Magister
Posicao: 4

View File

@ -1,59 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
Samurai Bringer
Another Otter
Chuhou Joutai 2: Paraided!
Mutant Mudds Deluxe
HUNTDOWN
A Detective's Novel
Solasta: Crown of the Magister
FIM

View File

@ -1,14 +0,0 @@
=> Samurai Bringer
Posicao: 18
=> Another Otter
Posicao: 19
=> Chuhou Joutai 2: Paraided!
Posicao: 3
=> Mutant Mudds Deluxe
Posicao: 15
=> HUNTDOWN
Posicao: 1
=> A Detective's Novel
Posicao: 2
=> Solasta: Crown of the Magister
Posicao: 3

View File

@ -1,5 +0,0 @@
2
3
5 2 7
9
8 3 10 14 6 4 13 7 1

View File

@ -1,9 +0,0 @@
Case 1:
Pre.: 5 2 7
In..: 2 5 7
Post: 2 7 5
Case 2:
Pre.: 8 3 1 6 4 7 10 14 13
In..: 1 3 4 6 7 8 10 13 14
Post: 1 4 7 6 3 13 14 10 8

View File

@ -1,11 +0,0 @@
I c
I f
I a
I h
INFIXA
PREFIXA
POSFIXA
P z
P h
I g
INFIXA

View File

@ -1,6 +0,0 @@
a c f h
c a f h
a h f c
nao existe
h existe
a c f g h

View File

@ -1,577 +0,0 @@
/**
* @file Game.java
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// ----------------------------------------------------------------------------------------------------------------- //
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
// -------------------------------------------------------------------------------------- //
public static boolean isFim(String line) { return line.compareTo("FIM") == 0; }
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
ArrayList<Game> games = new ArrayList<Game>();
// ------------------------------------------------------------------------------ //
try {
// Read CSV file
String basefile = "/tmp/games.csv";
FileInputStream fstream = new FileInputStream(basefile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Explode CSV file reading games
String line;
while((line = br.readLine()) != null) {
Game game = new Game();
game.read(line);
games.add(game);
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Read .in file
Scanner scr = new Scanner(System.in);
String line = scr.nextLine();
while(true) {
if(isFim(line)) break;
int app_id = Integer.parseInt(line);
// Search game with .in id
for(Game game : games) {
if(game.getAppId() == app_id) game.print();
}
line = scr.nextLine();
}
// ---------------------------------------------------------------------------------------------- //
scr.close();
}
// ---------------------------------------------------------------------------------------------- //
}

View File

@ -1,50 +0,0 @@
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]

View File

@ -1,51 +0,0 @@
840010
866510
1970560
411740
1509590
458520
920210
1444020
1232460
2026070
258880
295250
299500
574080
598780
1217190
257730
1807730
773670
1803150
1573070
513930
385250
261880
533300
542340
1209040
8790
8000
415150
2012500
691150
283370
249650
268870
1172510
927890
25700
281610
485610
1276850
722340
1499640
1848450
615700
744980
10180
234390
1641670
427520
FIM

View File

@ -1,50 +0,0 @@
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]

View File

@ -1,721 +0,0 @@
// ------------------------------------------------------------------------------ //
// Author: Vinicius Gabriel dos Santos - https://github.com/ravixr
// Sep/2022
//
// DESCRIPTION:
// In addition to the game data structure and
// the solution to the second question of the assignment,
// this file contains a basic implementation of a string type
// which was extensively used in the game data structure
// as well as in the solution algorithm.
// ------------------------------------------------------------------------------ //
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <stdint.h>
#define GAME_FIELDS_SIZE 17
#define MAX_FIELD_SIZE 500
#define MAX_LINE_SIZE 1000
#define MAX_GAMES 100
// If on windows remove first slash -> 'tmp/games.csv'
#define FILE_PATH "/tmp/games.csv"
// Assert macro to print custom message when assertion fails
#define assert__(x) for (; !(x); assert(x))
// --------------------------- my_very_basic_string.h --------------------------- //
typedef struct string_t string;
typedef struct strarr_t strarr;
struct string_t {
char *buf;
char (*char_at)(const string *, size_t);
int (*compare)(const string *, const string *);
void (*delete)(string *);
size_t (*find)(const string *, const char *);
size_t (*length)(const string *);
void (*replace)(string *, const char *, const char *);
strarr (*split)(const string *, const char *);
string (*substr)(const string *, size_t, size_t);
float (*to_float)(const string *);
int (*to_int)(const string *);
void (*trim)(string *);
};
struct strarr_t {
string *src;
size_t length;
void (*delete)(strarr *);
};
// string functions declaration
char str_char_at(const string *, size_t);
int str_compare(const string *, const string *);
void str_delete(string *);
size_t str_find(const string *, const char *);
size_t str_length(const string *);
void str_replace(string *, const char*, const char *);
string new_string(char *);
strarr str_split(const string *, const char *);
string str_substr(const string *, size_t, size_t);
float str_to_float(const string *);
int str_to_int(const string *);
void str_trim(string *);
// strarr functions declaration
strarr new_strarr(string *, size_t);
void strarr_delete(strarr *);
// --------------------------- my_very_basic_string.c --------------------------- //
// Fuction to initialize string type
string new_string(char *src)
{
string str;
if (src != NULL) {
if (strcmp(src, "") != 0) {
str.buf = malloc(sizeof(char) * (strlen(src) + 1));
strcpy(str.buf, src);
} else {
str.buf = malloc(sizeof(char) * 5);
strcpy(str.buf, "null");
}
} else str.buf = NULL;
str.char_at = &str_char_at;
str.compare = &str_compare;
str.delete = &str_delete;
str.find = &str_find;
str.replace = &str_replace;
str.length = &str_length;
str.split = &str_split;
str.substr = &str_substr;
str.to_float = &str_to_float;
str.to_int = &str_to_int;
str.trim = &str_trim;
return str;
}
// Fuction to deallocate string type
void str_delete(string *self)
{
free(self->buf);
}
// Returns character present in the specified index of the string
// e.g: "foo" idx: 0 -> 'f'
char str_char_at(const string *self, size_t idx)
{
// Macro to assert index is in bounds
assert__(idx < strlen(self->buf)) {
fprintf(stderr, "String index %ld is out of bounds\n", idx);
}
return self->buf[idx];
}
// Allows comparison between string type variables using strcmp in the raw data
int str_compare(const string *self, const string *another_str)
{
return strcmp(self->buf, another_str->buf);
}
// Searches the string for the first occurrence of the pattern specified.
// Returns the index position of the first character of the pattern
// or the length of the string if the pattern is not found
// e.g.: "foo bar", "bar" -> 4 | "foo bar", "baz" -> 7
size_t str_find(const string *self, const char *lkf)
{
size_t i = 0,
self_len = strlen(self->buf),
lkf_len = strlen(lkf);
// Macro to assert pattern string is valid
assert__((strcmp(lkf, "") != 0) && (lkf_len <= self_len)) {
fprintf(stderr, "Pattern '%s' is invalid for the specified string\n", lkf);
}
// Find algorithm
for (size_t j = 0; i < self_len; i++) {
if (self->buf[i] == lkf[j]) {
j++;
} else {
i-= j; j = 0;
}
if (j == lkf_len) {
i -= (j - 1);
break;
}
}
return i;
}
// Returns the length of the string using strlen in the raw data
size_t str_length(const string *self)
{
return strlen(self->buf);
}
// Replaces all occurrences of specified pattern in the string with the new specified pattern
// if the string doesn't contains the pattern to be replaced the string is not changed
// e.g.: "foobar", "bar", "" -> "foo" | "foobar", "baz", "" -> "foobar"
void str_replace(string *self, const char *old_val, const char *new_val)
{
// Saving useful lengths in variables
size_t old_len = strlen(self->buf),
nv_len = strlen(new_val),
ov_len = strlen(old_val);
// Macro to assert given pattern is valid
assert__((strcmp(old_val, "") != 0) && (old_len >= ov_len)) {
fprintf(stderr, "Invalid pattern for argument 'old_val'\n");
}
// Calculating the max possible amount of patterns in the string
// then allocating an array to store their indexes
size_t idx_sz = (old_len / ov_len),
*idx = malloc(sizeof(size_t) * (idx_sz + 1)),
idx_i = 0, last_idx = 0, skip = 0;
// Getting all starting indexes of where the pattern is found
string aux = new_string(NULL);
aux.buf = (self->buf);
while ((idx_i <= idx_sz) && (last_idx < old_len)) {
idx[idx_i] = str_find(&aux, old_val) + skip;
skip = idx[idx_i++] + ov_len;
aux.buf = (self->buf + skip);
last_idx = idx[idx_i - 1];
}
// Checking if the pattern is actually on the string
if (idx[0] != old_len) {
// Assuring 'idx_i' will not be 0
idx_i > 1 ? (idx_i -= 1) : (idx_i = 1);
// Calculating new length of the string then allocating
size_t new_len = (old_len + ((nv_len - ov_len) * idx_i));
char *tmp = malloc(sizeof(char) * (new_len + 1));
// Main Replacement algorithm: copies old string char by char,
// when the index is equal to the range of the next found pattern
// starts copying the new pattern char by chat into the string
if (nv_len == 0) nv_len = 1;
for (size_t i = 0, j = 0, k = 0, l = 0; i < new_len;) {
if (k >= idx[l] && k < (idx[l] + ov_len)) {
if (strcmp(new_val, "") != 0)
tmp[i++] = new_val[j];
j++;
if (j == nv_len) {
k += ov_len;
j = 0; l++;
}
} else tmp[i++] = self->buf[k++];
}
tmp[new_len] = '\0'; // Adding null terminator in the new string
free(self->buf); // freeing old string
self->buf = tmp; // Pointing to new string
}
free(idx); // freeing array of indexes of the old string
}
// Uses strtok to split the raw char array
// then build new strings with the splitted char arrays
// and bundle all of them in the strarr type
// e.g.: 'foo,bar' ',' -> ['foo', 'bar']
strarr str_split(const string *self, const char *delim)
{
char *str = malloc(sizeof(char) * (strlen(self->buf) + 1));
strcpy(str, self->buf);
char *token = strtok(str, delim);
size_t count = 0;
strarr str_arr = new_strarr(NULL, 0);
string *tmp;
while(token != NULL) {
tmp = realloc(str_arr.src, sizeof(string) * (count + 1));
if (tmp != NULL) {
tmp[count++] = new_string(token);
str_arr.src = tmp;
}
token = strtok(NULL, delim);
}
free(str);
free(token);
str_arr.length = count;
return str_arr;
}
// Returns a new string that is a copy of the portion of the original string
// that starts at character position 'pos' and spans 'len' characters
// e.g.: "foo bar" pos: 4, len: 3 -> "bar"
string str_substr(const string *self, size_t pos, size_t len)
{
// Macro to assert pos and len are in bounds
assert__((pos + len) <= strlen(self->buf)) {
fprintf(stderr, "String index %ld is out of bounds for '%s'\n", (pos + len), self->buf);
}
string substr = new_string(NULL);
substr.buf = malloc(sizeof(char) * (len + 1));
for (size_t i = 0, j = 0; i < len; i++, j++) {
substr.buf[j] = self->buf[pos + i];
}
substr.buf[len] = '\0';
return substr;
}
// Uses atof to convert string to float
float str_to_float(const string *self)
{
return atof(self->buf);
}
// Uses atoi to convert string to int
int str_to_int(const string *self)
{
return atoi(self->buf);
}
// Removes all spaces only from the beginning and ending of the string
// e.g.: " foo " -> "foo" | "foo bar" -> "foo bar"
void str_trim(string *self)
{
size_t i = 0, j = (strlen(self->buf) - 1);
while (self->buf[i] == ' ' || self->buf[j] == ' ') {
if (self->buf[i] == ' ') i++;
if (self->buf[j] == ' ') j--;
}
string tmp = self->substr(self, i, (j - i) + 1);
free(self->buf);
self->buf = tmp.buf;
}
// Fuction to initialize string array type
strarr new_strarr(string *src, size_t src_length)
{
strarr str_arr;
if (src != NULL)
str_arr.src = src;
else {
src_length = (src_length > 0 ? src_length : 1);
str_arr.src = malloc(sizeof(string *));
}
str_arr.length = src_length;
str_arr.delete = &strarr_delete;
return str_arr;
}
// Fuction to deallocate string array type
void strarr_delete(strarr *self)
{
for (size_t i = 0; i < self->length; i++) {
free(self->src[i].buf);
}
free(self->src);
}
// ----------------------------------- game.h ----------------------------------- //
typedef struct date_t date;
struct date_t {
uint8_t day;
char month[4];
unsigned year;
size_t value;
};
date new_date(string *);
unsigned strmon_to_int(const char *);
typedef struct game_t game;
struct game_t {
unsigned app_id;
string name;
date release_date;
string owners;
unsigned age;
float price;
unsigned dlcs;
strarr languages;
string website;
bool windows;
bool mac;
bool linux_;
float upvotes;
unsigned avg_pt;
string developers;
strarr genres;
};
game empty_game(void);
game new_game(string *);
game str_to_game(string *);
game chararr_to_game(char *);
void game_print(game *);
void game_read_csv(game *, size_t *, size_t);
char *avgpt_to_chararr (unsigned);
// ----------------------------------- game.c ----------------------------------- //
// Converts month abbreviated char array in format 'Mmm'
// to unsigned int, if unsuccessful returns 0
// e.g.: "Aug" -> 8 | "aug" -> 0
unsigned strmon_to_int(const char *mon)
{
unsigned i = 0;
if (strcmp(mon, "Jan") == 0) { i = 1; }
else if (strcmp(mon, "Feb") == 0) { i = 2; }
else if (strcmp(mon, "Mar") == 0) { i = 3; }
else if (strcmp(mon, "Apr") == 0) { i = 4; }
else if (strcmp(mon, "May") == 0) { i = 5; }
else if (strcmp(mon, "Jun") == 0) { i = 6; }
else if (strcmp(mon, "Jul") == 0) { i = 7; }
else if (strcmp(mon, "Aug") == 0) { i = 8; }
else if (strcmp(mon, "Sep") == 0) { i = 9; }
else if (strcmp(mon, "Oct") == 0) { i = 10; }
else if (strcmp(mon, "Nov") == 0) { i = 11; }
else if (strcmp(mon, "Dec") == 0) { i = 12; }
return i;
}
// Fuction to initialize date type
// Assumes that argument is a string
// in the format 'mmm dd, yyyy' or 'mmm yyyy'
// or NULL for empty initialization
date new_date(string *fmt)
{
date d;
if (fmt != NULL) {
uint8_t i = 0;
string aux;
// If the format is 'mmm dd, yyyy'
if (strlen(fmt->buf) > 10) {
// parsing day
i = fmt->find(fmt, ",") - 4;
aux = fmt->substr(fmt, 4, i);
d.day = aux.to_int(&aux);
aux.delete(&aux);
// parsing month
aux = fmt->substr(fmt, 0, 3);
strcpy(d.month, aux.buf);
aux.delete(&aux);
// parsing year
i = fmt->find(fmt, ",") + 2;
aux = fmt->substr(fmt, i, (fmt->length(fmt) - i));
d.year = aux.to_int(&aux);
aux.delete(&aux);
} else { // Assuming format is 'mmm yyyy'
// no day provided in this format
d.day = 0;
// parsing month
i = fmt->find(fmt, " ");
aux = fmt->substr(fmt, 0, i);
strcpy(d.month, aux.buf);
aux.delete(&aux);
// parsing year
aux = fmt->substr(fmt, (i + 1), fmt->length(fmt) - (i + 1));
d.year = aux.to_int(&aux);
aux.delete(&aux);
}
// parsing value
unsigned mon = strmon_to_int(d.month);
d.value = ((d.year * 10000) + (mon * 100) + d.day);
} else {
d.day = 0;
strcpy(d.month, "mmm");
d.year = 0;
d.value = 0;
}
return d;
}
// Function to initialize
// an 'empty' game struct
game empty_game(void)
{
game g;
g.app_id = 0;
g.name = new_string("");
g.release_date = new_date(NULL);
g.owners = new_string("");
g.age = 0;
g.price = 0.0f;
g.dlcs = 0;
g.languages = new_strarr(NULL, 0);
g.website = new_string("");
g.windows = false;
g.mac = false;
g.linux_ = false;
g.upvotes = 0.0f;
g.avg_pt = 0;
g.developers = new_string("");
g.genres = new_strarr(NULL, 0);
return g;
}
// Function to initialize a new game with
// the retrievd data in the string array
game new_game(string *s_arr)
{
game g;
if (s_arr != NULL) {
// App id
g.app_id = atoi(s_arr[0].buf);
// Name
g.name = new_string(s_arr[1].buf);
// Release date
g.release_date = new_date(s_arr + 2);
// Owners
g.owners = new_string(s_arr[3].buf);
// Age, Price, DLCs
g.age = atoi(s_arr[4].buf);
g.price = atof(s_arr[5].buf);
g.dlcs = atoi(s_arr[6].buf);
// Languages
// If string is not empty then splits it into a string array
if (strcmp(s_arr[7].buf, "[]") != 0) {
string tmp = s_arr[7].substr(s_arr + 7, 2, strlen(s_arr[7].buf) - 4);
tmp.replace(&tmp, "', '", "|");
g.languages = tmp.split(&tmp, "|");
tmp.delete(&tmp);
} else {
g.languages = new_strarr(NULL, 0);
string *tmp = realloc(g.languages.src, sizeof(string));
if (tmp != NULL) {
tmp[0] = new_string("");
g.languages.src = tmp;
g.languages.length = 1;
}
}
// Website
g.website = new_string(s_arr[8].buf);
// Windows, Mac, Linux
g.windows = (strcmp(s_arr[9].buf, "True") == 0) ? true : false;
g.mac = (strcmp(s_arr[10].buf, "True") == 0) ? true : false;
g.linux_ = (strcmp(s_arr[11].buf, "True") == 0) ? true : false;
// Upvotes
float up_votes = atof(s_arr[12].buf);
float down_votes = atof(s_arr[13].buf);
g.upvotes = (up_votes / ((up_votes + down_votes) / 100));
// Avg pt
g.avg_pt = atoi(s_arr[14].buf);
// Developers
g.developers = new_string(s_arr[15].buf);
// Genres
// If string is not empty and has a ',' then splits it into a string array
if ((strcmp(s_arr[16].buf, "") != 0) &&
(s_arr[16].find(s_arr + 16, ",") != strlen(s_arr[16].buf))) {
g.genres = s_arr[16].split(s_arr + 16, ",");
} else {
g.genres = new_strarr(NULL, 0);
string *tmp = realloc(g.genres.src, sizeof(string));
if (tmp != NULL) {
tmp[0] = new_string(s_arr[16].buf);
g.genres.src = tmp;
g.genres.length = 1;
}
}
} else g = empty_game();
return g;
}
// function to deallocates all
// the heap variables inside the game struct
void game_delete(game *g)
{
if (g != NULL) {
g->name.delete(&g->name);
g->owners.delete(&g->owners);
g->languages.delete(&g->languages);
g->website.delete(&g->website);
g->developers.delete(&g->developers);
g->genres.delete(&g->genres);
}
}
// Receives a char array that contains
// the data of the game strut in a csv format
// parses it and returns a game data structure
game chararr_to_game(char *ch_arr)
{
game g;
if (ch_arr != NULL) {
// Initializing static array of strings
// where each index will be a field of the game data struct
string s_arr[GAME_FIELDS_SIZE];
for (int i = 0; i < GAME_FIELDS_SIZE; i++) {
s_arr[i] = new_string(NULL);
}
// Initializing variables for the split algorithm
string aux = new_string(NULL);
aux.buf = malloc(sizeof(char) * MAX_LINE_SIZE);
size_t ch_arr_len = strlen(ch_arr), s_arr_i = 0, aux_i = 0;
bool is_str_lit = false;
// Loop to split each csv cell into a string
// and adds it to the array of strings
for (size_t i = 0; i < ch_arr_len; i++) {
if (ch_arr[i] == '"') {
is_str_lit = (is_str_lit ? false : true);
} else if (ch_arr[i] == ',' && !is_str_lit) {
aux.buf[aux_i] = '\0';
s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1));
strcpy(s_arr[s_arr_i].buf, aux.buf);
s_arr_i++; aux_i = 0;
} else {
aux.buf[aux_i++] = ch_arr[i];
}
}
// Adding last string cell to the array
aux.buf[aux_i] = '\0';
s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1));
strcpy(s_arr[s_arr_i].buf, aux.buf);
aux.delete(&aux);
// Creating game with parsed data
g = new_game(s_arr);
// Deallocating the string array
for (size_t i = 0; i < GAME_FIELDS_SIZE; i++) {
free(s_arr[i].buf);
}
} else g = empty_game();
return g;
}
// Converts avg_pt (int with amount of minutes)
// to a string in format '[x]h [y]m' returns
// a string with 'null' if avg_pt equals zero
char *avgpt_to_chararr (unsigned avg_pt)
{
char *c_arr = calloc(16, sizeof(char));
if (avg_pt != 0) {
unsigned h = avg_pt / 60;
unsigned m = avg_pt % 60;
if (h != 0 && m != 0) {
snprintf(c_arr, 16, "%dh %dm", h, m);
} else if (h != 0) {
snprintf(c_arr, 16, "%dh", h);
} else if (m != 0) {
snprintf(c_arr, 16, "%dm", m);
}
} else {
strcpy(c_arr, "null");
}
return c_arr;
}
// prints the game structure in the format
// as is specified in the assignment
void game_print(game *g)
{
printf("%u %s %s/%d %s %u %.2f %u [",
g->app_id, g->name.buf,
g->release_date.month,
g->release_date.year,
g->owners.buf, g->age,
g->price, g->dlcs);
// languages
for (size_t i = 0; i < g->languages.length - 1; i++)
printf("%s, ", g->languages.src[i].buf);
char *aux = avgpt_to_chararr(g->avg_pt);
printf("%s] %s %s %s %s %.0f%% %s %s [",
g->languages.src[g->languages.length - 1].buf, g->website.buf,
(g->windows ? "true" : "false"), (g->mac ? "true" : "false"),
(g->linux_ ? "true" : "false"), g->upvotes, aux, g->developers.buf);
free(aux);
// genres
for (size_t i = 0; i < g->genres.length - 1; i++)
printf("%s, ", g->genres.src[i].buf);
printf("%s]\n", g->genres.src[g->genres.length - 1].buf);
}
// Search for the matching 'app_id' and read the game data
// from the file 'games.csv' then adds the game to the games array
void game_read_csv(game *games, size_t *ids, size_t ids_len)
{
// Handling file opening
FILE *f = fopen(FILE_PATH, "r");
assert__(f != NULL) {
fprintf(stderr, "Failed to open '%s'\n%s", FILE_PATH,
"Hint: Try adding or removing a '/' in front (OS Dependent)\n");
}
char line[MAX_LINE_SIZE + 1];
size_t cur_id = 0;
// Searching the desired id then calling the parser function
for (size_t i = 0; i < ids_len; i++) {
while (cur_id != ids[i]) {
// reads line from file
fgets(line, MAX_LINE_SIZE, f);
// checking if is a reserved char to then trim it
if (line[strlen(line) - 2] < ' ') line[strlen(line) - 2] = '\0';
else if (line[strlen(line) - 1] < ' ') line[strlen(line) - 1] = '\0';
// atoi will only parse the beginning of the string ;)
cur_id = atoi(line);
}
rewind(f); // Resets file pointer to the beginning of the file
games[i] = chararr_to_game(line); // calling parser function
}
fclose(f); // closing the file
}
// ------------------------------------ main ------------------------------------ //
// Uses strcmp to check if
// input string equals 'FIM'
// meaning end of input
bool is_fim(char *c_arr)
{
return (strcmp(c_arr, "FIM") == 0);
}
// The main function contains the solution to
// the second question of the assignment, which is
// to read 'n' lines of strings containing the
// desired IDs of games to be read from the file 'games.csv',
// parse the data, store it in a game struct already defined,
// and print all of them in a specified format.
int main(void)
{
// game array
game games[MAX_GAMES];
size_t games_sz = 0;
// input variables
char input[MAX_FIELD_SIZE ];
size_t ids[MAX_GAMES];
// Reading input and converting to integer
// then adding it to the array of ids to be searched
fgets(input, MAX_LINE_SIZE, stdin);
input[strlen(input) - 1] = '\0';
while (!is_fim(input)) {
ids[games_sz++] = atoi(input);
fgets(input, MAX_LINE_SIZE, stdin);
// checking if is a reserved char to then trim it
if (input[strlen(input) - 2] < ' ') input[strlen(input) - 2] = '\0';
else if (input[strlen(input) - 1] < ' ') input[strlen(input) - 1] = '\0';
}
// If the array of ids is not empty
if (games_sz > 0) {
// Calls function to read from file and populate array of games
game_read_csv(games, ids, games_sz);
// Prints the games read and frees the heap allocated memory
for (size_t i = 0; i < games_sz; i++) {
game_print(games + i);
game_delete(games + i);
}
}
return 0;
}

View File

@ -1,728 +0,0 @@
/**
* @file Linux_Game.c
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// -------------------------------------------------------------------------------- //
// Includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
// -------------------------------------------------------------------------------- //
// Definitions
#define MAX_GAMES 9000
#define MAX_FIELD_SIZE 250
#define MAX_STRING_ARRAY_SIZE 100
// -------------------------------------------------------------------------------- //
// Structs
typedef struct {
int year,
month;
} Date;
typedef struct {
char name[MAX_FIELD_SIZE],
owners[MAX_FIELD_SIZE],
website[MAX_FIELD_SIZE],
developers[MAX_FIELD_SIZE],
languages[MAX_STRING_ARRAY_SIZE][30],
genres[MAX_STRING_ARRAY_SIZE][30];
Date release_date;
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
float price, upvotes;
bool windows_os, mac_os, linux_os;
} Game;
// -------------------------------------------------------------------------------- //
// Global variables
Game games[MAX_GAMES];
int n = 0;
// -------------------------------------------------------------------------------- //
// Functions
bool isFim(char* line) { return line[0] == 'F' && line[1] == 'I' && line[2] == 'M'; }
void substring(char *string, char *string_start, int length) {
strncpy(string, string_start, length);
string[length] = '\0';
}
char *getMonthName(int month) {
switch(month) {
case 1: return "Jan"; break;
case 2: return "Feb"; break;
case 3: return "Mar"; break;
case 4: return "Apr"; break;
case 5: return "May"; break;
case 6: return "Jun"; break;
case 7: return "Jul"; break;
case 8: return "Aug"; break;
case 9: return "Sep"; break;
case 10: return "Oct"; break;
case 11: return "Nov"; break;
case 12: return "Dec"; break;
default: return "N/A"; break;
}
}
int getMonthNumber(char* month) {
if(!strcmp(month, "Jan")) return 1;
else if(!strcmp(month, "Feb")) return 2;
else if(!strcmp(month, "Mar")) return 3;
else if(!strcmp(month, "Apr")) return 4;
else if(!strcmp(month, "May")) return 5;
else if(!strcmp(month, "Jun")) return 6;
else if(!strcmp(month, "Jul")) return 7;
else if(!strcmp(month, "Aug")) return 8;
else if(!strcmp(month, "Sep")) return 9;
else if(!strcmp(month, "Oct")) return 10;
else if(!strcmp(month, "Nov")) return 11;
else if(!strcmp(month, "Dec")) return 12;
}
// -------------------------------------------------------------------------------- //
// Class game functions
void game_start(Game *game) {
strcpy(game -> name, "");
strcpy(game -> owners, "");
strcpy(game -> website, "");
strcpy(game -> developers, "");
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
strcpy(game -> languages[i], "");
strcpy(game -> genres[i], "");
}
game -> release_date.month = -1;
game -> release_date.year = -1;
game -> app_id = -1;
game -> age = -1;
game -> dlcs = -1;
game -> avg_playtime = -1;
game -> price = -1;
game -> upvotes = -1;
game -> windows_os = false;
game -> mac_os = false;
game -> linux_os = false;
game -> count_languages = 0;
game -> count_genres = 0;
}
void game_print(Game *game) {
int hours = game -> avg_playtime / 60,
minutes = game -> avg_playtime % 60;
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
for(int i = 0; i < game -> count_languages; i++) {
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
}
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
if(isnan(game -> upvotes)) printf("0.0%% ");
else printf("%.0f%% ", game -> upvotes);
if(hours > 0)
{
printf("%ih ", hours);
if(minutes > 0) printf("%im ", minutes);
}
else {
if(minutes > 0) printf("%im ", minutes);
else printf("null ");
}
printf("%s [", game -> developers);
for(int i = 0; i < game -> count_genres; i++) {
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
}
printf("]\n");
}
Game game_clone(Game *game) {
Game cloned;
strcpy(cloned.name, game -> name);
strcpy(cloned.owners, game -> owners);
strcpy(cloned.website, game -> website);
strcpy(cloned.developers, game -> developers);
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
cloned.release_date.month = game -> release_date.month;
cloned.release_date.year = game -> release_date.year;
cloned.app_id = game -> app_id;
cloned.age = game -> age;
cloned.dlcs = game -> dlcs;
cloned.avg_playtime = game -> avg_playtime;
cloned.price = game -> price;
cloned.upvotes = game -> upvotes;
cloned.windows_os = game -> windows_os;
cloned.mac_os = game -> mac_os;
cloned.linux_os = game -> linux_os;
return cloned;
}
void game_read(Game *game, char *line) {
char c_search, sub[MAX_FIELD_SIZE];
int index = 0, atr_index = 0;
// ------------------------------------------------------------ //
// Find "AppID"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> app_id = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Name"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> name, sub);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else {
strcpy(game -> name, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find release date
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
char subDate[10];
substring(subDate, &sub[0], 3);
game -> release_date.month = getMonthNumber(subDate);
if(c_search == ',') {
substring(subDate, &sub[4], 4);
game -> release_date.year = atoi(subDate);
index++;
}
else if(c_search == '\"') {
int nmbSpace = 0;
for(int i = 0; ; i++) {
if(sub[i] == ' ') nmbSpace++;
if(nmbSpace == 2) {
i++;
substring(subDate, &sub[i], 4);
game -> release_date.year = atoi(subDate);
break;
}
}
index += 2;
}
atr_index = index;
break;
}
}
}
else {
game -> release_date.month = 0;
game -> release_date.year = 0;
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Owners"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> owners, sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Age"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> age = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Price"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> price = atof(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "DLCs"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> dlcs = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Languages"
while(true) {
index++;
if(line[index] == ']') {
index++;
if(line[index] == ',') index++;
else if(line[index] == '\"') index += 2;
atr_index = index;
break;
}
else if(line[index] == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line[index] == '\'') {
substring(sub, &line[wordStart], index - wordStart);
strcpy(game -> languages[game -> count_languages++], sub);
break;
}
}
}
}
// ------------------------------------------------------------ //
// Find "Website"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> website, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> website, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Windows"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> windows_os = true;
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> mac_os = true;
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> linux_os = true;
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
positives = atoi(sub);
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
negatives = atoi(sub);
atr_index = ++index;
break;
}
}
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ------------------------------------------------------------ //
// Find "AVG Playtime"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> avg_playtime = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Developers"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> developers, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> developers, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Genres"
if(index < strlen(line) - 1) {
if(line[index] == ',') atr_index = ++index;
if(line[atr_index] == '\"') {
atr_index++;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
atr_index = ++index;
}
else if(line[index] == '\"') {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0';
else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
strcpy(game -> genres[game -> count_genres++], sub);
break;
}
}
}
else {
substring(sub, &line[atr_index], strlen(line) - 2 - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
}
}
}
// -------------------------------------------------------------------------------- //
// Functions - List
void list_insert(Game x) {
if(n >= MAX_GAMES) {
printf("Insert error: MAX_GAMES reached");
exit(1);
}
games[n++] = x;
}
// ---------------------------------------------------------------------------------------------------------- //
int main() {
// ------------------------------------------------------------ //
// First part - Read all games
// Open CSV file
FILE *fp;
char *line = NULL;
size_t len = 0;
size_t read;
fp = fopen("/tmp/games.csv", "r");
if(fp == NULL) exit(EXIT_FAILURE);
// ------------------------- //
// Fill games list
while((read = getline(&line, &len, fp)) != -1) {
Game game;
game_start(&game);
game_read(&game, line);
list_insert(game);
}
// ------------------------- //
fclose(fp);
if(line) free(line);
// ------------------------------------------------------------ //
// Second part - Print .in games
char in[15];
scanf(" %[^\n]s", in);
while(true) {
if(isFim(in)) break;
else {
int app_id = atoi(in);
for(int i = 0; i < n; i++) {
if(games[i].app_id == app_id) {
game_print(&games[i]);
break;
}
}
// ------------------------- //
scanf(" %[^\n]s", in);
}
}
return EXIT_SUCCESS;
}

View File

@ -1,728 +0,0 @@
/**
* @file WSL_Game.c
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// -------------------------------------------------------------------------------- //
// Includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
// -------------------------------------------------------------------------------- //
// Definitions
#define MAX_GAMES 9000
#define MAX_FIELD_SIZE 250
#define MAX_STRING_ARRAY_SIZE 100
// -------------------------------------------------------------------------------- //
// Structs
typedef struct {
int year,
month;
} Date;
typedef struct {
char name[MAX_FIELD_SIZE],
owners[MAX_FIELD_SIZE],
website[MAX_FIELD_SIZE],
developers[MAX_FIELD_SIZE],
languages[MAX_STRING_ARRAY_SIZE][30],
genres[MAX_STRING_ARRAY_SIZE][30];
Date release_date;
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
float price, upvotes;
bool windows_os, mac_os, linux_os;
} Game;
// -------------------------------------------------------------------------------- //
// Global variables
Game games[MAX_GAMES];
int n = 0;
// -------------------------------------------------------------------------------- //
// Functions
bool isFim(char* line) { return line[0] == 'F' && line[1] == 'I' && line[2] == 'M'; }
void substring(char *string, char *string_start, int length) {
strncpy(string, string_start, length);
string[length] = '\0';
}
char *getMonthName(int month) {
switch(month) {
case 1: return "Jan"; break;
case 2: return "Feb"; break;
case 3: return "Mar"; break;
case 4: return "Apr"; break;
case 5: return "May"; break;
case 6: return "Jun"; break;
case 7: return "Jul"; break;
case 8: return "Aug"; break;
case 9: return "Sep"; break;
case 10: return "Oct"; break;
case 11: return "Nov"; break;
case 12: return "Dec"; break;
default: return "N/A"; break;
}
}
int getMonthNumber(char* month) {
if(!strcmp(month, "Jan")) return 1;
else if(!strcmp(month, "Feb")) return 2;
else if(!strcmp(month, "Mar")) return 3;
else if(!strcmp(month, "Apr")) return 4;
else if(!strcmp(month, "May")) return 5;
else if(!strcmp(month, "Jun")) return 6;
else if(!strcmp(month, "Jul")) return 7;
else if(!strcmp(month, "Aug")) return 8;
else if(!strcmp(month, "Sep")) return 9;
else if(!strcmp(month, "Oct")) return 10;
else if(!strcmp(month, "Nov")) return 11;
else if(!strcmp(month, "Dec")) return 12;
}
// -------------------------------------------------------------------------------- //
// Class game functions
void game_start(Game *game) {
strcpy(game -> name, "");
strcpy(game -> owners, "");
strcpy(game -> website, "");
strcpy(game -> developers, "");
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
strcpy(game -> languages[i], "");
strcpy(game -> genres[i], "");
}
game -> release_date.month = -1;
game -> release_date.year = -1;
game -> app_id = -1;
game -> age = -1;
game -> dlcs = -1;
game -> avg_playtime = -1;
game -> price = -1;
game -> upvotes = -1;
game -> windows_os = false;
game -> mac_os = false;
game -> linux_os = false;
game -> count_languages = 0;
game -> count_genres = 0;
}
void game_print(Game *game) {
int hours = game -> avg_playtime / 60,
minutes = game -> avg_playtime % 60;
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
for(int i = 0; i < game -> count_languages; i++) {
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
}
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
if(isnan(game -> upvotes)) printf("0.0%% ");
else printf("%.0f%% ", game -> upvotes);
if(hours > 0)
{
printf("%ih ", hours);
if(minutes > 0) printf("%im ", minutes);
}
else {
if(minutes > 0) printf("%im ", minutes);
else printf("null ");
}
printf("%s [", game -> developers);
for(int i = 0; i < game -> count_genres; i++) {
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
}
printf("]\n");
}
Game game_clone(Game *game) {
Game cloned;
strcpy(cloned.name, game -> name);
strcpy(cloned.owners, game -> owners);
strcpy(cloned.website, game -> website);
strcpy(cloned.developers, game -> developers);
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
cloned.release_date.month = game -> release_date.month;
cloned.release_date.year = game -> release_date.year;
cloned.app_id = game -> app_id;
cloned.age = game -> age;
cloned.dlcs = game -> dlcs;
cloned.avg_playtime = game -> avg_playtime;
cloned.price = game -> price;
cloned.upvotes = game -> upvotes;
cloned.windows_os = game -> windows_os;
cloned.mac_os = game -> mac_os;
cloned.linux_os = game -> linux_os;
return cloned;
}
void game_read(Game *game, char *line) {
char c_search, sub[MAX_FIELD_SIZE];
int index = 0, atr_index = 0;
// ------------------------------------------------------------ //
// Find "AppID"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> app_id = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Name"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> name, sub);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else {
strcpy(game -> name, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find release date
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
char subDate[10];
substring(subDate, &sub[0], 3);
game -> release_date.month = getMonthNumber(subDate);
if(c_search == ',') {
substring(subDate, &sub[4], 4);
game -> release_date.year = atoi(subDate);
index++;
}
else if(c_search == '\"') {
int nmbSpace = 0;
for(int i = 0; ; i++) {
if(sub[i] == ' ') nmbSpace++;
if(nmbSpace == 2) {
i++;
substring(subDate, &sub[i], 4);
game -> release_date.year = atoi(subDate);
break;
}
}
index += 2;
}
atr_index = index;
break;
}
}
}
else {
game -> release_date.month = 0;
game -> release_date.year = 0;
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Owners"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> owners, sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Age"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> age = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Price"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> price = atof(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "DLCs"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> dlcs = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Languages"
while(true) {
index++;
if(line[index] == ']') {
index++;
if(line[index] == ',') index++;
else if(line[index] == '\"') index += 2;
atr_index = index;
break;
}
else if(line[index] == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line[index] == '\'') {
substring(sub, &line[wordStart], index - wordStart);
strcpy(game -> languages[game -> count_languages++], sub);
break;
}
}
}
}
// ------------------------------------------------------------ //
// Find "Website"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> website, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> website, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Windows"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> windows_os = true;
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> mac_os = true;
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> linux_os = true;
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
positives = atoi(sub);
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
negatives = atoi(sub);
atr_index = ++index;
break;
}
}
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ------------------------------------------------------------ //
// Find "AVG Playtime"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> avg_playtime = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Developers"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> developers, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> developers, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Genres"
if(index < strlen(line) - 1) {
if(line[index] == ',') atr_index = ++index;
if(line[atr_index] == '\"') {
atr_index++;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
atr_index = ++index;
}
else if(line[index] == '\"') {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0';
else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
strcpy(game -> genres[game -> count_genres++], sub);
break;
}
}
}
else {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
}
}
}
// -------------------------------------------------------------------------------- //
// Functions - List
void list_insert(Game x) {
if(n >= MAX_GAMES) {
printf("Insert error: MAX_GAMES reached");
exit(1);
}
games[n++] = x;
}
// ---------------------------------------------------------------------------------------------------------- //
int main() {
// ------------------------------------------------------------ //
// First part - Read all games
// Open CSV file
FILE *fp;
char *line = NULL;
size_t len = 0;
size_t read;
fp = fopen("/tmp/games.csv", "r");
if(fp == NULL) exit(EXIT_FAILURE);
// ------------------------- //
// Fill games list
while((read = getline(&line, &len, fp)) != -1) {
Game game;
game_start(&game);
game_read(&game, line);
list_insert(game);
}
// ------------------------- //
fclose(fp);
if(line) free(line);
// ------------------------------------------------------------ //
// Second part - Print .in games
char in[15];
scanf(" %[^\n]s", in);
while(true) {
if(isFim(in)) break;
else {
int app_id = atoi(in);
for(int i = 0; i < n; i++) {
if(games[i].app_id == app_id) {
game_print(&games[i]);
break;
}
}
// ------------------------- //
scanf(" %[^\n]s", in);
}
}
return EXIT_SUCCESS;
}

View File

@ -1,50 +0,0 @@
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]

View File

@ -1,51 +0,0 @@
840010
866510
1970560
411740
1509590
458520
920210
1444020
1232460
2026070
258880
295250
299500
574080
598780
1217190
257730
1807730
773670
1803150
1573070
513930
385250
261880
533300
542340
1209040
8790
8000
415150
2012500
691150
283370
249650
268870
1172510
927890
25700
281610
485610
1276850
722340
1499640
1848450
615700
744980
10180
234390
1641670
427520
FIM

View File

@ -1,50 +0,0 @@
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]

View File

@ -1,204 +0,0 @@
import java.util.Formatter;
import java.util.Scanner;
import java.io.File;
public class Arq
{
private static String nomeArquivo = "";
private static String charsetArquivo = "ISO-8859-1";
private static boolean write = false, read = false;
private static Formatter saida = null;
private static Scanner entrada = null;
public static boolean openWrite(String nomeArq, String charset) {
boolean resp = false;
close();
try{
saida = new Formatter(nomeArq, charset);
nomeArquivo = nomeArq;
resp = write = true;
} catch (Exception e) {}
return resp;
}
public static boolean openWrite(String nomeArq) {
return openWrite(nomeArq, charsetArquivo);
}
public static boolean openWriteClose(String nomeArq, String charset, String conteudo) {
boolean resp = openWrite(nomeArq, charset);
if(resp == true){
println(conteudo);
close();
}
return resp;
}
public static boolean openWriteClose(String nomeArq, String conteudo) {
return openWriteClose(nomeArq, charsetArquivo, conteudo);
}
public static boolean openRead(String nomeArq) {
return openRead(nomeArq, charsetArquivo);
}
public static boolean openRead(String nomeArq, String charset) {
boolean resp = false;
close();
try{
entrada = new Scanner(new File(nomeArq), charset);
nomeArquivo = nomeArq;
resp = read = true;
} catch (Exception e) {}
return resp;
}
public static String openReadClose(String nomeArq){
openRead(nomeArq);
String resp = readAll();
close();
return resp;
}
public static void close() {
if(write == true){
saida.close();
}
if(read == true){
entrada.close();
}
write = read = false;
nomeArquivo = "";
charsetArquivo = "ISO-8859-1";
}
public static long length(){
long resp = -1;
if(read != write){
File file = new File(nomeArquivo);
resp = file.length();
}
return resp;
}
public static void print(int x){
if(write == true){
saida.format( "%d", x);
}
}
public static void print(double x){
if(write == true){
saida.format( "%f", x);
}
}
public static void print(String x){
if(write == true){
saida.format( "%s", x);
}
}
public static void print(boolean x){
if(write == true){
saida.format( "%s", ((x) ? "true" : "false"));
}
}
public static void print(char x){
if(write == true){
saida.format( "%c", x);
}
}
public static void println(int x){
if(write == true){
saida.format( "%d\n", x);
}
}
public static void println(double x){
if(write == true){
saida.format( "%f\n", x);
}
}
public static void println(String x){
if(write == true){
saida.format( "%s\n", x);
}
}
public static void println(boolean x){
if(write == true){
saida.format( "%s\n", ((x) ? "true" : "false"));
}
}
public static void println(char x){
if(write == true){
saida.format( "%c\n", x);
}
}
public static int readInt(){
int resp = -1;
try{
resp = entrada.nextInt();
} catch (Exception e) {}
return resp;
}
public static char readChar(){
char resp = ' ';
try{
resp = (char)entrada.nextByte();
} catch (Exception e) {}
return resp;
}
public static double readDouble(){
double resp = -1;
try{
resp = Double.parseDouble(readString().replace(",","."));
} catch (Exception e) {}
return resp;
}
public static String readString(){
String resp = "";
try{
resp = entrada.next();
} catch (Exception e) { System.out.println(e.getMessage()); }
return resp;
}
public static boolean readBoolean(){
boolean resp = false;
try{
resp = (entrada.next().equals("true")) ? true : false;
} catch (Exception e) {}
return resp;
}
public static String readLine(){
String resp = "";
try{
resp = entrada.nextLine();
} catch (Exception e) { System.out.println(e.getMessage()); }
return resp;
}
public static boolean hasNext(){
return entrada.hasNext();
}
public static String readAll(){
String resp = "";
while(hasNext()){
resp += (readLine() + "\n");
}
return resp;
}
}

View File

@ -1,607 +0,0 @@
/**
* @file Game.java
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// ----------------------------------------------------------------------------------------------------------------- //
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
Scanner scr = new Scanner(System.in);
ArrayList<Integer> gamesToAdd = new ArrayList<Integer>();
ArrayList<Game> games = new ArrayList<Game>();
String line = scr.nextLine();
// ------------------------------------------------------------------------------ //
// Fill list with requested ids
while(true) {
if(line.equals("FIM")) break;
gamesToAdd.add(Integer.parseInt(line));
line = scr.nextLine();
}
// ------------------------------------------------------------------------------ //
// Add requested ids to games list
try {
// Read CSV file
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
while((line = br.readLine()) != null) {
if(gamesToAdd.contains(Integer.parseInt(line.substring(0, line.indexOf(','))))) {
Game game = new Game();
game.read(line);
games.add(game);
}
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Initialize bench log
int c_compares = 0;
long t_begin = System.currentTimeMillis();
// Search in games list by name
line = scr.nextLine();
while(true) {
if(line.equals("FIM")) break;
// ------------------------------------ //
boolean found = false;
for(int i = 0; i < games.size(); i++) {
c_compares++;
if(games.get(i).name.compareTo(line) == 0) {
found = true;
break;
}
}
// ------------------------------------ //
System.out.println(found ? "SIM" : "NAO");
line = scr.nextLine();
}
Arq.openWrite("753045_sequencial.txt");
Arq.print("753045\t" + (System.currentTimeMillis() - t_begin) + "ms\t" + c_compares);
Arq.close();
scr.close();
// ---------------------------------------------------------------------------------------------- //
}
// ---------------------------------------------------------------------------------------------- //
}

View File

@ -1,39 +0,0 @@
SIM
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO

View File

@ -1,91 +0,0 @@
840010
866510
1970560
411740
1509590
458520
920210
1444020
1232460
2026070
258880
295250
299500
574080
598780
1217190
257730
1807730
773670
1803150
1573070
513930
385250
261880
533300
542340
1209040
8790
8000
415150
2012500
691150
283370
249650
268870
1172510
927890
25700
281610
485610
1276850
722340
1499640
1848450
615700
744980
10180
234390
1641670
427520
FIM
Bobbi Adventure
The Test: Hypothesis Rising
Epic Cards Battle 2 (TCG)
Omensight: Definitive Edition
Gray Matter
The Legend of Bean
Armored Warfare
Void Slayer
RacetronicVR
The Amazing American Circus
Your Quest
HistoryMaker VR
WE ARE FOOTBALL
Rise of Insanity
Aragami
BONEWORKS
CAGE
Saku Saku: Love Blooms with the Cherry Blossoms
Kill The Bad Guy
Deisim
Redactem
Xuan-Yuan Sword: The Gate of Firmament
Subspace Continuum
DRAGON BALL XENOVERSE
RiotZ
Stephen's Sausage Roll
Tavern Tycoon - Dragon's Hangover
Child of Light
Heart and Seoul
Tank Destroyer
Claire
MONOLISK
Cinderella Escape 2 Revenge
Flat Heroes
The Political Machine 2016
AFFECTED: The Manor - The Complete Edition
QUAKE III: Team Arena
Woodcutter Simulator 2013
Dawn of Man
FIM

View File

@ -1,39 +0,0 @@
SIM
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO

View File

@ -1,204 +0,0 @@
import java.util.Formatter;
import java.util.Scanner;
import java.io.File;
public class Arq
{
private static String nomeArquivo = "";
private static String charsetArquivo = "ISO-8859-1";
private static boolean write = false, read = false;
private static Formatter saida = null;
private static Scanner entrada = null;
public static boolean openWrite(String nomeArq, String charset) {
boolean resp = false;
close();
try{
saida = new Formatter(nomeArq, charset);
nomeArquivo = nomeArq;
resp = write = true;
} catch (Exception e) {}
return resp;
}
public static boolean openWrite(String nomeArq) {
return openWrite(nomeArq, charsetArquivo);
}
public static boolean openWriteClose(String nomeArq, String charset, String conteudo) {
boolean resp = openWrite(nomeArq, charset);
if(resp == true){
println(conteudo);
close();
}
return resp;
}
public static boolean openWriteClose(String nomeArq, String conteudo) {
return openWriteClose(nomeArq, charsetArquivo, conteudo);
}
public static boolean openRead(String nomeArq) {
return openRead(nomeArq, charsetArquivo);
}
public static boolean openRead(String nomeArq, String charset) {
boolean resp = false;
close();
try{
entrada = new Scanner(new File(nomeArq), charset);
nomeArquivo = nomeArq;
resp = read = true;
} catch (Exception e) {}
return resp;
}
public static String openReadClose(String nomeArq){
openRead(nomeArq);
String resp = readAll();
close();
return resp;
}
public static void close() {
if(write == true){
saida.close();
}
if(read == true){
entrada.close();
}
write = read = false;
nomeArquivo = "";
charsetArquivo = "ISO-8859-1";
}
public static long length(){
long resp = -1;
if(read != write){
File file = new File(nomeArquivo);
resp = file.length();
}
return resp;
}
public static void print(int x){
if(write == true){
saida.format( "%d", x);
}
}
public static void print(double x){
if(write == true){
saida.format( "%f", x);
}
}
public static void print(String x){
if(write == true){
saida.format( "%s", x);
}
}
public static void print(boolean x){
if(write == true){
saida.format( "%s", ((x) ? "true" : "false"));
}
}
public static void print(char x){
if(write == true){
saida.format( "%c", x);
}
}
public static void println(int x){
if(write == true){
saida.format( "%d\n", x);
}
}
public static void println(double x){
if(write == true){
saida.format( "%f\n", x);
}
}
public static void println(String x){
if(write == true){
saida.format( "%s\n", x);
}
}
public static void println(boolean x){
if(write == true){
saida.format( "%s\n", ((x) ? "true" : "false"));
}
}
public static void println(char x){
if(write == true){
saida.format( "%c\n", x);
}
}
public static int readInt(){
int resp = -1;
try{
resp = entrada.nextInt();
} catch (Exception e) {}
return resp;
}
public static char readChar(){
char resp = ' ';
try{
resp = (char)entrada.nextByte();
} catch (Exception e) {}
return resp;
}
public static double readDouble(){
double resp = -1;
try{
resp = Double.parseDouble(readString().replace(",","."));
} catch (Exception e) {}
return resp;
}
public static String readString(){
String resp = "";
try{
resp = entrada.next();
} catch (Exception e) { System.out.println(e.getMessage()); }
return resp;
}
public static boolean readBoolean(){
boolean resp = false;
try{
resp = (entrada.next().equals("true")) ? true : false;
} catch (Exception e) {}
return resp;
}
public static String readLine(){
String resp = "";
try{
resp = entrada.nextLine();
} catch (Exception e) { System.out.println(e.getMessage()); }
return resp;
}
public static boolean hasNext(){
return entrada.hasNext();
}
public static String readAll(){
String resp = "";
while(hasNext()){
resp += (readLine() + "\n");
}
return resp;
}
}

View File

@ -1,627 +0,0 @@
/**
* @file Game.java
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// ----------------------------------------------------------------------------------------------------------------- //
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class Game implements Comparable<Game> {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public int compareTo(Game other) { return this.name.compareTo(other.name); }
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
Scanner scr = new Scanner(System.in);
ArrayList<Integer> gamesToAdd = new ArrayList<Integer>();
ArrayList<Game> games = new ArrayList<Game>();
String line = scr.nextLine();
// ------------------------------------------------------------------------------ //
// Fill list with requested ids
while(true) {
if(line.equals("FIM")) break;
gamesToAdd.add(Integer.parseInt(line));
line = scr.nextLine();
}
// ------------------------------------------------------------------------------ //
// Add requested ids to games list
try {
// Read CSV file
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
while((line = br.readLine()) != null) {
if(gamesToAdd.contains(Integer.parseInt(line.substring(0, line.indexOf(','))))) {
Game game = new Game();
game.read(line);
games.add(game);
}
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Initialize bench log
int c_compares = 0;
long t_begin = System.currentTimeMillis();
Collections.sort(games);
// Search in games list by name
line = scr.nextLine();
while(true) {
if(line.equals("FIM")) break;
// ------------------------------------ //
boolean found = false;
int low = 0;
int high = games.size() - 1;
while(low <= high) {
int mid = low + (high - low) / 2;
c_compares++;
if(games.get(mid).name.compareTo(line) == 0) {
found = true;
break;
}
else if(games.get(mid).name.compareTo(line) < 0) {
c_compares++;
low = mid + 1;
}
else {
c_compares++;
high = mid - 1;
}
}
// ------------------------------------ //
System.out.println(found ? "SIM" : "NAO");
line = scr.nextLine();
}
Arq.openWrite("753045_sequencial.txt");
Arq.print("753045\t" + (System.currentTimeMillis() - t_begin) + "ms\t" + c_compares);
Arq.close();
scr.close();
// ---------------------------------------------------------------------------------------------- //
}
// ---------------------------------------------------------------------------------------------- //
}

View File

@ -1,39 +0,0 @@
SIM
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO

View File

@ -1,91 +0,0 @@
840010
866510
1970560
411740
1509590
458520
920210
1444020
1232460
2026070
258880
295250
299500
574080
598780
1217190
257730
1807730
773670
1803150
1573070
513930
385250
261880
533300
542340
1209040
8790
8000
415150
2012500
691150
283370
249650
268870
1172510
927890
25700
281610
485610
1276850
722340
1499640
1848450
615700
744980
10180
234390
1641670
427520
FIM
Bobbi Adventure
The Test: Hypothesis Rising
Epic Cards Battle 2 (TCG)
Omensight: Definitive Edition
Gray Matter
The Legend of Bean
Armored Warfare
Void Slayer
RacetronicVR
The Amazing American Circus
Your Quest
HistoryMaker VR
WE ARE FOOTBALL
Rise of Insanity
Aragami
BONEWORKS
CAGE
Saku Saku: Love Blooms with the Cherry Blossoms
Kill The Bad Guy
Deisim
Redactem
Xuan-Yuan Sword: The Gate of Firmament
Subspace Continuum
DRAGON BALL XENOVERSE
RiotZ
Stephen's Sausage Roll
Tavern Tycoon - Dragon's Hangover
Child of Light
Heart and Seoul
Tank Destroyer
Claire
MONOLISK
Cinderella Escape 2 Revenge
Flat Heroes
The Political Machine 2016
AFFECTED: The Manor - The Complete Edition
QUAKE III: Team Arena
Woodcutter Simulator 2013
Dawn of Man
FIM

View File

@ -1,39 +0,0 @@
SIM
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
SIM
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO
NAO

View File

@ -1,739 +0,0 @@
/**
* @file Game.java
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// ----------------------------------------------------------------------------------------------------------------- //
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class GameList {
private Game[] array;
private int n;
public GameList() {}
public GameList(int size) {
array = new Game[size];
n = 0;
}
public void print() {
for(int i = 0; i < n; i++) {
System.out.print("[" + i + "] ");
array[i].print();
}
}
public void insertBegin(Game game) throws Exception {
if(n >= array.length) throw new Exception("x Insert error: Full list!");
for(int i = n; i > 0; i--) array[i] = array[i - 1];
array[0] = game;
n++;
}
public void insertEnd(Game game) throws Exception {
if(n >= array.length) throw new Exception("x Insert error: Full list");
array[n] = game;
n++;
}
public void insert(Game game, int pos) throws Exception {
if(n >= array.length || pos < 0 || pos > n) throw new Exception("x Insert error: Full list / Invalid pos");
for(int i = n; i > pos; i--) array[i] = array[i - 1];
array[pos] = game;
n++;
}
public Game removeBegin() throws Exception {
if(n == 0) throw new Exception("x Remove error: Empty list");
Game resp = array[0];
n--;
for(int i = 0; i < n; i++) array[i] = array[i + 1];
return resp;
}
public Game removeEnd() throws Exception {
if(n == 0) throw new Exception("x Remove error: Empty list");
return array[--n];
}
public Game remove(int pos) throws Exception {
if(n == 0 || pos < 0 || pos >= n) throw new Exception("x Remove error: Empty list / Invalid pos");
Game resp = array[pos];
n--;
for(int i = pos; i < n; i++) array[i] = array[i + 1];
return resp;
}
}
// ----------------------------------------------------------------------------------------------------------------- //
class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public static Game gameSearch(ArrayList<Game> games, int app_id) {
for(Game game : games) if(game.getAppId() == app_id) return game;
return null;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
public static String getGameData(String csvFile, int app_id) throws Exception {
try {
// Read CSV file
FileInputStream fstream = new FileInputStream(csvFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
String line;
while((line = br.readLine()) != null) {
String id_s = Integer.toString(app_id);
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
fstream.close();
br.close();
return line;
}
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
return null;
}
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
Scanner scr = new Scanner(System.in);
ArrayList<Game> gamesFull = new ArrayList<Game>();
String line;
// ------------------------------------------------------------------------------ //
// Fill full games list
try {
// Read CSV file
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
while((line = br.readLine()) != null) {
Game game = new Game();
game.read(line);
gamesFull.add(game);
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Fill production games list
GameList games = new GameList(500);
line = scr.nextLine();
while(true) {
if(line.compareTo("FIM") == 0) break;
// ------------------------------------ //
Game found = gameSearch(gamesFull, Integer.parseInt(line));
if(found != null) games.insertEnd(found);
// ------------------------------------ //
line = scr.nextLine();
}
// ---------------------------------------------------------------------------------------------- //
// Execute operations
int n_ops = Integer.parseInt(scr.nextLine());
for(int x = 0; x < n_ops; x++) {
line = scr.nextLine();
String op = line.substring(0, 2);
int app_id;
// -------------------------------- //
// Identify operation
if(op.equals("II")) {
app_id = Integer.parseInt(line.substring(3, line.length()));
games.insertBegin(gameSearch(gamesFull, app_id));
}
else if(op.equals("IF")) {
app_id = Integer.parseInt(line.substring(3, line.length()));
games.insertEnd(gameSearch(gamesFull, app_id));
}
else if(op.equals("I*")) {
int pos = Integer.parseInt(line.substring(3, line.indexOf(" ", 3)));
app_id = Integer.parseInt(line.substring(line.indexOf(" ", 3) + 1, line.length()));
games.insert(gameSearch(gamesFull, app_id), pos);
}
else if(op.equals("RI")) System.out.println("(R) " + games.removeBegin().getName());
else if(op.equals("RF")) System.out.println("(R) " + games.removeEnd().getName());
else if(op.equals("R*")) {
int pos = Integer.parseInt(line.substring(3, line.length()));
System.out.println("(R) " + games.remove(pos).getName());
}
}
games.print();
// ---------------------------------------------------------------------------------------------- //
scr.close();
}
// ------------------------------------------------------------------------------ //
}

View File

@ -1,72 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
20
II 1487390
II 258520
II 1165270
II 298140
II 213610
IF 50510
IF 998660
IF 1740720
I* 10 24720
I* 15 439550
I* 20 1507410
RF
RF
RF
RI
RI
R* 10
RF
RF
RI

View File

@ -1,61 +0,0 @@
(R) Have a Nice Death
(R) Sopwith VR
(R) Burn Zombie Burn!
(R) Sonic Adventure 2
(R) Rhiannon: Curse of the Four Branches
(R) Faefever
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
(R) Synthesis Universe -Episode 00-
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]

View File

@ -1,61 +0,0 @@
(R) Have a Nice Death
(R) Sopwith VR
(R) Burn Zombie Burn!
(R) Sonic Adventure 2
(R) Rhiannon: Curse of the Four Branches
(R) Faefever
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
(R) Synthesis Universe -Episode 00-
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]

View File

@ -1,669 +0,0 @@
/**
* @file Game.java
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// ----------------------------------------------------------------------------------------------------------------- //
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class GameStack {
private Game[] array;
private int last;
public GameStack() {}
public GameStack(int size) {
array = new Game[size];
last = 0;
}
public void insert(Game x) throws Exception {
if(last + 1 == array.length) throw new Exception("x Insert error: Full stack");
array[last++] = x;
}
public Game remove() throws Exception {
if(last == 0) throw new Exception("x Remove error: Empty stack");
return array[--last];
}
public void print() {
for(int i = 0; i < last; i++) {
System.out.print("[" + i + "] ");
array[i].print();
}
}
}
// ----------------------------------------------------------------------------------------------------------------- //
class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public static Game gameSearch(ArrayList<Game> games, int app_id) {
for(Game game : games) if(game.getAppId() == app_id) return game;
return null;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
// -------------------------------------------------------------------------------- //
public static String getGameData(String csvFile, int app_id) throws Exception {
try {
// Read CSV file
FileInputStream fstream = new FileInputStream(csvFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
String line;
while((line = br.readLine()) != null) {
String id_s = Integer.toString(app_id);
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
fstream.close();
br.close();
return line;
}
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
return null;
}
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
Scanner scr = new Scanner(System.in);
ArrayList<Game> gamesFull = new ArrayList<Game>();
String line;
// ------------------------------------------------------------------------------ //
// Fill full games list
try {
// Read CSV file
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
while((line = br.readLine()) != null) {
Game game = new Game();
game.read(line);
gamesFull.add(game);
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Fill production games list
GameStack games = new GameStack(500);
line = scr.nextLine();
while(true) {
if(line.compareTo("FIM") == 0) break;
// ------------------------------------ //
Game found = gameSearch(gamesFull, Integer.parseInt(line));
if(found != null) games.insert(found);
// ------------------------------------ //
line = scr.nextLine();
}
// ---------------------------------------------------------------------------------------------- //
// Execute operations
int n_ops = Integer.parseInt(scr.nextLine());
for(int x = 0; x < n_ops; x++) {
line = scr.nextLine();
// -------------------------------- //
// Identify operation
if(line.charAt(0) == 'I') games.insert(gameSearch(gamesFull, Integer.parseInt(line.substring(2, line.length()))));
else if(line.charAt(0) == 'R') System.out.println("(R) " + games.remove().getName());
}
games.print();
// ---------------------------------------------------------------------------------------------- //
scr.close();
}
// ------------------------------------------------------------------------------ //
}

View File

@ -1,72 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
20
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 439550
I 1507410
R
R
R
R
R
R
R
R
R

View File

@ -1,61 +0,0 @@
(R) Coloring Book for Kids
(R) 'n Verlore Verstand
(R) SPORE™ Galactic Adventures
(R) Have a Nice Death
(R) Sopwith VR
(R) Burn Zombie Burn!
(R) Sonic Adventure 2
(R) Rhiannon: Curse of the Four Branches
(R) Synthesis Universe -Episode 00-
[0] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
[1] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
[2] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
[3] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
[4] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
[5] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
[6] 1276550 Faefever Jul/2020 50000 - 100000 0 0.00 0 [English] null true false false 88% null Monkey Wizard Entertainment [Adventure, Casual, Free to Play, Indie]
[7] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
[8] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
[9] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
[10] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
[11] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
[12] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
[13] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
[14] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
[15] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
[16] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
[17] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
[18] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
[19] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
[20] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
[21] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
[22] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
[23] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
[24] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
[25] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
[26] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
[27] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
[28] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
[29] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
[30] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
[31] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
[32] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
[33] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
[34] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
[35] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
[36] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
[37] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
[38] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
[39] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
[40] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
[41] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
[42] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
[43] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
[44] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
[45] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
[46] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
[47] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
[48] 410890 Higurashi When They Cry Hou - Ch.2 Watanagashi Nov/2015 50000 - 100000 0 3.99 0 [English, Japanese] http://www.mangagamer.org/07thExpansion/ true true true 97% 5h 11m 07th Expansion [Adventure]
[49] 363110 NOBUNAGA'S AMBITION: Tendou with Power Up Kit Jun/2015 50000 - 100000 0 54.99 0 [Japanese] http://www.gamecity.ne.jp/steam/tendo.html true false false 77% null KOEI TECMO GAMES CO., LTD. [Strategy]
[50] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified ChiWnese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
[51] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]

View File

@ -1,61 +0,0 @@
(R) Coloring Book for Kids
(R) 'n Verlore Verstand
(R) SPORE™ Galactic Adventures
(R) Have a Nice Death
(R) Sopwith VR
(R) Burn Zombie Burn!
(R) Sonic Adventure 2
(R) Rhiannon: Curse of the Four Branches
(R) Synthesis Universe -Episode 00-
[0] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
[1] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
[2] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
[3] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
[4] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
[5] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
[6] 1276550 Faefever Jul/2020 50000 - 100000 0 0.00 0 [English] null true false false 88% null Monkey Wizard Entertainment [Adventure, Casual, Free to Play, Indie]
[7] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
[8] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
[9] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
[10] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
[11] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
[12] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
[13] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
[14] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
[15] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
[16] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
[17] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
[18] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
[19] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
[20] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
[21] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
[22] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
[23] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
[24] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
[25] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
[26] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
[27] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
[28] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
[29] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
[30] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
[31] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
[32] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
[33] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
[34] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
[35] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
[36] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
[37] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
[38] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
[39] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
[40] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
[41] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
[42] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
[43] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
[44] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
[45] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
[46] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
[47] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
[48] 410890 Higurashi When They Cry Hou - Ch.2 Watanagashi Nov/2015 50000 - 100000 0 3.99 0 [English, Japanese] http://www.mangagamer.org/07thExpansion/ true true true 97% 5h 11m 07th Expansion [Adventure]
[49] 363110 NOBUNAGA'S AMBITION: Tendou with Power Up Kit Jun/2015 50000 - 100000 0 54.99 0 [Japanese] http://www.gamecity.ne.jp/steam/tendo.html true false false 77% null KOEI TECMO GAMES CO., LTD. [Strategy]
[50] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
[51] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]

View File

@ -1,714 +0,0 @@
/**
* @file Game.java
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// ----------------------------------------------------------------------------------------------------------------- //
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Scanner;
// ----------------------------------------------------------------------------------------------------------------- //
class GameQueue {
private Game[] array;
private int first;
private int last;
public GameQueue() {}
public GameQueue(int size) {
array = new Game[size + 1];
first = last = 0;
}
public void insert(Game movie) throws Exception {
if(((last + 1) % array.length) == first) throw new Exception("x Insert error: Full queue");
array[last] = movie;
last = (last + 1) % array.length;
}
public Game remove() throws Exception {
if(first == last) throw new Exception("x Remove error: Empty queue");
Game resp = array[first];
first = (first + 1) % array.length;
return resp;
}
public void print() {
int c = 0;
for(int i = first; i != last; i = ((i + 1) % array.length), c++) {
System.out.print("[" + ((last - first) == 1 ? "0" : c) + "] ");
array[i].print();
}
}
public int length() { return last - first; }
}
// ----------------------------------------------------------------------------------------------------------------- //
class Game {
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
private String name, owners, website, developers;
private ArrayList<String> languages, genres;
private Date release_date;
private int app_id, age, dlcs, avg_playtime;
private float price, upvotes;
private boolean windows, mac, linux;
public Game() {
this.name = this.owners = this.website = this.developers = null;
this.languages = new ArrayList<String>();
this.genres = new ArrayList<String>();
this.release_date = null;
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
this.price = this.upvotes = -1;
this.windows = this.mac = this.linux = false;
}
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
this.name = name;
this.owners = owners;
this.website = website;
this.developers = developers;
this.languages = languages;
this.genres = genres;
this.release_date = release_date;
this.app_id = app_id;
this.age = age;
this.dlcs = dlcs;
this.upvotes = upvotes;
this.avg_playtime = avg_playtime;
this.price = price;
this.windows = windows;
this.mac = mac;
this.linux = linux;
}
public void setName(String name) { this.name = name; }
public void setOwners(String owners) { this.owners = owners; }
public void setWebsite(String website) { this.website = website; }
public void setDevelopers(String developers) { this.developers = developers; }
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
public void setAppId(int app_id) { this.app_id = app_id; }
public void setAge(int age) { this.age = age; }
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
public void setPrice(float price) { this.price = price; }
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
public void setWindows(boolean windows) { this.windows = windows; }
public void setMac(boolean mac) { this.mac = mac; }
public void setLinux(boolean linux) { this.linux = linux; }
public String getName() { return this.name; }
public String getOwners() { return this.owners; }
public String getWebsite() { return this.website; }
public String getDevelopers() { return this.developers; }
public ArrayList<String> getLanguages() { return this.languages; }
public ArrayList<String> getGenres() { return this.genres; }
public Date getReleaseDate() { return this.release_date; }
public int getAppId() { return this.app_id; }
public int getAge() { return this.age; }
public int getDlcs() { return this.dlcs; }
public int getAvgPlaytime() { return this.avg_playtime; }
public float getPrice() { return this.price; }
public float getUpvotes() { return this.upvotes; }
public boolean getWindows() { return this.windows; }
public boolean getMac() { return this.mac; }
public boolean getLinux() { return this.linux; }
public Game clone() {
Game cloned = new Game();
cloned.name = this.name;
cloned.owners = this.owners;
cloned.website = this.website;
cloned.developers = this.developers;
cloned.languages = this.languages;
cloned.genres = this.genres;
cloned.release_date = this.release_date;
cloned.app_id = this.app_id;
cloned.age = this.age;
cloned.dlcs = this.dlcs;
cloned.avg_playtime = this.avg_playtime;
cloned.price = this.price;
cloned.upvotes = this.upvotes;
cloned.windows = this.windows;
cloned.mac = this.mac;
cloned.linux = this.linux;
return cloned;
}
public static Game gameSearch(ArrayList<Game> games, int app_id) {
for(Game game : games) if(game.getAppId() == app_id) return game;
return null;
}
public void read(String line) {
char c_search;
int index = 0, atr_index = 0;
// ---------------------------------- //
// Find "AppID"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.app_id = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Name"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.name = line.substring(atr_index, index);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find release date
if(line.charAt(atr_index) != ',') {
SimpleDateFormat df;
if(line.charAt(atr_index) == '\"') {
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
atr_index++;
c_search = '\"';
}
else {
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
c_search = ',';
}
while(true) {
index++;
if(line.charAt(index) == c_search) {
try { this.release_date = df.parse(line.substring(atr_index, index)); }
catch (java.text.ParseException e) { e.printStackTrace(); }
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Owners"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.owners = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Age"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.age = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Price"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.price = Float.parseFloat(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "DLCs"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Languages"
while(true) {
index++;
if(line.charAt(index) == ']') {
index++;
if(line.charAt(index) == ',') index++;
else if(line.charAt(index) == '\"') index += 2;
atr_index = index;
break;
}
else if(line.charAt(index) == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line.charAt(index) == '\'') {
this.languages.add(line.substring(wordStart, index));
break;
}
}
}
}
// ---------------------------------- //
// Find "Website"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.website = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Windows"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line.charAt(index) == ',') {
positives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line.charAt(index) == ',') {
negatives = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ---------------------------------- //
// Find "AVG Playtime"
while(true) {
index++;
if(line.charAt(index) == ',') {
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
atr_index = ++index;
break;
}
}
// ---------------------------------- //
// Find "Developers"
if(line.charAt(atr_index) != ',') {
if(line.charAt(atr_index) == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line.charAt(index) == c_search) {
this.developers = line.substring(atr_index, index);
atr_index = ++index;
break;
}
}
}
else atr_index = ++index;
// ---------------------------------- //
// Find "Genres"
if(index < line.length() - 1) {
if(line.charAt(index) == ',') atr_index = ++index;
if(line.charAt(atr_index) == '\"') {
atr_index++;
while(true) {
index++;
if(line.charAt(index) == ',') {
this.genres.add(line.substring(atr_index, index));
atr_index = ++index;
}
else if(line.charAt(index) == '\"') {
this.genres.add(line.substring(atr_index, line.length() - 1));
break;
}
}
}
else this.genres.add(line.substring(atr_index, line.length()));
}
// -------------------------------------------------------------------------------- //
}
public void print() {
String avg_pt = null;
if(this.avg_playtime == 0) avg_pt = "null ";
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
else {
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
}
DecimalFormat df = new DecimalFormat("##");
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
}
// -------------------------------------------------------------------------------- //
public static String getGameData(String csvFile, int app_id) throws Exception {
try {
// Read CSV file
FileInputStream fstream = new FileInputStream(csvFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
String line;
while((line = br.readLine()) != null) {
String id_s = Integer.toString(app_id);
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
fstream.close();
br.close();
return line;
}
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
return null;
}
// -------------------------------------------------------------------------------------- //
public static void main(String[] args) throws Exception {
Scanner scr = new Scanner(System.in);
ArrayList<Game> gamesFull = new ArrayList<Game>();
String line;
// ------------------------------------------------------------------------------ //
// Fill full games list
try {
// Read CSV file
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// ------------------------------------ //
// Start to explode CSV file
while((line = br.readLine()) != null) {
Game game = new Game();
game.read(line);
gamesFull.add(game);
}
// Close CSV file
fstream.close();
}
catch(IOException e) { e.printStackTrace(); }
// ---------------------------------------------------------------------------------------------- //
// Fill production games list
GameQueue games = new GameQueue(5);
float total_avgPt = 0, c = 0;
line = scr.nextLine();
while(true) {
if(line.compareTo("FIM") == 0) break;
// ------------------------------------ //
Game found = gameSearch(gamesFull, Integer.parseInt(line));
if(found != null) {
try { games.insert(found); }
catch(java.lang.Exception e) {
total_avgPt -= games.remove().getAvgPlaytime();
c--;
games.insert(found);
}
// Print playtime avg
total_avgPt += found.getAvgPlaytime();
System.out.println(Math.round(total_avgPt / ++c));
}
// ------------------------------------ //
line = scr.nextLine();
}
// ---------------------------------------------------------------------------------------------- //
// Execute operations
int n_ops = Integer.parseInt(scr.nextLine());
for(int x = 0; x < n_ops; x++) {
line = scr.nextLine();
// -------------------------------- //
System.out.println(line);
// Identify operation
if(line.charAt(0) == 'I') {
Game found = gameSearch(gamesFull, Integer.parseInt(line.substring(2, line.length())));
try { games.insert(found); }
catch(java.lang.Exception e) {
total_avgPt -= games.remove().getAvgPlaytime();
c--;
games.insert(found);
}
// Print playtime avg
total_avgPt += found.getAvgPlaytime();
System.out.println(Math.round(total_avgPt / ++c));
}
else if(line.charAt(0) == 'R') System.out.println("(R) " + games.remove().getName());
}
games.print();
// ---------------------------------------------------------------------------------------------- //
scr.close();
}
// ------------------------------------------------------------------------------ //
}

View File

@ -1,67 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
15
I 1487390
I 258520
I 1165270
I 298140
I 213610
I 50510
I 998660
I 1740720
I 24720
I 439550
I 1507410
R
R
R
R

View File

@ -1,81 +0,0 @@
2019
1460
978
809
647
284
104
556
833
1165
1125
1132
677
388
55
70
63
103
55
55
94
133
93
93
114
75
90
6187
6324
6358
6346
6292
196
59
57
54
401
407
476
450
503
246
381
312
323
271
300
199
261
223
I 1487390
341
I 258520
259
I 1165270
219
I 298140
160
I 213610
272
I 50510
158
I 998660
120
I 1740720
188
I 24720
371
I 439550
287
I 1507410
282
R
(R) Sopwith VR
R
(R) Have a Nice Death
R
(R) SPORE™ Galactic Adventures
R
(R) 'n Verlore Verstand
[0] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]

View File

@ -1,81 +0,0 @@
2019
1460
978
809
647
284
104
556
833
1165
1125
1132
677
388
55
70
63
103
55
55
94
133
93
93
114
75
90
6187
6324
6358
6346
6292
196
59
57
54
401
407
476
450
503
246
381
312
323
271
300
199
261
223
I 1487390
341
I 258520
259
I 1165270
219
I 298140
160
I 213610
272
I 50510
158
I 998660
120
I 1740720
188
I 24720
371
I 439550
287
I 1507410
282
R
(R) Sopwith VR
R
(R) Have a Nice Death
R
(R) SPORE™ Galactic Adventures
R
(R) 'n Verlore Verstand
[0] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]

View File

@ -1,869 +0,0 @@
/**
* @file Linux_Game.c
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// -------------------------------------------------------------------------------- //
// Includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
// -------------------------------------------------------------------------------- //
// Definitions
#define MAX_GAMES 500
#define MAX_FIELD_SIZE 250
#define MAX_STRING_ARRAY_SIZE 100
// -------------------------------------------------------------------------------- //
// Structs
typedef struct {
int year,
month;
} Date;
typedef struct {
char name[MAX_FIELD_SIZE],
owners[MAX_FIELD_SIZE],
website[MAX_FIELD_SIZE],
developers[MAX_FIELD_SIZE],
languages[MAX_STRING_ARRAY_SIZE][30],
genres[MAX_STRING_ARRAY_SIZE][30];
Date release_date;
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
float price, upvotes;
bool windows_os, mac_os, linux_os;
} Game;
// -------------------------------------------------------------------------------- //
// Global variables
Game games[MAX_GAMES];
int n = 0;
Game gamesFull[5000];
int x = 0;
// -------------------------------------------------------------------------------- //
// Functions
bool isFim(char* s) { return s[0] == 'F' && s[1] == 'I' && s[2] == 'M'; }
void substring(char *string, char *string_start, int length) {
strncpy(string, string_start, length);
string[length] = '\0';
}
char *getMonthName(int month) {
switch(month) {
case 1: return "Jan"; break;
case 2: return "Feb"; break;
case 3: return "Mar"; break;
case 4: return "Apr"; break;
case 5: return "May"; break;
case 6: return "Jun"; break;
case 7: return "Jul"; break;
case 8: return "Aug"; break;
case 9: return "Sep"; break;
case 10: return "Oct"; break;
case 11: return "Nov"; break;
case 12: return "Dec"; break;
default: return "N/A"; break;
}
}
int getMonthNumber(char* month) {
if(!strcmp(month, "Jan")) return 1;
else if(!strcmp(month, "Feb")) return 2;
else if(!strcmp(month, "Mar")) return 3;
else if(!strcmp(month, "Apr")) return 4;
else if(!strcmp(month, "May")) return 5;
else if(!strcmp(month, "Jun")) return 6;
else if(!strcmp(month, "Jul")) return 7;
else if(!strcmp(month, "Aug")) return 8;
else if(!strcmp(month, "Sep")) return 9;
else if(!strcmp(month, "Oct")) return 10;
else if(!strcmp(month, "Nov")) return 11;
else if(!strcmp(month, "Dec")) return 12;
}
// -------------------------------------------------------------------------------- //
// Class game functions
void game_start(Game *game) {
strcpy(game -> name, "");
strcpy(game -> owners, "");
strcpy(game -> website, "");
strcpy(game -> developers, "");
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
strcpy(game -> languages[i], "");
strcpy(game -> genres[i], "");
}
game -> release_date.month = -1;
game -> release_date.year = -1;
game -> app_id = -1;
game -> age = -1;
game -> dlcs = -1;
game -> avg_playtime = -1;
game -> price = -1;
game -> upvotes = -1;
game -> windows_os = false;
game -> mac_os = false;
game -> linux_os = false;
game -> count_languages = 0;
game -> count_genres = 0;
}
void game_print(Game *game) {
int hours = game -> avg_playtime / 60,
minutes = game -> avg_playtime % 60;
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
for(int i = 0; i < game -> count_languages; i++) {
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
}
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
if(isnan(game -> upvotes)) printf("0.0%% ");
else printf("%.0f%% ", game -> upvotes);
if(hours > 0)
{
printf("%ih ", hours);
if(minutes > 0) printf("%im ", minutes);
}
else {
if(minutes > 0) printf("%im ", minutes);
else printf("null ");
}
printf("%s [", game -> developers);
for(int i = 0; i < game -> count_genres; i++) {
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
}
printf("]\n");
}
Game game_clone(Game *game) {
Game cloned;
strcpy(cloned.name, game -> name);
strcpy(cloned.owners, game -> owners);
strcpy(cloned.website, game -> website);
strcpy(cloned.developers, game -> developers);
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
cloned.release_date.month = game -> release_date.month;
cloned.release_date.year = game -> release_date.year;
cloned.app_id = game -> app_id;
cloned.age = game -> age;
cloned.dlcs = game -> dlcs;
cloned.avg_playtime = game -> avg_playtime;
cloned.price = game -> price;
cloned.upvotes = game -> upvotes;
cloned.windows_os = game -> windows_os;
cloned.mac_os = game -> mac_os;
cloned.linux_os = game -> linux_os;
return cloned;
}
void game_read(Game *game, char *line) {
char c_search, sub[MAX_FIELD_SIZE];
int index = 0, atr_index = 0;
// ------------------------------------------------------------ //
// Find "AppID"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> app_id = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Name"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> name, sub);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else {
strcpy(game -> name, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find release date
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
char subDate[10];
substring(subDate, &sub[0], 3);
game -> release_date.month = getMonthNumber(subDate);
if(c_search == ',') {
substring(subDate, &sub[4], 4);
game -> release_date.year = atoi(subDate);
index++;
}
else if(c_search == '\"') {
int nmbSpace = 0;
for(int i = 0; ; i++) {
if(sub[i] == ' ') nmbSpace++;
if(nmbSpace == 2) {
i++;
substring(subDate, &sub[i], 4);
game -> release_date.year = atoi(subDate);
break;
}
}
index += 2;
}
atr_index = index;
break;
}
}
}
else {
game -> release_date.month = 0;
game -> release_date.year = 0;
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Owners"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> owners, sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Age"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> age = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Price"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> price = atof(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "DLCs"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> dlcs = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Languages"
while(true) {
index++;
if(line[index] == ']') {
index++;
if(line[index] == ',') index++;
else if(line[index] == '\"') index += 2;
atr_index = index;
break;
}
else if(line[index] == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line[index] == '\'') {
substring(sub, &line[wordStart], index - wordStart);
strcpy(game -> languages[game -> count_languages++], sub);
break;
}
}
}
}
// ------------------------------------------------------------ //
// Find "Website"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> website, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> website, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Windows"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> windows_os = true;
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> mac_os = true;
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> linux_os = true;
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
positives = atoi(sub);
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
negatives = atoi(sub);
atr_index = ++index;
break;
}
}
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ------------------------------------------------------------ //
// Find "AVG Playtime"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> avg_playtime = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Developers"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> developers, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> developers, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Genres"
if(index < strlen(line) - 1) {
if(line[index] == ',') atr_index = ++index;
if(line[atr_index] == '\"') {
atr_index++;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
atr_index = ++index;
}
else if(line[index] == '\"') {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
strcpy(game -> genres[game -> count_genres++], sub);
break;
}
}
}
else {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
sub[strlen(line) - 2 - atr_index] = '\0';
strcpy(game -> genres[game -> count_genres++], sub);
}
}
}
// -------------------------------------------------------------------------------- //
// Functions - List
void list_insertBegin(Game x) {
if(n >= MAX_GAMES) {
printf("Insert error: MAX_GAMES reached");
exit(1);
}
for(int i = n; i > 0; i--) games[i] = games[i - 1];
games[0] = x;
n++;
}
void list_insertEnd(Game x) {
if(n >= MAX_GAMES) {
printf("Insert error: MAX_GAMES reached");
exit(1);
}
games[n++] = x;
}
void list_insert(Game x, int pos) {
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
printf("Insert error: %s", n >= MAX_GAMES ? "MAX_GAMES reached" : "Invalid position");
exit(1);
}
for(int i = n; i > pos; i--) games[i] = games[i-1];
games[pos] = x;
n++;
}
Game list_removeBegin() {
Game resp;
if(n == 0) {
printf("Remove error: Empty list");
exit(1);
}
resp = games[0];
n--;
for(int i = 0; i < n; i++) games[i] = games[i + 1];
return resp;
}
Game list_removeEnd() {
if(n == 0) {
printf("Remove error: Empty list");
exit(1);
}
return games[--n];
}
Game list_remove(int pos) {
Game resp;
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
printf("Insert error: %s!", n == 0 ? "Empty list" : "Invalid position");
exit(1);
}
resp = games[pos];
n--;
for(int i = pos; i < n; i++) games[i] = games[i+1];
return resp;
}
void list_print() {
for(int i = 0; i < n; i++) {
printf("[%i] ", i);
game_print(&games[i]);
}
}
Game game_search(int app_id) {
for(int i = 0; i < x; i++) {
if(gamesFull[i].app_id == app_id) return gamesFull[i];
}
Game game;
game.app_id = -1;
return game;
}
// ---------------------------------------------------------------------------------------------------------- //
int main() {
// ---------------------------------------------------------------------------------------- //
// Fill full games list
FILE *fp;
char *line = NULL;
size_t len = 0;
size_t read;
fp = fopen("/tmp/games.csv", "r");
if(fp == NULL) exit(EXIT_FAILURE);
// -------------------------------------- //
while((read = getline(&line, &len, fp)) != -1) {
Game game;
game_start(&game);
game_read(&game, line);
gamesFull[x++] = game;
}
fclose(fp);
if(line) free(line);
// ---------------------------------------------------------------------------------------- //
char line_in[100];
// Fill production games list
scanf(" %[^\n]", line_in);
while(true) {
if(isFim(line_in)) break;
// -------------------------- //
int app_id = atoi(line_in);
Game found = game_search(app_id);
if(found.app_id != -1) list_insertEnd(found);
// -------------------------- //
scanf(" %[^\n]", line_in);
}
// ---------------------------------------------------------------------------------------- //
// Execute operations
int n_ops;
scanf("%i", &n_ops);
for(int i = 0; i < n_ops; i++) {
scanf(" %[^\n]", line_in);
Game game;
char params[10];
if(line_in[0] == 'I') {
substring(params, &line_in[3], strlen(line_in) - 3);
if(line_in[1] == 'I') list_insertBegin(game_search(atoi(params)));
else if(line_in[1] == 'F') list_insertEnd(game_search(atoi(params)));
else if(line_in[1] == '*') {
char appId[10], pos[10];
int i = 0;
while(true) {
if(params[i] == ' ') {
substring(pos, &params[0], i);
substring(appId, &params[i + 1], strlen(params) - i - 1);
break;
}
else i++;
}
list_insert(game_search(atoi(appId)), atoi(pos));
}
}
else if(line_in[0] == 'R') {
if(line_in[1] == 'I') printf("(R) %s\n", list_removeBegin().name);
else if(line_in[1] == 'F') printf("(R) %s\n", list_removeEnd().name);
else if(line_in[1] == '*') {
substring(params, &line_in[3], strlen(line_in) - 3);
printf("(R) %s\n", list_remove(atoi(params)).name);
}
}
}
list_print();
return EXIT_SUCCESS;
}

View File

@ -1,868 +0,0 @@
/**
* @file WSL_Game.c
* @author Pedro Lopes
* @version 1.0
* @date 2022-10-17
* @copyright Copyright (c) 2022
**/
// -------------------------------------------------------------------------------- //
// Includes
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
// -------------------------------------------------------------------------------- //
// Definitions
#define MAX_GAMES 500
#define MAX_FIELD_SIZE 250
#define MAX_STRING_ARRAY_SIZE 100
// -------------------------------------------------------------------------------- //
// Structs
typedef struct {
int year,
month;
} Date;
typedef struct {
char name[MAX_FIELD_SIZE],
owners[MAX_FIELD_SIZE],
website[MAX_FIELD_SIZE],
developers[MAX_FIELD_SIZE],
languages[MAX_STRING_ARRAY_SIZE][30],
genres[MAX_STRING_ARRAY_SIZE][30];
Date release_date;
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
float price, upvotes;
bool windows_os, mac_os, linux_os;
} Game;
// -------------------------------------------------------------------------------- //
// Global variables
Game games[MAX_GAMES];
int n = 0;
Game gamesFull[5000];
int x = 0;
// -------------------------------------------------------------------------------- //
// Functions
bool isFim(char* s) { return s[0] == 'F' && s[1] == 'I' && s[2] == 'M'; }
void substring(char *string, char *string_start, int length) {
strncpy(string, string_start, length);
string[length] = '\0';
}
char *getMonthName(int month) {
switch(month) {
case 1: return "Jan"; break;
case 2: return "Feb"; break;
case 3: return "Mar"; break;
case 4: return "Apr"; break;
case 5: return "May"; break;
case 6: return "Jun"; break;
case 7: return "Jul"; break;
case 8: return "Aug"; break;
case 9: return "Sep"; break;
case 10: return "Oct"; break;
case 11: return "Nov"; break;
case 12: return "Dec"; break;
default: return "N/A"; break;
}
}
int getMonthNumber(char* month) {
if(!strcmp(month, "Jan")) return 1;
else if(!strcmp(month, "Feb")) return 2;
else if(!strcmp(month, "Mar")) return 3;
else if(!strcmp(month, "Apr")) return 4;
else if(!strcmp(month, "May")) return 5;
else if(!strcmp(month, "Jun")) return 6;
else if(!strcmp(month, "Jul")) return 7;
else if(!strcmp(month, "Aug")) return 8;
else if(!strcmp(month, "Sep")) return 9;
else if(!strcmp(month, "Oct")) return 10;
else if(!strcmp(month, "Nov")) return 11;
else if(!strcmp(month, "Dec")) return 12;
}
// -------------------------------------------------------------------------------- //
// Class game functions
void game_start(Game *game) {
strcpy(game -> name, "");
strcpy(game -> owners, "");
strcpy(game -> website, "");
strcpy(game -> developers, "");
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
strcpy(game -> languages[i], "");
strcpy(game -> genres[i], "");
}
game -> release_date.month = -1;
game -> release_date.year = -1;
game -> app_id = -1;
game -> age = -1;
game -> dlcs = -1;
game -> avg_playtime = -1;
game -> price = -1;
game -> upvotes = -1;
game -> windows_os = false;
game -> mac_os = false;
game -> linux_os = false;
game -> count_languages = 0;
game -> count_genres = 0;
}
void game_print(Game *game) {
int hours = game -> avg_playtime / 60,
minutes = game -> avg_playtime % 60;
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
for(int i = 0; i < game -> count_languages; i++) {
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
}
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
if(isnan(game -> upvotes)) printf("0.0%% ");
else printf("%.0f%% ", game -> upvotes);
if(hours > 0)
{
printf("%ih ", hours);
if(minutes > 0) printf("%im ", minutes);
}
else {
if(minutes > 0) printf("%im ", minutes);
else printf("null ");
}
printf("%s [", game -> developers);
for(int i = 0; i < game -> count_genres; i++) {
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
}
printf("]\n");
}
Game game_clone(Game *game) {
Game cloned;
strcpy(cloned.name, game -> name);
strcpy(cloned.owners, game -> owners);
strcpy(cloned.website, game -> website);
strcpy(cloned.developers, game -> developers);
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
cloned.release_date.month = game -> release_date.month;
cloned.release_date.year = game -> release_date.year;
cloned.app_id = game -> app_id;
cloned.age = game -> age;
cloned.dlcs = game -> dlcs;
cloned.avg_playtime = game -> avg_playtime;
cloned.price = game -> price;
cloned.upvotes = game -> upvotes;
cloned.windows_os = game -> windows_os;
cloned.mac_os = game -> mac_os;
cloned.linux_os = game -> linux_os;
return cloned;
}
void game_read(Game *game, char *line) {
char c_search, sub[MAX_FIELD_SIZE];
int index = 0, atr_index = 0;
// ------------------------------------------------------------ //
// Find "AppID"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> app_id = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Name"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> name, sub);
if(c_search == ',') index++;
else if(c_search == '\"') index += 2;
atr_index = index;
break;
}
}
}
else {
strcpy(game -> name, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find release date
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
char subDate[10];
substring(subDate, &sub[0], 3);
game -> release_date.month = getMonthNumber(subDate);
if(c_search == ',') {
substring(subDate, &sub[4], 4);
game -> release_date.year = atoi(subDate);
index++;
}
else if(c_search == '\"') {
int nmbSpace = 0;
for(int i = 0; ; i++) {
if(sub[i] == ' ') nmbSpace++;
if(nmbSpace == 2) {
i++;
substring(subDate, &sub[i], 4);
game -> release_date.year = atoi(subDate);
break;
}
}
index += 2;
}
atr_index = index;
break;
}
}
}
else {
game -> release_date.month = 0;
game -> release_date.year = 0;
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Owners"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> owners, sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Age"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> age = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Price"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> price = atof(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "DLCs"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> dlcs = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Languages"
while(true) {
index++;
if(line[index] == ']') {
index++;
if(line[index] == ',') index++;
else if(line[index] == '\"') index += 2;
atr_index = index;
break;
}
else if(line[index] == '\'') {
int wordStart = index + 1;
while(true) {
index++;
if(line[index] == '\'') {
substring(sub, &line[wordStart], index - wordStart);
strcpy(game -> languages[game -> count_languages++], sub);
break;
}
}
}
}
// ------------------------------------------------------------ //
// Find "Website"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> website, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> website, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Windows"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> windows_os = true;
atr_index = ++index;
break;
}
}
// Find "Mac"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> mac_os = true;
atr_index = ++index;
break;
}
}
// Find "Linux"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
if(!strcmp(sub, "True")) game -> linux_os = true;
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Upvotes"
int positives, negatives;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
positives = atoi(sub);
atr_index = ++index;
break;
}
}
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
negatives = atoi(sub);
atr_index = ++index;
break;
}
}
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
// ------------------------------------------------------------ //
// Find "AVG Playtime"
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
game -> avg_playtime = atoi(sub);
atr_index = ++index;
break;
}
}
// ------------------------------------------------------------ //
// Find "Developers"
if(line[atr_index] != ',') {
if(line[atr_index] == '\"') {
atr_index++;
c_search = '\"';
}
else c_search = ',';
while(true) {
index++;
if(line[index] == c_search) {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> developers, sub);
atr_index = ++index;
break;
}
}
}
else {
strcpy(game -> developers, "null");
atr_index = ++index;
}
// ------------------------------------------------------------ //
// Find "Genres"
if(index < strlen(line) - 1) {
if(line[index] == ',') atr_index = ++index;
if(line[atr_index] == '\"') {
atr_index++;
while(true) {
index++;
if(line[index] == ',') {
substring(sub, &line[atr_index], index - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
atr_index = ++index;
}
else if(line[index] == '\"') {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0';
else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
strcpy(game -> genres[game -> count_genres++], sub);
break;
}
}
}
else {
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
strcpy(game -> genres[game -> count_genres++], sub);
}
}
}
// -------------------------------------------------------------------------------- //
// Functions - List
void list_insertBegin(Game x) {
if(n >= MAX_GAMES) {
printf("Insert error: MAX_GAMES reached");
exit(1);
}
for(int i = n; i > 0; i--) games[i] = games[i - 1];
games[0] = x;
n++;
}
void list_insertEnd(Game x) {
if(n >= MAX_GAMES) {
printf("Insert error: MAX_GAMES reached");
exit(1);
}
games[n++] = x;
}
void list_insert(Game x, int pos) {
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
printf("Insert error: %s", n >= MAX_GAMES ? "MAX_GAMES reached" : "Invalid position");
exit(1);
}
for(int i = n; i > pos; i--) games[i] = games[i-1];
games[pos] = x;
n++;
}
Game list_removeBegin() {
Game resp;
if(n == 0) {
printf("Remove error: Empty list");
exit(1);
}
resp = games[0];
n--;
for(int i = 0; i < n; i++) games[i] = games[i + 1];
return resp;
}
Game list_removeEnd() {
if(n == 0) {
printf("Remove error: Empty list");
exit(1);
}
return games[--n];
}
Game list_remove(int pos) {
Game resp;
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
printf("Insert error: %s!", n == 0 ? "Empty list" : "Invalid position");
exit(1);
}
resp = games[pos];
n--;
for(int i = pos; i < n; i++) games[i] = games[i+1];
return resp;
}
void list_print() {
for(int i = 0; i < n; i++) {
printf("[%i] ", i);
game_print(&games[i]);
}
}
Game game_search(int app_id) {
for(int i = 0; i < x; i++) {
if(gamesFull[i].app_id == app_id) return gamesFull[i];
}
Game game;
game.app_id = -1;
return game;
}
// ---------------------------------------------------------------------------------------------------------- //
int main() {
// ---------------------------------------------------------------------------------------- //
// Fill full games list
FILE *fp;
char *line = NULL;
size_t len = 0;
size_t read;
fp = fopen("/tmp/games.csv", "r");
if(fp == NULL) exit(EXIT_FAILURE);
// -------------------------------------- //
while((read = getline(&line, &len, fp)) != -1) {
Game game;
game_start(&game);
game_read(&game, line);
gamesFull[x++] = game;
}
fclose(fp);
if(line) free(line);
// ---------------------------------------------------------------------------------------- //
char line_in[100];
// Fill production games list
scanf(" %[^\n]", line_in);
while(true) {
if(isFim(line_in)) break;
// -------------------------- //
int app_id = atoi(line_in);
Game found = game_search(app_id);
if(found.app_id != -1) list_insertEnd(found);
// -------------------------- //
scanf(" %[^\n]", line_in);
}
// ---------------------------------------------------------------------------------------- //
// Execute operations
int n_ops;
scanf("%i", &n_ops);
for(int i = 0; i < n_ops; i++) {
scanf(" %[^\n]", line_in);
Game game;
char params[10];
if(line_in[0] == 'I') {
substring(params, &line_in[3], strlen(line_in) - 3);
if(line_in[1] == 'I') list_insertBegin(game_search(atoi(params)));
else if(line_in[1] == 'F') list_insertEnd(game_search(atoi(params)));
else if(line_in[1] == '*') {
char appId[10], pos[10];
int i = 0;
while(true) {
if(params[i] == ' ') {
substring(pos, &params[0], i);
substring(appId, &params[i + 1], strlen(params) - i - 1);
break;
}
else i++;
}
list_insert(game_search(atoi(appId)), atoi(pos));
}
}
else if(line_in[0] == 'R') {
if(line_in[1] == 'I') printf("(R) %s\n", list_removeBegin().name);
else if(line_in[1] == 'F') printf("(R) %s\n", list_removeEnd().name);
else if(line_in[1] == '*') {
substring(params, &line_in[3], strlen(line_in) - 3);
printf("(R) %s\n", list_remove(atoi(params)).name);
}
}
}
list_print();
return EXIT_SUCCESS;
}

View File

@ -1,72 +0,0 @@
1189490
300550
49800
1851280
1112930
275570
1276550
1096530
690510
1504570
1369470
270130
336150
573210
886470
1368820
951530
247370
1879330
1634290
259570
941650
768450
1347140
722670
711540
450170
730
598550
614090
809440
1923860
559010
1547380
554310
1124090
292120
691930
325420
663670
503820
49600
49300
1631930
1038740
336760
64000
487580
410890
363110
FIM
20
II 1487390
II 258520
II 1165270
II 298140
II 213610
IF 50510
IF 998660
IF 1740720
I* 10 24720
I* 15 439550
I* 20 1507410
RF
RF
RF
RI
RI
R* 10
RF
RF
RI

View File

@ -1,61 +0,0 @@
(R) Have a Nice Death
(R) Sopwith VR
(R) Burn Zombie Burn!
(R) Sonic Adventure 2
(R) Rhiannon: Curse of the Four Branches
(R) Faefever
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
(R) Synthesis Universe -Episode 00-
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]

View File

@ -1,61 +0,0 @@
(R) Have a Nice Death
(R) Sopwith VR
(R) Burn Zombie Burn!
(R) Sonic Adventure 2
(R) Rhiannon: Curse of the Four Branches
(R) Faefever
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
(R) Synthesis Universe -Episode 00-
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]