QuickGUI box selection fix
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
d8bb3d6dd9
commit
c293288908
@ -1,265 +1,312 @@
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include "pixelGameEngine.h"
|
||||
#include "olcPGEX_QuickGUI.h"
|
||||
#include <set>
|
||||
|
||||
std::string slurp(std::ifstream& in) {
|
||||
std::ostringstream sstr;
|
||||
sstr << in.rdbuf();
|
||||
return sstr.str();
|
||||
}
|
||||
using namespace olc;
|
||||
|
||||
struct ScoreData{
|
||||
int difficulty=0;
|
||||
std::string song;
|
||||
int totalEX=0;
|
||||
int ex1=0,ex2=0,ex3=0;
|
||||
std::string str()const{
|
||||
return "["+std::to_string(difficulty)+"] "+song+": "+std::to_string(totalEX)+" total, "+" EX1: "+std::to_string(ex1)+" EX2: "+std::to_string(ex2)+" EX3: "+std::to_string(ex3);
|
||||
// Override base class with your custom functionality
|
||||
class ChampionsLeaguePointSolver : public olc::PixelGameEngine
|
||||
{
|
||||
std::string slurp(std::ifstream& in) {
|
||||
std::ostringstream sstr;
|
||||
sstr << in.rdbuf();
|
||||
return sstr.str();
|
||||
}
|
||||
friend std::ostream&operator<<(std::ostream&os,const ScoreData&data){
|
||||
os<<data.str();
|
||||
return os;
|
||||
}
|
||||
};
|
||||
|
||||
std::string GetNext(int&marker,std::string str){
|
||||
int originalMarker=marker;
|
||||
marker=str.find_first_of(',',originalMarker)+1;
|
||||
return str.substr(originalMarker,marker-1);
|
||||
};
|
||||
|
||||
struct TestCase{
|
||||
int p1Amt,p2Amt,p3Amt;
|
||||
};
|
||||
|
||||
struct SongCombinations{
|
||||
std::vector<std::pair<int,int>>p1; //Index to song followed by EX of song.
|
||||
std::vector<std::pair<int,int>>p2;
|
||||
std::vector<std::pair<int,int>>p3;
|
||||
std::set<int>p1Picked;
|
||||
std::set<int>p2Picked;
|
||||
std::set<int>p3Picked;
|
||||
int totalEX=0;
|
||||
int remainingA,remainingB,remainingC;
|
||||
};
|
||||
|
||||
int main(){
|
||||
std::vector<ScoreData>dataA,dataB;
|
||||
std::vector<std::pair<int,int>>player1Score,player2Score,player3Score;
|
||||
std::ifstream file("team2");
|
||||
std::string line;
|
||||
//First two lines are garbage data.
|
||||
std::getline(file,line);
|
||||
std::getline(file,line);
|
||||
for(int i=0;i<12;i++){
|
||||
std::getline(file,line);
|
||||
int marker=0;
|
||||
ScoreData dat{
|
||||
stoi(GetNext(marker,line)),
|
||||
GetNext(marker,line),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line))};
|
||||
player1Score.push_back(std::pair<int,int>{dat.ex1,0});
|
||||
player2Score.push_back(std::pair<int,int>{dat.ex2,0});
|
||||
player3Score.push_back(std::pair<int,int>{dat.ex3,0});
|
||||
dataA.push_back(dat);
|
||||
}
|
||||
//Two more lines of garbage data.
|
||||
std::getline(file,line);
|
||||
std::getline(file,line);
|
||||
for(int i=0;i<12;i++){
|
||||
std::getline(file,line);
|
||||
int marker=0;
|
||||
ScoreData dat{
|
||||
stoi(GetNext(marker,line)),
|
||||
GetNext(marker,line),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line))};
|
||||
player1Score[i].second=dat.ex1;
|
||||
player2Score[i].second=dat.ex2;
|
||||
player3Score[i].second=dat.ex3;
|
||||
dataB.push_back(dat);
|
||||
}
|
||||
std::cout<<"File Contents:"<<std::endl<<std::endl;
|
||||
for(auto&list:{dataA,dataB}){
|
||||
for(auto&dat:list){
|
||||
std::cout<<dat<<std::endl;
|
||||
struct ScoreData{
|
||||
int difficulty=0;
|
||||
std::string song;
|
||||
int totalEX=0;
|
||||
int ex1=0,ex2=0,ex3=0;
|
||||
std::string str()const{
|
||||
return "["+std::to_string(difficulty)+"] "+song+": "+std::to_string(totalEX)+" total, "+" EX1: "+std::to_string(ex1)+" EX2: "+std::to_string(ex2)+" EX3: "+std::to_string(ex3);
|
||||
}
|
||||
}
|
||||
std::cout<<"==================="<<std::endl;
|
||||
|
||||
std::vector<TestCase>cases;
|
||||
for(int i=0;i<5;i++){
|
||||
for(int j=0;j<5;j++){
|
||||
for(int k=0;k<5;k++){
|
||||
if(i+j+k==6){
|
||||
cases.push_back(TestCase{i,j,k});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto ChooseSong = [](SongCombinations&combinations,std::vector<ScoreData>&dat,int index){
|
||||
if(combinations.remainingA>0&&combinations.p1Picked.count(index)==0&&combinations.p2Picked.count(index)==0&&combinations.p3Picked.count(index)==0){
|
||||
combinations.remainingA--;
|
||||
combinations.totalEX+=dat[index].ex1;
|
||||
combinations.p1.push_back(std::pair<int,int>{index,dat[index].ex1});
|
||||
combinations.p1Picked.insert(index);
|
||||
}else
|
||||
if(combinations.remainingB>0&&combinations.p1Picked.count(index)==0&&combinations.p2Picked.count(index)==0&&combinations.p3Picked.count(index)==0){
|
||||
combinations.remainingB--;
|
||||
combinations.totalEX+=dat[index].ex2;
|
||||
combinations.p2.push_back(std::pair<int,int>{index,dat[index].ex2});
|
||||
combinations.p2Picked.insert(index);
|
||||
}else
|
||||
if(combinations.remainingC>0&&combinations.p1Picked.count(index)==0&&combinations.p2Picked.count(index)==0&&combinations.p3Picked.count(index)==0){
|
||||
combinations.remainingC--;
|
||||
combinations.totalEX+=dat[index].ex3;
|
||||
combinations.p3.push_back(std::pair<int,int>{index,dat[index].ex3});
|
||||
combinations.p3Picked.insert(index);
|
||||
friend std::ostream&operator<<(std::ostream&os,const ScoreData&data){
|
||||
os<<data.str();
|
||||
return os;
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<SongCombinations> bestComboA,bestComboB;
|
||||
int caseInd=0;
|
||||
for(TestCase&_case:cases){
|
||||
bestComboA.push_back({});
|
||||
bestComboA[caseInd].remainingA=_case.p1Amt;
|
||||
bestComboA[caseInd].remainingB=_case.p2Amt;
|
||||
bestComboA[caseInd].remainingC=_case.p3Amt;
|
||||
SongCombinations testCombo=bestComboA[caseInd];
|
||||
for(int i=0;i<12;i++){
|
||||
SongCombinations c1=testCombo;
|
||||
ChooseSong(c1,dataA,i);
|
||||
for(int j=0;j<12;j++){
|
||||
SongCombinations c2=c1;
|
||||
ChooseSong(c2,dataA,j);
|
||||
for(int k=0;k<12;k++){
|
||||
SongCombinations c3=c2;
|
||||
ChooseSong(c3,dataA,k);
|
||||
for(int l=0;l<12;l++){
|
||||
SongCombinations c4=c3;
|
||||
ChooseSong(c4,dataA,l);
|
||||
for(int m=0;m<12;m++){
|
||||
SongCombinations c5=c4;
|
||||
ChooseSong(c5,dataA,m);
|
||||
for(int n=0;n<12;n++){
|
||||
SongCombinations c6=c5;
|
||||
ChooseSong(c6,dataA,n);
|
||||
if(bestComboA[caseInd].totalEX<c6.totalEX){
|
||||
bestComboA[caseInd]=c6;
|
||||
bestComboA[caseInd].totalEX=c6.totalEX;
|
||||
std::cout<<"New Best Song Combinations found for Case ("<<_case.p1Amt<<","<<_case.p2Amt<<","<<_case.p3Amt<<") - Total EX: "<<bestComboA[caseInd].totalEX<<":"<<std::endl;
|
||||
std::cout<<"\t";
|
||||
for(std::pair<int,int>&p1:bestComboA[caseInd].p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
std::string GetNext(int&marker,std::string str){
|
||||
int originalMarker=marker;
|
||||
marker=str.find_first_of(',',originalMarker)+1;
|
||||
return str.substr(originalMarker,marker-1);
|
||||
};
|
||||
|
||||
struct TestCase{
|
||||
int p1Amt,p2Amt,p3Amt;
|
||||
};
|
||||
|
||||
struct SongCombinations{
|
||||
std::vector<std::pair<int,int>>p1; //Index to song followed by EX of song.
|
||||
std::vector<std::pair<int,int>>p2;
|
||||
std::vector<std::pair<int,int>>p3;
|
||||
std::set<int>p1Picked;
|
||||
std::set<int>p2Picked;
|
||||
std::set<int>p3Picked;
|
||||
int totalEX=0;
|
||||
int remainingA,remainingB,remainingC;
|
||||
};
|
||||
std::vector<ScoreData>dataA,dataB;
|
||||
std::vector<std::pair<int,int>>player1Score,player2Score,player3Score;
|
||||
void Evaluate(){
|
||||
std::vector<TestCase>cases;
|
||||
for(int i=0;i<5;i++){
|
||||
for(int j=0;j<5;j++){
|
||||
for(int k=0;k<5;k++){
|
||||
if(i+j+k==6){
|
||||
cases.push_back(TestCase{i,j,k});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto ChooseSong = [](SongCombinations&combinations,std::vector<ScoreData>&dat,int index){
|
||||
if(combinations.remainingA>0&&combinations.p1Picked.count(index)==0&&combinations.p2Picked.count(index)==0&&combinations.p3Picked.count(index)==0){
|
||||
combinations.remainingA--;
|
||||
combinations.totalEX+=dat[index].ex1;
|
||||
combinations.p1.push_back(std::pair<int,int>{index,dat[index].ex1});
|
||||
combinations.p1Picked.insert(index);
|
||||
}else
|
||||
if(combinations.remainingB>0&&combinations.p1Picked.count(index)==0&&combinations.p2Picked.count(index)==0&&combinations.p3Picked.count(index)==0){
|
||||
combinations.remainingB--;
|
||||
combinations.totalEX+=dat[index].ex2;
|
||||
combinations.p2.push_back(std::pair<int,int>{index,dat[index].ex2});
|
||||
combinations.p2Picked.insert(index);
|
||||
}else
|
||||
if(combinations.remainingC>0&&combinations.p1Picked.count(index)==0&&combinations.p2Picked.count(index)==0&&combinations.p3Picked.count(index)==0){
|
||||
combinations.remainingC--;
|
||||
combinations.totalEX+=dat[index].ex3;
|
||||
combinations.p3.push_back(std::pair<int,int>{index,dat[index].ex3});
|
||||
combinations.p3Picked.insert(index);
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<SongCombinations> bestComboA,bestComboB;
|
||||
int caseInd=0;
|
||||
for(TestCase&_case:cases){
|
||||
bestComboA.push_back({});
|
||||
bestComboA[caseInd].remainingA=_case.p1Amt;
|
||||
bestComboA[caseInd].remainingB=_case.p2Amt;
|
||||
bestComboA[caseInd].remainingC=_case.p3Amt;
|
||||
SongCombinations testCombo=bestComboA[caseInd];
|
||||
for(int i=0;i<12;i++){
|
||||
SongCombinations c1=testCombo;
|
||||
ChooseSong(c1,dataA,i);
|
||||
for(int j=0;j<12;j++){
|
||||
SongCombinations c2=c1;
|
||||
ChooseSong(c2,dataA,j);
|
||||
for(int k=0;k<12;k++){
|
||||
SongCombinations c3=c2;
|
||||
ChooseSong(c3,dataA,k);
|
||||
for(int l=0;l<12;l++){
|
||||
SongCombinations c4=c3;
|
||||
ChooseSong(c4,dataA,l);
|
||||
for(int m=0;m<12;m++){
|
||||
SongCombinations c5=c4;
|
||||
ChooseSong(c5,dataA,m);
|
||||
for(int n=0;n<12;n++){
|
||||
SongCombinations c6=c5;
|
||||
ChooseSong(c6,dataA,n);
|
||||
if(bestComboA[caseInd].totalEX<c6.totalEX){
|
||||
bestComboA[caseInd]=c6;
|
||||
bestComboA[caseInd].totalEX=c6.totalEX;
|
||||
std::cout<<"New Best Song Combinations found for Case ("<<_case.p1Amt<<","<<_case.p2Amt<<","<<_case.p3Amt<<") - Total EX: "<<bestComboA[caseInd].totalEX<<":"<<std::endl;
|
||||
std::cout<<"\t";
|
||||
for(std::pair<int,int>&p1:bestComboA[caseInd].p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p2:bestComboA[caseInd].p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:bestComboA[caseInd].p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
for(std::pair<int,int>&p2:bestComboA[caseInd].p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:bestComboA[caseInd].p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
caseInd++;
|
||||
}
|
||||
caseInd++;
|
||||
}
|
||||
|
||||
caseInd=0;
|
||||
for(TestCase&_case:cases){
|
||||
bestComboB.push_back({});
|
||||
bestComboB[caseInd].remainingA=_case.p1Amt;
|
||||
bestComboB[caseInd].remainingB=_case.p2Amt;
|
||||
bestComboB[caseInd].remainingC=_case.p3Amt;
|
||||
SongCombinations testCombo=bestComboB[caseInd];
|
||||
for(int i=0;i<12;i++){
|
||||
SongCombinations c1=testCombo;
|
||||
ChooseSong(c1,dataB,i);
|
||||
for(int j=0;j<12;j++){
|
||||
SongCombinations c2=c1;
|
||||
ChooseSong(c2,dataB,j);
|
||||
for(int k=0;k<12;k++){
|
||||
SongCombinations c3=c2;
|
||||
ChooseSong(c3,dataB,k);
|
||||
for(int l=0;l<12;l++){
|
||||
SongCombinations c4=c3;
|
||||
ChooseSong(c4,dataB,l);
|
||||
for(int m=0;m<12;m++){
|
||||
SongCombinations c5=c4;
|
||||
ChooseSong(c5,dataB,m);
|
||||
for(int n=0;n<12;n++){
|
||||
SongCombinations c6=c5;
|
||||
ChooseSong(c6,dataB,n);
|
||||
if(bestComboB[caseInd].totalEX<c6.totalEX){
|
||||
bestComboB[caseInd]=c6;
|
||||
bestComboB[caseInd].totalEX=c6.totalEX;
|
||||
std::cout<<"New Best Song Combinations found for Case ("<<_case.p1Amt<<","<<_case.p2Amt<<","<<_case.p3Amt<<") - Total EX: "<<bestComboB[caseInd].totalEX<<":"<<std::endl;
|
||||
std::cout<<"\t";
|
||||
for(std::pair<int,int>&p1:bestComboB[caseInd].p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
caseInd=0;
|
||||
for(TestCase&_case:cases){
|
||||
bestComboB.push_back({});
|
||||
bestComboB[caseInd].remainingA=_case.p1Amt;
|
||||
bestComboB[caseInd].remainingB=_case.p2Amt;
|
||||
bestComboB[caseInd].remainingC=_case.p3Amt;
|
||||
SongCombinations testCombo=bestComboB[caseInd];
|
||||
for(int i=0;i<12;i++){
|
||||
SongCombinations c1=testCombo;
|
||||
ChooseSong(c1,dataB,i);
|
||||
for(int j=0;j<12;j++){
|
||||
SongCombinations c2=c1;
|
||||
ChooseSong(c2,dataB,j);
|
||||
for(int k=0;k<12;k++){
|
||||
SongCombinations c3=c2;
|
||||
ChooseSong(c3,dataB,k);
|
||||
for(int l=0;l<12;l++){
|
||||
SongCombinations c4=c3;
|
||||
ChooseSong(c4,dataB,l);
|
||||
for(int m=0;m<12;m++){
|
||||
SongCombinations c5=c4;
|
||||
ChooseSong(c5,dataB,m);
|
||||
for(int n=0;n<12;n++){
|
||||
SongCombinations c6=c5;
|
||||
ChooseSong(c6,dataB,n);
|
||||
if(bestComboB[caseInd].totalEX<c6.totalEX){
|
||||
bestComboB[caseInd]=c6;
|
||||
bestComboB[caseInd].totalEX=c6.totalEX;
|
||||
std::cout<<"New Best Song Combinations found for Case ("<<_case.p1Amt<<","<<_case.p2Amt<<","<<_case.p3Amt<<") - Total EX: "<<bestComboB[caseInd].totalEX<<":"<<std::endl;
|
||||
std::cout<<"\t";
|
||||
for(std::pair<int,int>&p1:bestComboB[caseInd].p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p2:bestComboB[caseInd].p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:bestComboB[caseInd].p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
for(std::pair<int,int>&p2:bestComboB[caseInd].p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:bestComboB[caseInd].p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
caseInd++;
|
||||
}
|
||||
caseInd++;
|
||||
}
|
||||
|
||||
int highestEX=0;
|
||||
SongCombinations picked1,picked2;
|
||||
for(SongCombinations&A:bestComboA){
|
||||
for(SongCombinations&B:bestComboB){
|
||||
if(A.totalEX+B.totalEX>highestEX&&A.p1Picked.size()+B.p1Picked.size()==4&&A.p2Picked.size()+B.p2Picked.size()==4&&A.p3Picked.size()+B.p3Picked.size()==4){
|
||||
highestEX=A.totalEX+B.totalEX;
|
||||
picked1=A;
|
||||
picked2=B;
|
||||
std::cout<<"New Best Song Combinations found for Final Picks - Total EX: "<<highestEX<<":"<<std::endl;
|
||||
std::cout<<"\t Set A: ";
|
||||
for(std::pair<int,int>&p1:picked1.p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
int highestEX=0;
|
||||
SongCombinations picked1,picked2;
|
||||
for(SongCombinations&A:bestComboA){
|
||||
for(SongCombinations&B:bestComboB){
|
||||
if(A.totalEX+B.totalEX>highestEX&&A.p1Picked.size()+B.p1Picked.size()==4&&A.p2Picked.size()+B.p2Picked.size()==4&&A.p3Picked.size()+B.p3Picked.size()==4){
|
||||
highestEX=A.totalEX+B.totalEX;
|
||||
picked1=A;
|
||||
picked2=B;
|
||||
std::cout<<"New Best Song Combinations found for Final Picks - Total EX: "<<highestEX<<":"<<std::endl;
|
||||
std::cout<<"\t Set A: ";
|
||||
for(std::pair<int,int>&p1:picked1.p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p2:picked1.p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:picked1.p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
std::cout<<"\t Set B: ";
|
||||
for(std::pair<int,int>&p1:picked2.p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p2:picked2.p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:picked2.p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
for(std::pair<int,int>&p2:picked1.p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:picked1.p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
std::cout<<"\t Set B: ";
|
||||
for(std::pair<int,int>&p1:picked2.p1){
|
||||
std::cout<<"P1["<<p1.first<<"]:"<<p1.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p2:picked2.p2){
|
||||
std::cout<<"P2["<<p2.first<<"]:"<<p2.second<<" ";
|
||||
}
|
||||
for(std::pair<int,int>&p3:picked2.p3){
|
||||
std::cout<<"P3["<<p3.first<<"]:"<<p3.second<<" ";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
public:
|
||||
struct SongElement{
|
||||
SongElement(QuickGUI::Manager&manager,std::string songName,vf2d pos){
|
||||
label=new QuickGUI::Label(manager,songName,pos,{164,12});
|
||||
p1Score=new QuickGUI::TextBox(manager,"",pos+vf2d{192,0},{36,12});
|
||||
p2Score=new QuickGUI::TextBox(manager,"",pos+vf2d{192+42*1,0},{36,12});
|
||||
p3Score=new QuickGUI::TextBox(manager,"",pos+vf2d{192+42*2,0},{36,12});
|
||||
}
|
||||
QuickGUI::Label*label;
|
||||
QuickGUI::TextBox*p1Score;
|
||||
QuickGUI::TextBox*p2Score;
|
||||
QuickGUI::TextBox*p3Score;
|
||||
};
|
||||
QuickGUI::Manager gui;
|
||||
std::vector<SongElement>songs;
|
||||
|
||||
ChampionsLeaguePointSolver()
|
||||
{
|
||||
// Name your application
|
||||
sAppName = "Champions League Point Solver";
|
||||
}
|
||||
|
||||
public:
|
||||
bool OnUserCreate() override
|
||||
{
|
||||
std::ifstream file("assets/team2");
|
||||
std::string line;
|
||||
//First two lines are garbage data.
|
||||
std::getline(file,line);
|
||||
std::getline(file,line);
|
||||
for(int i=0;i<12;i++){
|
||||
std::getline(file,line);
|
||||
int marker=0;
|
||||
ScoreData dat{
|
||||
stoi(GetNext(marker,line)),
|
||||
GetNext(marker,line),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line))};
|
||||
player1Score.push_back(std::pair<int,int>{dat.ex1,0});
|
||||
player2Score.push_back(std::pair<int,int>{dat.ex2,0});
|
||||
player3Score.push_back(std::pair<int,int>{dat.ex3,0});
|
||||
dataA.push_back(dat);
|
||||
songs.push_back(SongElement{gui,dat.song.substr(0,dat.song.find(',')),{4.f,2.f+12*i+16}});
|
||||
}
|
||||
//Two more lines of garbage data.
|
||||
std::getline(file,line);
|
||||
std::getline(file,line);
|
||||
for(int i=0;i<12;i++){
|
||||
std::getline(file,line);
|
||||
int marker=0;
|
||||
ScoreData dat{
|
||||
stoi(GetNext(marker,line)),
|
||||
GetNext(marker,line),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line)),
|
||||
stoi(GetNext(marker,line))};
|
||||
player1Score[i].second=dat.ex1;
|
||||
player2Score[i].second=dat.ex2;
|
||||
player3Score[i].second=dat.ex3;
|
||||
dataB.push_back(dat);
|
||||
songs.push_back(SongElement{gui,dat.song.substr(0,dat.song.find(',')),{4.f,2.f+12*(i+13)+16}});
|
||||
}
|
||||
std::cout<<"File Contents:"<<std::endl<<std::endl;
|
||||
for(auto&list:{dataA,dataB}){
|
||||
for(auto&dat:list){
|
||||
std::cout<<dat<<std::endl;
|
||||
}
|
||||
}
|
||||
std::cout<<"==================="<<std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnUserUpdate(float fElapsedTime) override
|
||||
{
|
||||
Clear(VERY_DARK_CYAN);
|
||||
gui.Update(this);
|
||||
gui.Draw(this);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
ChampionsLeaguePointSolver solver;
|
||||
if (solver.Construct(320, 320, 4, 4))
|
||||
solver.Start();
|
||||
return 0;
|
||||
}
|
28
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.data
Normal file
28
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.data
Normal file
@ -0,0 +1,28 @@
|
||||
"Scores due by September 24th, 23:59 PST",,,,,,,
|
||||
Set A,,Total EX,NICONII,SALSA,YONCETAI,,
|
||||
12,Sola,1287,1218,1155,980,,0
|
||||
13,Deadball de homerun,1323,1225,1047,994,,0
|
||||
13,Star Trail,1443,1339,1231,978,,0
|
||||
14,Draw the Savage,1425,1298,1294,1039,,0
|
||||
14,IMANOGUILTS,1719,1586,1336,993,,0
|
||||
15,Astrogazer,1782,1618,0,0,,0
|
||||
15,Kouen,1905,1772,0,0,,0
|
||||
16,The World Ends Now,1917,1730,0,0,,0
|
||||
16,S!ck,2118,1790,1563,0,,0
|
||||
17,Magnetic,2193,1815,0,0,,0
|
||||
17,Unfinished Steam Maiden,2262,1885,0,0,,0
|
||||
18,Nageki no ki,2370,1978,0,0,,0
|
||||
,,,,,,,0
|
||||
Set B,,,,,,,0
|
||||
12,Towards the TOWER,1104,1046,1023,879,,0
|
||||
13,Xenon,1158,1088,1042,913,,0
|
||||
13,DeStRuCtIvE FoRcE,1299,1218,1102,833,,0
|
||||
14,Diamond Night,1359,1258,1169,919,,0
|
||||
14,Nightbird lost wing,1539,1395,1220,674,,0
|
||||
15,Sand Blow,1668,1466,0,0,,0
|
||||
15,SILVER DREAM,1668,1500,1242,0,,0
|
||||
16,Another Phase,1767,1547,0,0,,0
|
||||
16,Blew My Mind,1803,1464,0,0,,0
|
||||
17,Emera,1851,1531,0,0,,0
|
||||
17,JOMANDA,2004,1556,0,0,,0
|
||||
18,PARANOiA Revolution,2097,1582,0,0,,0
|
75
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.html
Normal file
75
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.html
Normal file
@ -0,0 +1,75 @@
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>Emscripten-Generated Code</title>
|
||||
<style>
|
||||
html,body { width: 100%; height: 100%; }
|
||||
body { font-family: arial; margin: 0; padding: 0; background: #000; }
|
||||
|
||||
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
|
||||
div.emscripten_border { border: none; }
|
||||
|
||||
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
|
||||
canvas.emscripten { border: 0px none; background-color: black; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
|
||||
<script type='text/javascript'>
|
||||
var Module = {
|
||||
preRun: [],
|
||||
postRun: [],
|
||||
canvas: (function() {
|
||||
var canvas = document.getElementById('canvas');
|
||||
|
||||
// As a default initial behavior, pop up an alert when webgl context is lost. To make your
|
||||
// application robust, you may want to override this behavior before shipping!
|
||||
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
|
||||
canvas.addEventListener("webglcontextlost", function(e) { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);
|
||||
|
||||
return canvas;
|
||||
})(),
|
||||
};
|
||||
</script>
|
||||
<script async type="text/javascript" src="ChampionsLeaguePointSolver.js"></script>
|
||||
<script type="text/javascript">
|
||||
Module.canvas.addEventListener("resize", (e) => {
|
||||
|
||||
var viewWidth = e.detail.width;
|
||||
var viewHeight = e.detail.width / Module._olc_WindowAspectRatio;
|
||||
|
||||
if(viewHeight > e.detail.height)
|
||||
{
|
||||
viewHeight = e.detail.height;
|
||||
viewWidth = e.detail.height * Module._olc_WindowAspectRatio;
|
||||
}
|
||||
|
||||
// update dom attributes
|
||||
Module.canvas.setAttribute("width", viewWidth);
|
||||
Module.canvas.setAttribute("height", viewHeight);
|
||||
|
||||
var top = (e.detail.height - viewHeight) / 2;
|
||||
var left = (e.detail.width - viewWidth) / 2;
|
||||
|
||||
// update styles
|
||||
Module.canvas.style.position = "fixed";
|
||||
Module.canvas.style.top = top.toString() + "px";
|
||||
Module.canvas.style.left = left.toString() + "px";
|
||||
Module.canvas.style.width = "";
|
||||
Module.canvas.style.height = "";
|
||||
|
||||
// trigger PGE update
|
||||
Module._olc_PGE_UpdateWindowSize(viewWidth, viewHeight);
|
||||
|
||||
// ensure canvas has focus
|
||||
Module.canvas.focus();
|
||||
e.preventDefault();
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
1
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.js
Normal file
1
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.js
Normal file
File diff suppressed because one or more lines are too long
BIN
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.wasm
Executable file
BIN
ChallengeLeaguePointSolver/ChampionsLeaguePointSolver.wasm
Executable file
Binary file not shown.
@ -10,11 +10,11 @@ Set A,,Total EX,NICONII,SALSA,YONCETAI,,
|
||||
16,The World Ends Now,1917,1730,0,0,,0
|
||||
16,S!ck,2118,1790,1563,0,,0
|
||||
17,Magnetic,2193,1815,0,0,,0
|
||||
17,Mikansei no jouki kudou otome,2262,1885,0,0,,0
|
||||
17,Unfinished Steam Maiden,2262,1885,0,0,,0
|
||||
18,Nageki no ki,2370,1978,0,0,,0
|
||||
,,,,,,,0
|
||||
Set B,,,,,,,0
|
||||
12,Towards the Tower,1104,1046,1023,879,,0
|
||||
12,Towards the TOWER,1104,1046,1023,879,,0
|
||||
13,Xenon,1158,1088,1042,913,,0
|
||||
13,DeStRuCtIvE FoRcE,1299,1218,1102,833,,0
|
||||
14,Diamond Night,1359,1258,1169,919,,0
|
@ -1,211 +0,0 @@
|
||||
|
||||
#include "pixelGameEngine.h"
|
||||
|
||||
//THIS IS WRITTEN USING OLC GPE, CHECK OUT onelonecoder.com
|
||||
//Or else
|
||||
class Snake : public olc::PixelGameEngine {
|
||||
public:
|
||||
Snake() {
|
||||
sAppName = "Snake";
|
||||
}
|
||||
|
||||
enum direction { STOP, LEFT, RIGHT, DOWN, UP };
|
||||
direction dir;
|
||||
//Game variables
|
||||
int score;
|
||||
//Snake variables
|
||||
float SnakeXPos, SnakeYPos;
|
||||
float tailUpdateTimer=0;
|
||||
int tailX[1000], tailY[1000], tailLength = 0;
|
||||
float x, y;
|
||||
//Target variables
|
||||
int fruit1X, fruit1Y, fruit2X, fruit2Y;
|
||||
bool fruit1 = false, fruit2 = false;
|
||||
bool GameOver;
|
||||
|
||||
void SnakeDead() {
|
||||
if (GameOver == true) {
|
||||
Clear(olc::BLACK);
|
||||
DrawString(ScreenWidth() - ((ScreenWidth() / 2) + (ScreenWidth() / 2.8)), ScreenHeight() / 2 - 5, "Game Over", olc::RED, 1);
|
||||
}
|
||||
}
|
||||
void BorderCollisionCheck() {
|
||||
if (SnakeXPos <= 3) {
|
||||
GameOver = true;
|
||||
SnakeDead();
|
||||
}
|
||||
if (SnakeXPos >= ScreenWidth() - 3) {
|
||||
GameOver = true;
|
||||
SnakeDead();
|
||||
}
|
||||
if (SnakeYPos <= 3) {
|
||||
GameOver = true;
|
||||
SnakeDead();
|
||||
}
|
||||
if (SnakeYPos >= ScreenHeight() - 3) {
|
||||
GameOver = true;
|
||||
SnakeDead();
|
||||
}
|
||||
}
|
||||
void userInput(float speed) {
|
||||
if (GetKey(olc::Key::UP).bPressed && dir != DOWN) {
|
||||
dir = UP;
|
||||
}
|
||||
if (GetKey(olc::Key::DOWN).bPressed && dir != UP) {
|
||||
dir = DOWN;
|
||||
}
|
||||
if (GetKey(olc::Key::LEFT).bPressed && dir != RIGHT) {
|
||||
dir = LEFT;
|
||||
}
|
||||
if (GetKey(olc::Key::RIGHT).bPressed && dir != LEFT) {
|
||||
dir = RIGHT;
|
||||
}
|
||||
|
||||
//Move Snake
|
||||
switch (dir) {
|
||||
case LEFT:
|
||||
SnakeXPos -= speed;
|
||||
break;
|
||||
case RIGHT:
|
||||
SnakeXPos += speed;
|
||||
break;
|
||||
case DOWN:
|
||||
SnakeYPos += speed;
|
||||
break;
|
||||
case UP:
|
||||
SnakeYPos -= speed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
void FruitCoordGen() {
|
||||
//Fruit1
|
||||
if (fruit1 == false) {
|
||||
fruit1X = rand() & ScreenWidth();
|
||||
fruit1Y = rand() & ScreenHeight();
|
||||
fruit1 = true;
|
||||
}
|
||||
if (fruit1X <= 2 || fruit1X >= ScreenWidth() - 2) {
|
||||
fruit1X = rand() & ScreenWidth();
|
||||
}
|
||||
if (fruit1Y <= 2 || fruit1Y >= ScreenHeight() - 2) {
|
||||
fruit1Y = rand() & ScreenHeight();
|
||||
}
|
||||
//Fruit2
|
||||
//if (fruit2 == false) {
|
||||
//fruit2X = rand() & ScreenWidth();
|
||||
//fruit2Y = rand() & ScreenHeight();
|
||||
//fruit2 = true;
|
||||
//}
|
||||
//if (fruit2X <= 2 || fruit2X >= ScreenWidth() - 2) {
|
||||
//fruit1X = rand() & ScreenWidth();
|
||||
//}
|
||||
//if (fruit2Y <= 2 || fruit2Y >= ScreenHeight() - 2) {
|
||||
//fruit1Y = rand() & ScreenHeight();
|
||||
//}
|
||||
//if (fruit1X == fruit2X) {
|
||||
//fruit1X = rand() & ScreenWidth();
|
||||
//}
|
||||
//if (fruit1Y == fruit2Y) {
|
||||
//fruit1Y = rand() & ScreenWidth();
|
||||
//}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
public:
|
||||
bool OnUserUpdate(float fElapsedTime) override {
|
||||
|
||||
float speed = 20 * fElapsedTime;
|
||||
Clear(olc::BLACK);
|
||||
//Draw top border
|
||||
DrawLine(2, 2, ScreenWidth() - 2, 2, olc::WHITE);
|
||||
//Draw left border
|
||||
DrawLine(2, 2, 2, ScreenHeight() - 2, olc::WHITE);
|
||||
//Draw right border
|
||||
DrawLine(ScreenWidth() - 2, 2, ScreenWidth() - 2, ScreenHeight() - 2, olc::WHITE);
|
||||
//Draw bottom border
|
||||
DrawLine(2, ScreenHeight() - 2, ScreenWidth() - 2, ScreenHeight() - 2, olc::WHITE);
|
||||
|
||||
olc::vi2d SnakeHead(SnakeXPos, SnakeYPos);
|
||||
olc::vi2d SnakeHeadSize(2, 2);
|
||||
|
||||
olc::vi2d Fruit(fruit1X, fruit1Y);
|
||||
olc::vu2d FruitSize(2, 2);
|
||||
|
||||
//Snake and fruit collision
|
||||
if (SnakeHead.x < Fruit.x + FruitSize.x &&
|
||||
SnakeHead.x + SnakeHeadSize.x > Fruit.x &&
|
||||
SnakeHead.y < Fruit.y + FruitSize.y &&
|
||||
SnakeHead.y + SnakeHeadSize.y > Fruit.y) {
|
||||
fruit1 = false;
|
||||
score++;
|
||||
tailLength++;
|
||||
}
|
||||
|
||||
//Draw fruit
|
||||
DrawRect(fruit1X, fruit1Y, 1, 1, olc::RED);
|
||||
|
||||
//Fruit coord gen
|
||||
FruitCoordGen();
|
||||
|
||||
//Border collision
|
||||
BorderCollisionCheck();
|
||||
|
||||
tailUpdateTimer -= fElapsedTime; //Decrement the tail timer by the game elapsed time.
|
||||
if ( tailUpdateTimer <= 0 ) {
|
||||
//In order to create a tail following trail, start from the back-most tail and work your way up to the front, setting the previous tail's position to the current tail index's position.
|
||||
for (int i = tailLength - 1; i > 0; i--) {
|
||||
tailX[i]=tailX[i-1];
|
||||
tailY[i]=tailY[i-1];
|
||||
}
|
||||
//Now set the front-most tail to the current snake head's position.
|
||||
tailX[0]=SnakeXPos;
|
||||
tailY[0]=SnakeYPos;
|
||||
tailUpdateTimer=0.05; //Every 0.05 seconds we will re-update the tail positions instead of doing it by frame-based timing.
|
||||
}
|
||||
|
||||
//Draw Snake tail
|
||||
if (tailLength >= 1) {
|
||||
for (int i = 0; i < tailLength; i++) {
|
||||
DrawRect(tailX[i], tailY[i], 1, 1, olc::GREEN);
|
||||
}
|
||||
}
|
||||
|
||||
//Snake position gets adjusted here.
|
||||
userInput(speed);
|
||||
|
||||
//Draw the Snake at its new position.
|
||||
DrawRect(SnakeXPos, SnakeYPos, 1, 1, olc::DARK_GREEN);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnUserCreate() override {
|
||||
srand(time(NULL));
|
||||
dir = STOP;
|
||||
//Snake X coord gen
|
||||
SnakeXPos = rand() & ScreenWidth();
|
||||
if (SnakeXPos <= 3 || SnakeXPos >= ScreenWidth() - 3) {
|
||||
SnakeXPos = rand() & ScreenWidth();
|
||||
}
|
||||
if (SnakeXPos <= 3 || SnakeXPos >= ScreenHeight() - 3) {
|
||||
SnakeXPos = rand() & ScreenHeight();
|
||||
}
|
||||
//Snake Y coord gen
|
||||
SnakeYPos = rand() & ScreenWidth();
|
||||
if (SnakeYPos <= 3 || SnakeYPos >= ScreenWidth() - 3) {
|
||||
SnakeYPos = rand() & ScreenWidth();
|
||||
}
|
||||
if (SnakeYPos <= 3 || SnakeYPos >= ScreenHeight() - 3) {
|
||||
SnakeYPos = rand() & ScreenHeight();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
Snake demo;
|
||||
if (demo.Construct(100, 100, 10, 10))
|
||||
demo.Start();
|
||||
return 0;
|
||||
}
|
1179
ChallengeLeaguePointSolver/olcPGEX_QuickGUI.h
Normal file
1179
ChallengeLeaguePointSolver/olcPGEX_QuickGUI.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,2 +1,4 @@
|
||||
#define OLC_PGE_APPLICATION
|
||||
#include "pixelGameEngine.h"
|
||||
#include "pixelGameEngine.h"
|
||||
#define OLC_PGEX_QUICKGUI
|
||||
#include "olcPGEX_QuickGUI.h"
|
@ -3596,7 +3596,7 @@ namespace olc
|
||||
{
|
||||
// Check for typed characters
|
||||
for (const auto& key : vKeyboardMap)
|
||||
if (GetKey(std::get<0>(key)).bPressed)
|
||||
if (GetKey(std::get<0>(key)).bPressed&&nTextEntryCursor<4&&(GetKey(olc::Key::SHIFT).bHeld ? std::get<2>(key) : std::get<1>(key)).length()>0&&(GetKey(olc::Key::SHIFT).bHeld ? std::get<2>(key) : std::get<1>(key))[0]>='0'&&(GetKey(olc::Key::SHIFT).bHeld ? std::get<2>(key) : std::get<1>(key))[0]<='9')
|
||||
{
|
||||
sTextEntryString.insert(nTextEntryCursor, GetKey(olc::Key::SHIFT).bHeld ? std::get<2>(key) : std::get<1>(key));
|
||||
nTextEntryCursor++;
|
||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user