From 0191231e146f00d7410352fd88a6dd6a052402b5 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Mon, 27 Feb 2017 10:49:25 +0800 Subject: [PATCH 01/10] lvl1_1_to_8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 交一波作业...之前的lvl1_7也修改了大小写问题,俸爷辛苦了. --- .../p01_runningLetter/lvl1_1_Running_letter.c | 46 +++ .../c/level1/p02_isPrime/lvl1_2_isPrime.c | 105 +++++ practices/c/level1/p03_Diophantus/README.md | 4 +- .../level1/p03_Diophantus/lvl1_3_Diophantus.c | 27 ++ practices/c/level1/p04_ narcissus/README.md | 2 +- .../level1/p04_ narcissus/lvl1_4_narcissus.c | 36 ++ .../c/level1/p05_allPrimes/lvl1_5_allPrimes.c | 115 ++++++ .../c/level1/p06_Goldbach/lvl1_6_Goldbach.c | 139 +++++++ .../c/level1/p07_encrypt_decrypt/README.md | 13 +- ...l1_7_Feisitel_Encrypt_and_Decrypt_System.c | 384 ++++++++++++++++++ practices/c/level1/p08_hanoi/lvl1_8_hanoi.c | 34 ++ 11 files changed, 902 insertions(+), 3 deletions(-) create mode 100644 practices/c/level1/p01_runningLetter/lvl1_1_Running_letter.c create mode 100644 practices/c/level1/p02_isPrime/lvl1_2_isPrime.c create mode 100644 practices/c/level1/p03_Diophantus/lvl1_3_Diophantus.c create mode 100644 practices/c/level1/p04_ narcissus/lvl1_4_narcissus.c create mode 100644 practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c create mode 100644 practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c create mode 100644 practices/c/level1/p07_encrypt_decrypt/lvl1_7_Feisitel_Encrypt_and_Decrypt_System.c create mode 100644 practices/c/level1/p08_hanoi/lvl1_8_hanoi.c diff --git a/practices/c/level1/p01_runningLetter/lvl1_1_Running_letter.c b/practices/c/level1/p01_runningLetter/lvl1_1_Running_letter.c new file mode 100644 index 00000000..54334540 --- /dev/null +++ b/practices/c/level1/p01_runningLetter/lvl1_1_Running_letter.c @@ -0,0 +1,46 @@ +/* code: Running Letter + * author: Kyrios0 + * date: 2017.02.26 + * state: finished + * version: 1.0.0 + */ + +#include +#include + +void gotoxy(int x, int y) +{ + HANDLE hOutput; + COORD coo; + coo.X = x; + coo.Y = y; + hOutput = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleCursorPosition(hOutput, coo); +} + +int main(int argc, char** argv) +{ + system("chcp 437"); + system("color 0f"); + system("mode con cols=63 lines=32"); + + int x = 0, y = 0, round = 0; + + while(1) + { + system("cls"); + + gotoxy(x, y); + putchar('#'); + gotoxy(x, y); + + (round % 2 == 0) ? x++ : x--; + if((x == 0) || (x == 63)) + { + round++; + } + + Sleep(25); + } + return 0; +} \ No newline at end of file diff --git a/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c b/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c new file mode 100644 index 00000000..d9ee28c5 --- /dev/null +++ b/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c @@ -0,0 +1,105 @@ +// isPrime.cpp +// + +#include "stdafx.h" +/* code: Linked list Step0 for eratosthenes Prime (change from lvl1_5) + * author: Kyrios0 + * date: 2017.02.21 + * state: finished + * version: 1.0.2 + */ + +#include +#include//malloc() +#include +#include + +typedef struct linked { + int data; + linked *next; +}linked; + +linked* creat(int length) +{ + linked *head, *tail, *p; + int x; + head = tail = NULL; + + for (x = 0; x < length; x++) + { + p = (linked *)malloc(sizeof(linked)); + p->data = x + 2;//0 and 1 aren't prime or composite number + p->next = NULL; + + if (head == NULL) + { + head = tail = p; + } + else + { + tail = tail->next = p; + } + } + + return head; +} + +int main(int argc, char** argv) +{ + long len, userNumber, finalNumber = 2; + + puts("Prime Number Detection System"); + puts("Please enter the number you want to detect(It should be no less than 2)"); + scanf("%ld", &userNumber); + + len = userNumber; + linked *current, *head, *temp, *currenthead; + current = creat(len); + head = current; + currenthead = head; + + puts("Working..."); + + for (long i = 0; ; i++) + { + if (i * i >= len)//Termination + { + break; + } + + while (current->next != NULL) + { + temp = current->next; + + while (temp->data % currenthead->data == 0)//Delete this number + { + current->next = temp->next; + temp = temp->next; + len--; + if (temp == NULL) + { + break; + } + } + + if (current->next == NULL) + { + break; + } + else + { + current = current->next; + } + } + + finalNumber = current->data; + currenthead = currenthead->next; + current = currenthead; + } + + printf(((finalNumber == userNumber) || (userNumber == 2)) ? ("%d is a prime number\n") : ("%d is a composite number\n"), userNumber); + + system("pause"); + + return 0; +} \ No newline at end of file diff --git a/practices/c/level1/p03_Diophantus/README.md b/practices/c/level1/p03_Diophantus/README.md index 021fd647..cba12675 100755 --- a/practices/c/level1/p03_Diophantus/README.md +++ b/practices/c/level1/p03_Diophantus/README.md @@ -14,4 +14,6 @@ 年级是他的一半。 -问儿子死时丢番图多大? \ No newline at end of file +问儿子死时丢番图多大? + +/* *just for test* */ \ No newline at end of file diff --git a/practices/c/level1/p03_Diophantus/lvl1_3_Diophantus.c b/practices/c/level1/p03_Diophantus/lvl1_3_Diophantus.c new file mode 100644 index 00000000..9ae9625b --- /dev/null +++ b/practices/c/level1/p03_Diophantus/lvl1_3_Diophantus.c @@ -0,0 +1,27 @@ +/* author: Kyrios0 + * date: 2017.02.23 + * version: 1.0.0 + * state: finished + */ + +#include +#include +#include + +int main(int argc, char *argv[]) { + system("chcp 437"); + system("cls"); + double age = 0.0, ans = 0.0; + while(1) + { + ans = (1.0/6.0 + 1.0/12.0 + 1.0/7.0 + 1.0/2.0) * age + 9.0; + if(ans - age < 0.1) + { + printf("He was %.0f years old at that time. \n", ans - 4); + system("pause"); + return 0; + } + age += 1.0; + } + return 0; +} diff --git a/practices/c/level1/p04_ narcissus/README.md b/practices/c/level1/p04_ narcissus/README.md index c7fc78e3..49096e29 100755 --- a/practices/c/level1/p04_ narcissus/README.md +++ b/practices/c/level1/p04_ narcissus/README.md @@ -4,4 +4,4 @@ 水仙花数:n位数的每个数位的n次方之和等于该n位数本身 -例如:153=1^3+5^3+3^3 \ No newline at end of file +例如:153=1^3 + 5^3 + 3^3 \ No newline at end of file diff --git a/practices/c/level1/p04_ narcissus/lvl1_4_narcissus.c b/practices/c/level1/p04_ narcissus/lvl1_4_narcissus.c new file mode 100644 index 00000000..261e8ea7 --- /dev/null +++ b/practices/c/level1/p04_ narcissus/lvl1_4_narcissus.c @@ -0,0 +1,36 @@ +/* code: Narcissus + * author: Kyrios0 + * date: 2017.02.26 + * state: finished + * version: 1.0.0 + */ + +#include "stdafx.h" +#include +#include +#include + +int main(int argc, char** argv) +{ + system("chcp 437"); + system("cls"); + int hun, ten, one, sum = 100;//hun = 100 + puts("The following is the number of narcissus in 1000"); + + while (sum < 1000) + { + one = sum % 10; + ten = sum / 10 % 10; + hun = sum / 100; + + if ((int)(pow(double(one), 3.0) + pow(double(ten), 3.0) + pow(double(hun), 3.0)) == sum) + { + printf("%d\n", sum); + } + + sum++; + } + + system("pause"); + return 0; +} \ No newline at end of file diff --git a/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c b/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c new file mode 100644 index 00000000..ae859dcf --- /dev/null +++ b/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c @@ -0,0 +1,115 @@ +// allPrime.cpp +// + +#include "stdafx.h" +/* code: Linked list Step0 for eratosthenes + * author: Kyrios0 + * date: 2017.02.21 + * state: finished + * version: 1.0.2 + */ + +#include +#include//malloc() +#include +#include + +typedef struct linked { + int data; + linked *next; +}linked; + +linked* creat(int length) +{ + linked *head, *tail, *p; + int x; + head = tail = NULL; + + for (x = 0; x < length; x++) + { + p = (linked *)malloc(sizeof(linked)); + p->data = x + 2;//0 and 1 aren't prime or composite number + p->next = NULL; + + if (head == NULL) + { + head = tail = p; + } + else + { + tail = tail->next = p; + } + } + + return head; +} + + + +int main(int argc, char** argv) +{ + long len = 10000000;//about 40s + linked *current, *head, *temp, *currenthead; + current = creat(len); + head = current; + currenthead = head; + + puts("Working..."); + + for (long i = 0; ; i++) + { + if (i * i >= len)//Termination + { + break; + } + + while (current->next != NULL) + { + temp = current->next; + + while (temp->data % currenthead->data == 0)//Delete this number + { + current->next = temp->next; + temp = temp->next; + len--; + if (temp == NULL) + { + break; + } + } + + if (current->next == NULL) + { + break; + } + else + { + current = current->next; + } + } + + currenthead = currenthead->next; + current = currenthead; + } + + FILE *fpt; + fpt = fopen("PrimeList.txt", "w"); + + puts("Start writing... Please wait a moment."); + + for (int i = 0; i < len; i++)//output + { + fprintf(fpt, "%d, ", head->data); + head = head->next; + if ((i % 100000 == 0) && (i != 0)) + { + printf("%d numbers has been writen: %d \n", i, head->data); + } + } + + puts("DONE!"); + + system("pause"); + + return 0; +} \ No newline at end of file diff --git a/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c b/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c new file mode 100644 index 00000000..603b506f --- /dev/null +++ b/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c @@ -0,0 +1,139 @@ +// Goldbach.cpp +// + +#include "stdafx.h" +/* code: Goldbach (change from lvl1_5) + * author: Kyrios0 + * date: 2017.02.26 + * state: finished + * version: 1.0.1 + */ + +#include +#include//malloc() +#include +#include + +typedef struct linked { + int data; + linked *next; +}linked; + +linked* creat(int length) +{ + linked *head, *tail, *p; + int x; + head = tail = NULL; + + for (x = 0; x < length; x++) + { + p = (linked *)malloc(sizeof(linked)); + p->data = x + 2;//0 and 1 aren't prime or composite number + p->next = NULL; + + if (head == NULL) + { + head = tail = p; + } + else + { + tail = tail->next = p; + } + } + + return head; +} + + + +int main(int argc, char** argv) +{ + long len = 1000000;//about 8min + int primeList[80000]; + linked *current, *head, *temp, *currenthead; + current = creat(len); + head = current; + currenthead = head; + + puts("Working..."); + + for (long i = 0; ; i++) + { + if (i * i >= len)//Termination + { + break; + } + + while (current->next != NULL) + { + temp = current->next; + + while (temp->data % currenthead->data == 0)//Delete this number + { + current->next = temp->next; + temp = temp->next; + len--; + if (temp == NULL) + { + break; + } + } + + if (current->next == NULL) + { + break; + } + else + { + current = current->next; + } + } + + currenthead = currenthead->next; + current = currenthead; + } + + FILE *fpt; + fpt = fopen("Goldbach.txt", "w"); + puts("Start writing... Please wait a moment."); + + for (int i = 0; i < len; i++)//output + { + primeList[i] = head->data;//printf("%d, ", head->data); + head = head->next; + } + + int x = 0, y = 0; + for (int i = 4; i <= 1000000;) + { + if (primeList[x] < i - 300)//The speed can be increased by 40% if i == 100,000 + { + x++; + } + if (i - primeList[x] != primeList[y]) + { + x++; + if (primeList[x] > 1000000) + { + x = 0; + y++; + } + } + else + { + fprintf(fpt, "%d = %d + %d\n", i, primeList[x], primeList[y]);//printf("%d = %d + %d\n", i, primeList[x], primeList[y]); + if (i % 20000 == 0) + { + printf("%d lines has been writen.\n", i / 2); + } + x = 0; y = 0, i += 2; + continue; + } + } + + puts("DONE!"); + + system("pause"); + + return 0; +} \ No newline at end of file diff --git a/practices/c/level1/p07_encrypt_decrypt/README.md b/practices/c/level1/p07_encrypt_decrypt/README.md index efd67472..b708a320 100755 --- a/practices/c/level1/p07_encrypt_decrypt/README.md +++ b/practices/c/level1/p07_encrypt_decrypt/README.md @@ -1,3 +1,14 @@ ### 功能要求: -1. 分别编写“加密”、“解密”函数,输入为任意长度的字符串 \ No newline at end of file +<<<<<<< HEAD +1. 分别编写“加密”、“解密”函数,输入为任意长度的字符串 + +### Writeup + +> 想起寒假学密码学看到的Feistel结构加解密于是产生了用C语言实现的想法。 然后我大概不会再用C语言写加解密了...//IDE:VS2017 RC +> +> P.S.:程序执行加密的时候如果明文过短可能会出BUG,具体原理不详,断在了system语句. +> P.P.S.:附上的文件中,一份源代码,一份程序 +======= +1. 分别编写“加密”、“解密”函数,输入为任意长度的字符串 +>>>>>>> parent of ba96cb9... lvl1_7 diff --git a/practices/c/level1/p07_encrypt_decrypt/lvl1_7_Feisitel_Encrypt_and_Decrypt_System.c b/practices/c/level1/p07_encrypt_decrypt/lvl1_7_Feisitel_Encrypt_and_Decrypt_System.c new file mode 100644 index 00000000..cbf64e5b --- /dev/null +++ b/practices/c/level1/p07_encrypt_decrypt/lvl1_7_Feisitel_Encrypt_and_Decrypt_System.c @@ -0,0 +1,384 @@ +// Feistel.cpp +// + +/* code: Feistel-construction Encrypt/Decrypt System + * author: Kyrios0 + * date: 2017.02.26 + * state: finished + * version: 1.1.1 + */ + +#define _CRT_SECURE_NO_WARNINGS +#include "stdafx.h" +#include +#include +#include +#include +#include +#include + +char* XOR(char *a, char *b); +unsigned int SDBMHash(char *str); +unsigned int RSHash(char *str); +int stringCopy(char *a, char *b, unsigned c); +char* HASH(char *str); +char* key_schedule(char *key); +int encrypt(char *data); +int decrypt(char *cipher); +int outputTrans(char *str); +int inputTrans(char *userPlain); +char* stringInput(char *buf); +int EncryptMode(); +int DecryptMode(); + +char hstr[17], hstrsub[9], subKeys[16 * 16 + 1], cipher[33], plain[33]; +char *userPlain = NULL, *userCipher = NULL; +//Just xor +char* XOR(char *a, char *b) +{ + for (int i = 0; i < 16; i++) + { + a[i] = a[i] ^ b[i]; + } + + a[16] = '\0'; + b[16] = '\0'; + + return a; +} +//Hash1 +unsigned int SDBMHash(char *str) +{ + unsigned int hash = 0; + + while (*str) + { + hash = (*str++) + (hash << 6) + (hash << 16) - hash; + } + + return (hash & 0x7FFFFFFF); +} +//Hash2 +unsigned int RSHash(char *str) +{ + unsigned int b = 378551; + unsigned int a = 63689; + unsigned int hash = 0; + + while (*str) + { + hash = hash * a + (*str++); + a *= b; + } + + return (hash & 0x7FFFFFFF); +} +//Instead strncopy, this won't stop at '0x00' +int stringCopy(char *a, char *b, unsigned c) +{ + for (int i = 0; i < c; i++) + { + a[i] = b[i]; + } + + return 0; +} +//Hash1 and hash2 +char* HASH(char *str) +{ + unsigned hash, hashsub; + + hash = SDBMHash(str); + hashsub = RSHash(str); + _itoa_s(hash, hstr, 16); + _itoa_s(hashsub, hstrsub, 16); + strcat_s(hstr, hstrsub); + + if (strlen(hstr) < 16) + { + char subKey[] = { '0', 0x00 }; + + for (int i = (16 - strlen(hstr)); i > 0; i--) + { + strcat_s(hstr, subKey); + } + + } + + return hstr; +} +//Generate a key schedule +char* key_schedule(char *key) +{ + char *subKey = key; + + for (int i = 0; i < 16; i++) + { + subKey = HASH(subKey); + strcat_s(subKeys, subKey); + } + + return subKeys; +} +//Basic encrypt +int encrypt(char *data) +{ + *cipher = { 0x00 }; + char d1[17] = { 0x00 }, d2[17] = { 0x00 }, currentkey[17], temp[17]; + char done[17]; + done[16] = '\0'; + + strncpy_s(d1, data, 16); + strncpy_s(d2, data + 16, strlen(data) - 16); + + for (int i = 0; i < 16; i++) + { + strncpy_s(currentkey, subKeys + (16 * i), 16); + stringCopy(done, XOR(XOR(HASH(d2), currentkey), d1), 16); + stringCopy(d1, done, 16); + stringCopy(temp, d1, 16); + stringCopy(d1, d2, 16); + stringCopy(d2, temp, 16); + } + + d2[16] = '\0'; + d1[16] = '\0'; + strcat_s(cipher, d2); + strcat_s(cipher, d1); + + return 0; +} +//Basic decrypt +int decrypt(char *cipher) +{ + *plain = { 0x00 }; + char d1[17] = { 0x00 }, d2[17] = { 0x00 }, currentkey[17], temp[17]; + char done[17]; + done[16] = '\0'; + + stringCopy(d2, cipher, 16); + stringCopy(d1, cipher + 16, 16); + + for (int i = 0; i < 16; i++) + { + strncpy_s(currentkey, subKeys + (16 * (15 - i)), 16); + stringCopy(temp, d1, 16); + stringCopy(d1, d2, 16); + stringCopy(d2, temp, 16); + stringCopy(done, XOR(XOR(HASH(d2), currentkey), d1), 16); + stringCopy(d1, done, 16); + } + + strcat_s(plain, d1); + strcat_s(plain, d2); + + return 0; +} +//Enhanced ascii to hex +int outputTrans(char *str) +{ + for (int i = 0; i < 32; i++) + { + if (((unsigned char)str[i] < 0x10) && ((unsigned char)str[i] > 0x00)) + { + putchar('0'); + } + printf("%x", (unsigned char)str[i]); + } + + return 0; +} +//Enhanced hex to ascii +int inputTrans(char *userPlain) +{ + for (int i = 0; i < 64; i += 2) + { + if ((userPlain[i] >= '0') && (userPlain[i] <= '9')) + { + userPlain[i] -= '0'; + } + else + { + userPlain[i] -= ('a' - 10); + } + if ((userPlain[i + 1] >= '0') && (userPlain[i + 1] <= '9')) + { + userPlain[i + 1] -= '0'; + } + else + { + userPlain[i + 1] -= ('a' - 10); + } + cipher[i / 2] = userPlain[i] * 0x10 + userPlain[i + 1]; + } + + return 0; +} +//Arbitrary length +char* stringInput(char *buf) +{ + int len = 0; + char *str = (char *)malloc(4 * sizeof(char)); + if (str == NULL) + { + exit(1); + } + + while (1) + { + fgets(str, 5, stdin); + if (str[3] == '\n') + { + str[3] = '\0'; + } + if (str[0] == '\n') + { + str[0] = '\0'; + break; + } + len += 4; + char * buff = (char *)malloc(len * sizeof(char)); + *buff = { 0x00 }; + if (len != 4) + { + strcpy(buff, buf); + *buf = { 0x00 }; + } + strcat(buff, str); + buf = buff; + buff = NULL; + if (strlen(str) != 4) + { + break; + } + } + + if (buf[strlen(buf) - 1] == '\n') + { + buf[strlen(buf) - 1] = '\0'; + } + + return buf; +} + +int EncryptMode() +{ + puts("Please enter plain text:"); + userPlain = stringInput(userPlain); + + unsigned int fill, block, length, exLength; + char currentEncryptBlock[33]; + length = strlen(userPlain); + block = (length - 1) / 32 + 1; + fill = (32 - (length % 32)) % 32; + exLength = block * 32; + + for (int i = fill; i > 0; i--) + { + userPlain[exLength - i] = ' '; + userPlain[exLength - i + 1] = 0x00; + } + + printf("cipher:\t"); + + for (int i = 0; i < block; i++) + { + stringCopy(currentEncryptBlock, userPlain + (32 * i), 32); + currentEncryptBlock[32] = '\0'; + encrypt(currentEncryptBlock);//Loop encryption + outputTrans(cipher); + } + + putchar('\n'); + + return 0; +} + +int DecryptMode() +{ + puts("Please enter cipher text:"); + unsigned int fill, block, length; + userCipher = stringInput(userCipher); + + char currentDecryptBlock[65]; + length = strlen(userCipher); + block = (length - 1) / 64 + 1; + fill = (64 - (length % 64)) % 64; + if ((length % 64) != 0) + { + puts("WARNING!"); + puts("INVAILD CIPHER!!!"); + return -1; + } + + printf("plain:\t"); + + for (int i = 0; i < block; i++) + { + stringCopy(currentDecryptBlock, userCipher + (64 * i), 64); + currentDecryptBlock[64] = '\0'; + inputTrans(currentDecryptBlock); + decrypt(cipher); //Loop encryption + printf("%s", plain); + } + + putchar('\n'); + + return 0; +} + +int main(int argc, char** argv) +{ + char key[] = "Kyrios0";//char Test_data[] = "hashtestmiaomiaomiaowhathappened" + key_schedule(key); + + system("chcp 437"); + system("mode con cols=65 lines=32"); + + while (1) + { + *hstr = { 0x00 }; *hstrsub = { 0x00 }; *cipher = { 0x00 }; *plain = { 0x00 }; + + system("cls"); + printf("\n\n\n\n\n\n\n"); + puts(" Feistel Structure Encryption and Decryption System"); + printf("\n\n\n\n"); + puts(" Press E to enter the Encryption mode"); + printf("\n\n\n"); + puts(" Press D to enter the Decryption mode"); + printf("\n\n\n"); + puts(" Press Q to Quit"); + + switch (_getch()) + { + case 'e': + system("cls"); + puts("EncryptMode"); + EncryptMode(); + break; + + case 'd': + system("cls"); + puts("DecryptMode"); + DecryptMode(); + break; + + case 'q': + system("cls"); + puts("Kyrios hope that you will have a nice day"); + puts("Bye"); + system("pause"); + exit(0); + break; + + default: + continue; + + } + + system("pause"); + } + + return 0; +} + diff --git a/practices/c/level1/p08_hanoi/lvl1_8_hanoi.c b/practices/c/level1/p08_hanoi/lvl1_8_hanoi.c new file mode 100644 index 00000000..7ac18f3b --- /dev/null +++ b/practices/c/level1/p08_hanoi/lvl1_8_hanoi.c @@ -0,0 +1,34 @@ +/* code: Hanoi + * author: Kyrios0 + * date: 2016.10 (Maybe this time) + * state: finished + * version: 1.0.0 + */ + +#include +#include +#include + +void hanoi(int n, char a, char b, char c) +{ + if(n > 0) + { + hanoi(n - 1, a, c, b); + printf("From %c to %c \n", a, c);//it's too slow...With fprintf to replace printf will be a lot faster + hanoi(n - 1, b, a, c); + } +} + +int main(int argc, char** argv) +{ + int n; char a = 'A', b = 'B', c = 'C'; + + puts("input the number of discs"); + scanf("%d", &n); + + hanoi(n, a, b, c); + + system("pause"); + return 0; +} + From d750ed25208c915668ab9042c4230f222147a265 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Sat, 4 Mar 2017 00:49:29 +0800 Subject: [PATCH 02/10] lvl1_9 maze --- practices/c/level1/p09_maze/lvl1_9_maze.c | 280 ++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 practices/c/level1/p09_maze/lvl1_9_maze.c diff --git a/practices/c/level1/p09_maze/lvl1_9_maze.c b/practices/c/level1/p09_maze/lvl1_9_maze.c new file mode 100644 index 00000000..6ec96f92 --- /dev/null +++ b/practices/c/level1/p09_maze/lvl1_9_maze.c @@ -0,0 +1,280 @@ +// Puzzle.cpp : 定义控制台应用程序的入口点。 +// + +/* code: Puzzle Game for Kira + * author: Kyrios0 + * date: 2017.03.03 + * state: finished + * version: 1.0.5 + */ + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include + +char *getWall(int x, int y); +int sr(int x, int y); +void Make_Maze(int x, int y); +void gotoxy(int x, int y); +void ctrl(int x, int y); +void modeSelection(); +DWORD WINAPI clocks(LPVOID lpParameter); + +char cw[][4] = { " ","┃","━","┗","┃","┃","┏","┣","━","┛","━","┻","┓","┫","┳" ,"╋" };//map +char m[50][50], cm1, cm2, level; +//Automatically generate walls +char *getWall(int x, int y) +{ + int a = (m[x][y - 1] ? 0 : 1) | (m[x + 1][y] ? 0 : 2) | (m[x][y + 1] ? 0 : 4) | (m[x - 1][y] ? 0 : 8); + return cw[(m[x][y - 1] ? 0 : 1) | (m[x + 1][y] ? 0 : 2) | (m[x][y + 1] ? 0 : 4) | (m[x - 1][y] ? 0 : 8)];//CORE! +} +//Determine the path +int sr(int x, int y)//CORE algorithm! +{ + static int d[4][2] = { { 0,1 },{ 1,0 },{ 0,-1 },{ -1,0 } }; + int zx = x * 2, zy = y * 2, nx, tn = rand() % 2 ? 1 : 3, i; + m[zx][zy] = 1; + + for (i = 0, nx = rand() % 4; i < 4; i++, nx = (nx + tn) % 4) + { + if (m[zx + 2 * d[nx][0]][zy + 2 * d[nx][1]] == 0) + { + m[zx + d[nx][0]][zy + d[nx][1]] = 1, sr(x + d[nx][0], y + d[nx][1]); + } + } + + return 0; +} + +void Make_Maze(int x, int y) +{ + int z1, z2; + + for (z1 = 0, z2 = 2 * y + 2; z1 <= 2 * x + 2; z1++) + { + m[z1][0] = 1, m[z1][z2] = 1; + } + + for (z1 = 0, z2 = 2 * x + 2; z1 <= 2 * y + 2; z1++) + { + m[0][z1] = 1, m[z2][z1] = 1; + } + + m[1][2] = 1; m[2 * x + 1][2 * y] = 1; + srand((unsigned)time(NULL)); + sr(rand() % x + 1, rand() % y + 1); +} + +void gotoxy(int x, int y) +{ + HANDLE hOutput; + COORD coo; + coo.X = x; + coo.Y = y; + hOutput = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleCursorPosition(hOutput, coo); +} + +void ctrl(int x, int y) +{ + while (1) + { + char cm2 = _getch(); + if ((cm2 == -32) && (cm2 != 'w') && (cm2 != 'a') && (cm2 != 's') && (cm2 != 'd')) + { + switch (cm2 = _getch()) + { + case 72: cm2 = 'w'; break; + case 80: cm2 = 's'; break; + case 75: cm2 = 'a'; break; + case 77: cm2 = 'd'; break; + } + } + if ((( ((m[x][y + 1] == 0) && (cm2 == 's')) + || ((m[x + 1][y] == 0) && (cm2 == 'd')) + || ((m[x][y - 1] == 0) && (cm2 == 'w')) + || (((x - 1 == 0) || (m[x - 1][y] == 0)) && (cm2 == 'a')) ) == 0))//if it's vaild + { + cm1 = cm2;//Accept + break; + } + } +} + +void modeSelection() +{ + system("mode con cols=63 lines=32"); + gotoxy(26, 13); + printf("CHOOSE MODE"); + gotoxy(28, 14); + printf("E-easy"); + gotoxy(28, 15); + printf("N-normal"); + gotoxy(28, 16); + printf("H-hard"); + gotoxy(28, 17); + printf("L-lunatic"); + level = _getch(); + system("cls"); +} + +DWORD WINAPI clocks(LPVOID lpParameter) +{ + int x = *(int*)lpParameter; + int i = 0; + while (1) + { + Sleep(250); + Sleep(250); + gotoxy(4 * x + 5, 3); + printf("Time: %ds", i++); + Sleep(250); + Sleep(250); + } +} + +int main(void) +{ + system("color 0f"); + while (1) + { + modeSelection(); + int x, y; + switch (level) + { + case 'e': + x = 5, y = 5; + system("mode con cols=50 lines=13"); + break; + case 'n': + x = 10, y = 10; + system("mode con cols=62 lines=23"); + break; + case 'h': + x = 15, y = 15; + system("mode con cols=82 lines=33"); + break; + case 'l': + x = 29, y = 22; + system("mode con cols=138 lines=47"); + break; + default: + gotoxy(15, 13); + puts("Because recently someone is lazy"); + gotoxy(12, 15); + puts("so there is no hidden difficulty(~ ̄▽ ̄)~"); + gotoxy(23, 17); + system("pause"); + exit(0); + break; + } + + int z1, z2, nx = 1, ny = 2; + + Make_Maze(x, y); + for (z2 = 1; z2 <= y * 2 + 1; z2++) + { + for (z1 = 1; z1 <= x * 2 + 1; z1++) + printf(m[z1][z2] ? " " : getWall(z1, z2)); + if (z2 <= y * 2) + { + putchar(10); + } + } + + switch (level) + { + case 'e': + gotoxy(25, 1); + puts("Mode: Easy"); + gotoxy(27, 5); + puts("Just"); + gotoxy(28, 6); + puts("For"); + gotoxy(27, 7); + puts("Kids"); + break; + case 'n': + gotoxy(45, 1); + puts("Mode: Normal"); + gotoxy(45, 6); + puts("Relax~~"); + break; + case 'h': + gotoxy(65, 1); + puts("Mode: Hard"); + gotoxy(65, 6); + puts("Enjoy it!"); + break; + case 'l': + gotoxy(121, 1); + puts("Mode: Lunatic"); + gotoxy(121, 6); + puts("Be patient"); + break; + default:; + } + gotoxy(4 * x - 1, 2 * y - 1); + puts("End"); + HANDLE hThread_1 = CreateThread(NULL, 0, clocks, &x, 0, NULL); + cm1 = 'd'; + + while (1) + { + + gotoxy(2 * nx - 2, ny - 1); + putchar('█'); + gotoxy(2 * nx - 2, ny - 1); + ctrl(nx, ny); + gotoxy(2 * nx - 2, ny - 1); + putchar(' '); putchar(' '); + switch (cm1) + { + case 'w': + ny--; break; + case 'd': + nx++; break; + case 's': + ny++; break; + case 'a': + nx--; break; + } + if ((2 * nx - 1 == 4 * x - 1) && (ny - 1 == 2 * y - 1)) + { + gotoxy(0, 2 * y + 1); + puts("Congratulations!!! Press Q to quit"); + printf(" Press other key to restart"); + TerminateThread(hThread_1, 1); + CloseHandle(hThread_1); + cm2 = _getch(); + (cm2 == 'q') ? exit(0) : cm2++; + break; + } + } + + } + + return 0; +}// Puzzle Game +/* This algorithm is a randomized version of Prim's algorithm. + 1.Start with a grid full of walls. + 2.Pick a cell, mark it as part of the maze. Add the walls of the cell to the wall list. + 3.While there are walls in the list: + 3.1.Pick a random wall from the list. If the cell on the opposite side isn't in the maze yet: + 3.1.1.Make the wall a passage and mark the cell on the opposite side as part of the maze. + 3.1.2.Add the neighboring walls of the cell to the wall list. + 3.2.Remove the wall from the list. + + It will usually be relatively easy to find the way to the starting cell, but hard to find the way + anywhere else. + + Note that simply running classical Prim's on a graph with random edge weights would create mazes + stylistically identical to Kruskal's, because they are both minimal spanning tree algorithms. + Instead, this algorithm introduces stylistic variation because the edges closer to the starting + point have a lower effective weight. + */ + From 0636e3573682c5a3cfa0d5a15a4900e3584910d0 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Sat, 4 Mar 2017 13:30:50 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=BE=AE=E5=B0=8F=E7=9A=84=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- practices/c/level1/p09_maze/lvl1_9_maze.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/practices/c/level1/p09_maze/lvl1_9_maze.c b/practices/c/level1/p09_maze/lvl1_9_maze.c index 6ec96f92..5d66e6b7 100644 --- a/practices/c/level1/p09_maze/lvl1_9_maze.c +++ b/practices/c/level1/p09_maze/lvl1_9_maze.c @@ -128,12 +128,10 @@ DWORD WINAPI clocks(LPVOID lpParameter) int i = 0; while (1) { - Sleep(250); - Sleep(250); + Sleep(500); gotoxy(4 * x + 5, 3); printf("Time: %ds", i++); - Sleep(250); - Sleep(250); + Sleep(500); } } From 6603088fdd0d963f9b74723e060a535a97799ed4 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Thu, 20 Apr 2017 18:34:25 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E4=BF=AE=E4=BF=AE=E8=A1=A5=E8=A1=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cpp那边还在施工中,写了很多半成品,c语言那边用重写了1_2&1_5, 1_6最近应该也会重写,主要是优化了算法 --- .../c/level1/p02_isPrime/lvl1_2_isPrime.c | 107 ++--- .../c/level1/p05_allPrimes/lvl1_5_allPrimes.c | 97 ++--- .../c/level1/p06_Goldbach/lvl1_6_Goldbach.c | 10 +- practices/c/level1/p09_maze/lvl1_9_maze.c | 4 +- .../level1/p10_pushBoxes/lvl1_10_pushBoxes.c | 390 ++++++++++++++++++ .../p11_linkedList/lvl1_11_LinkedList.c | 114 +++++ .../level1/p12_warehouse/lvl1_12_warehouse.c | 258 ++++++++++++ practices/cpp/level1/p01_Queue/main.cpp | 32 ++ practices/cpp/level1/p01_Queue/queue.cpp | 49 +++ practices/cpp/level1/p01_Queue/queue.h | 14 + .../cpp/level1/p06_CircleAndPoint/circle.cpp | 42 ++ .../cpp/level1/p06_CircleAndPoint/circle.h | 26 ++ .../cpp/level1/p06_CircleAndPoint/main.cpp | 20 + 13 files changed, 1007 insertions(+), 156 deletions(-) create mode 100644 practices/c/level1/p10_pushBoxes/lvl1_10_pushBoxes.c create mode 100644 practices/c/level1/p11_linkedList/lvl1_11_LinkedList.c create mode 100644 practices/c/level1/p12_warehouse/lvl1_12_warehouse.c create mode 100644 practices/cpp/level1/p01_Queue/main.cpp create mode 100644 practices/cpp/level1/p01_Queue/queue.cpp create mode 100644 practices/cpp/level1/p01_Queue/queue.h create mode 100644 practices/cpp/level1/p06_CircleAndPoint/circle.cpp create mode 100644 practices/cpp/level1/p06_CircleAndPoint/circle.h create mode 100644 practices/cpp/level1/p06_CircleAndPoint/main.cpp diff --git a/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c b/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c index d9ee28c5..eaa02357 100644 --- a/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c +++ b/practices/c/level1/p02_isPrime/lvl1_2_isPrime.c @@ -1,105 +1,58 @@ -// isPrime.cpp +// isPrime.c // -#include "stdafx.h" -/* code: Linked list Step0 for eratosthenes Prime (change from lvl1_5) - * author: Kyrios0 - * date: 2017.02.21 - * state: finished - * version: 1.0.2 - */ + +/* code: Step0 for Eula Prime (change from lvl1_5) +* author: Kyrios0 +* date: 2017.02.21 +* state: finished +* version: 2.0.2 +*/ #include #include//malloc() #include #include -typedef struct linked { - int data; - linked *next; -}linked; - -linked* creat(int length) -{ - linked *head, *tail, *p; - int x; - head = tail = NULL; - for (x = 0; x < length; x++) - { - p = (linked *)malloc(sizeof(linked)); - p->data = x + 2;//0 and 1 aren't prime or composite number - p->next = NULL; - - if (head == NULL) - { - head = tail = p; - } - else - { - tail = tail->next = p; - } - } - - return head; -} int main(int argc, char** argv) { - long len, userNumber, finalNumber = 2; - + long max; puts("Prime Number Detection System"); puts("Please enter the number you want to detect(It should be no less than 2)"); - scanf("%ld", &userNumber); - - len = userNumber; - linked *current, *head, *temp, *currenthead; - current = creat(len); - head = current; - currenthead = head; - - puts("Working..."); - - for (long i = 0; ; i++) + scanf("%ld", &max); + + long ct = 0; + int *judge; + judge = (int*)malloc((max + 1) * sizeof(int)); + long *prime; + prime = (long*)malloc((max + 1) * sizeof(long)); + memset(prime, 0, (max + 1) * sizeof(prime)); + memset(judge, 0, (max + 1) * sizeof(judge)); + judge[0] = judge[1] = 1; + for (long i = 2; i < max; i++) { - if (i * i >= len)//Termination + if (!judge[i]) { - break; + prime[ct] = i; + ct++; } - while (current->next != NULL) + for (int j = 0; j < ct && i * prime[j] <= max; j++) { - temp = current->next; - - while (temp->data % currenthead->data == 0)//Delete this number - { - current->next = temp->next; - temp = temp->next; - len--; - if (temp == NULL) - { - break; - } - } - - if (current->next == NULL) + judge[i * prime[j]] = 1; + if (!(i%prime[j])) { break; } - else - { - current = current->next; - } - } - finalNumber = current->data; - currenthead = currenthead->next; - current = currenthead; + } } - - printf(((finalNumber == userNumber) || (userNumber == 2)) ? ("%d is a prime number\n") : ("%d is a composite number\n"), userNumber); + + printf((!judge[max]) ? ("%d is a prime number\n") : ("%d is a composite number\n"), max); system("pause"); return 0; -} \ No newline at end of file +} diff --git a/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c b/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c index ae859dcf..99a037a5 100644 --- a/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c +++ b/practices/c/level1/p05_allPrimes/lvl1_5_allPrimes.c @@ -1,95 +1,45 @@ -// allPrime.cpp +// allPrime.c // -#include "stdafx.h" -/* code: Linked list Step0 for eratosthenes +/* code: Step0 for Eula * author: Kyrios0 * date: 2017.02.21 * state: finished - * version: 1.0.2 + * version: 2.0.2 */ - +#define MAX 200000000 #include #include//malloc() #include #include -typedef struct linked { - int data; - linked *next; -}linked; - -linked* creat(int length) -{ - linked *head, *tail, *p; - int x; - head = tail = NULL; - - for (x = 0; x < length; x++) - { - p = (linked *)malloc(sizeof(linked)); - p->data = x + 2;//0 and 1 aren't prime or composite number - p->next = NULL; - - if (head == NULL) - { - head = tail = p; - } - else - { - tail = tail->next = p; - } - } - - return head; -} +int judge[MAX]; +long prime[MAX]; int main(int argc, char** argv) { - long len = 10000000;//about 40s - linked *current, *head, *temp, *currenthead; - current = creat(len); - head = current; - currenthead = head; - - puts("Working..."); - - for (long i = 0; ; i++) + long ct = 0; + judge[0] = judge[1] = 1; + + for (long i = 2; i < MAX; i++) { - if (i * i >= len)//Termination + if (!judge[i]) { - break; + prime[ct] = i; + ct++; } - - while (current->next != NULL) + + for (int j = 0; j < ct && i * prime[j] < MAX; j++) { - temp = current->next; - - while (temp->data % currenthead->data == 0)//Delete this number - { - current->next = temp->next; - temp = temp->next; - len--; - if (temp == NULL) - { - break; - } - } - - if (current->next == NULL) + judge[i * prime[j]] = 1; + if (!(i%prime[j])) { break; } - else - { - current = current->next; - } + } - - currenthead = currenthead->next; - current = currenthead; } FILE *fpt; @@ -97,13 +47,16 @@ int main(int argc, char** argv) puts("Start writing... Please wait a moment."); - for (int i = 0; i < len; i++)//output + for (long i = 0; ; i++)//output { - fprintf(fpt, "%d, ", head->data); - head = head->next; + if (!prime[i]) + { + break; + } + fprintf(fpt, "%d, ", prime[i]); if ((i % 100000 == 0) && (i != 0)) { - printf("%d numbers has been writen: %d \n", i, head->data); + printf("%d numbers has been writen: %d \n", i, prime[i]); } } diff --git a/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c b/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c index 603b506f..e7fdebdc 100644 --- a/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c +++ b/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c @@ -50,10 +50,10 @@ int main(int argc, char** argv) { long len = 1000000;//about 8min int primeList[80000]; - linked *current, *head, *temp, *currenthead; + linked *current, *head, *temp, *currentHead; current = creat(len); head = current; - currenthead = head; + currentHead = head; puts("Working..."); @@ -68,7 +68,7 @@ int main(int argc, char** argv) { temp = current->next; - while (temp->data % currenthead->data == 0)//Delete this number + while (temp->data % currentHead->data == 0)//Delete this number { current->next = temp->next; temp = temp->next; @@ -89,8 +89,8 @@ int main(int argc, char** argv) } } - currenthead = currenthead->next; - current = currenthead; + currentHead = currentHead->next; + current = currentHead; } FILE *fpt; diff --git a/practices/c/level1/p09_maze/lvl1_9_maze.c b/practices/c/level1/p09_maze/lvl1_9_maze.c index 5d66e6b7..e0ba1686 100644 --- a/practices/c/level1/p09_maze/lvl1_9_maze.c +++ b/practices/c/level1/p09_maze/lvl1_9_maze.c @@ -1,4 +1,4 @@ -// Puzzle.cpp : 定义控制台应用程序的入口点。 +// Puzzle.c // /* code: Puzzle Game for Kira @@ -135,7 +135,7 @@ DWORD WINAPI clocks(LPVOID lpParameter) } } -int main(void) +int main(int argc, char** argv) { system("color 0f"); while (1) diff --git a/practices/c/level1/p10_pushBoxes/lvl1_10_pushBoxes.c b/practices/c/level1/p10_pushBoxes/lvl1_10_pushBoxes.c new file mode 100644 index 00000000..1d8d62d2 --- /dev/null +++ b/practices/c/level1/p10_pushBoxes/lvl1_10_pushBoxes.c @@ -0,0 +1,390 @@ +// Box.c +// + +/* code: Box for Kira + * author: Kyrios0 + * date: 2017.03.04 + * state: finished + * version: 1.1.0 + * when you run it first, please creat s01.txt s02.txt s03.txt. + */ + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include + +void gotoxy(int x, int y); +int ctrl(int x, int y); +void writeScreen(LPCWSTR str, int x, int color); +void go(char cm1); +void push(char cm1); +unsigned int SDBMHash(char *str); +void loadMap(int lvl); +void loadBox(int lvl); +void makeMap(); +void loadBox(int lvl); +void makeMap(); +int loadScore(int lvl); +int saveScore(int lvl, int score); +int loadScore(int lvl); +int saveScore(int lvl, int step); + +char m[50][50]; +char cm1, cm2; +int nx = 3, ny = 2; +int x[6], y[6]; + +void gotoxy(int x, int y) +{ + HANDLE hOutput; + COORD coo; + coo.X = x; + coo.Y = y; + hOutput = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleCursorPosition(hOutput, coo); +} +//a simple hash function +unsigned int SDBMHash(char *str) +{ + unsigned int hash = 0; + + while (*str) + { + hash = (*str++) + (hash << 6) + (hash << 16) - hash; + } + + return (hash & 0x7FFFFFFF); +} +//enhanced gotoxy, it could wiriting something on the screen with different colors +void writeScreen(LPCWSTR str, int x, int y, int color) +{ + COORD coord; + DWORD buf[128]; + HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); + coord.Y = y; + coord.X = x; + FillConsoleOutputAttribute(hConsoleOutput, color, 2, coord, buf); + WriteConsoleOutputCharacter(hConsoleOutput, str, 1, coord, buf); +} + +void go(char cm1) +{ + switch (cm1) + { + case 'w': + ny--; break; + case 'd': + nx++; break; + case 's': + ny++; break; + case 'a': + nx--; break; + } +} + +void push(char cm1) +{ + switch (cm1) + { + case 'w': + ny--; + writeScreen(L"█", 2 * nx - 2, ny - 2, FOREGROUND_GREEN); + m[nx][ny - 1] = 2; + break; + case 'd': + nx++; + writeScreen(L"█", 2 * nx, ny - 1, FOREGROUND_GREEN); + m[nx + 1][ny] = 2; + break; + case 's': + ny++; + writeScreen(L"█", 2 * nx - 2, ny, FOREGROUND_GREEN); + m[nx][ny + 1] = 2; + break; + case 'a': + nx--; + writeScreen(L"█", 2 * nx - 4, ny - 1, FOREGROUND_GREEN); + m[nx - 1][ny] = 2; + break; + } + m[nx][ny] = 1; +} + +int ctrl(int x, int y) +{ + while (1) + { + char cm2 = _getch(); + + if ((cm2 == -32) && (cm2 != 'w') && (cm2 != 'a') && (cm2 != 's') && (cm2 != 'd')) + { + switch (cm2 = _getch()) + { + case 72: cm2 = 'w'; break; + case 80: cm2 = 's'; break; + case 75: cm2 = 'a'; break; + case 77: cm2 = 'd'; break; + } + }//arrow key to wasd + + if (( ((m[x][y + 1] == 2) && (cm2 == 's')) + || ((m[x + 1][y] == 2) && (cm2 == 'd')) + || ((m[x][y - 1] == 2) && (cm2 == 'w')) + || (((x - 1 == 0) || (m[x - 1][y] == 2)) && (cm2 == 'a'))) == 0)//if no box + { + if (( ((m[x][y + 1] == 0) && (cm2 == 's')) + || ((m[x + 1][y] == 0) && (cm2 == 'd')) + || ((m[x][y - 1] == 0) && (cm2 == 'w')) + || (((x - 1 == 0) || (m[x - 1][y] == 0)) && (cm2 == 'a'))) == 0)//if it's vaild + { + cm1 = cm2;//Accept + return 0; + } + } + else if (((((m[x][y + 2] == 0) && (cm2 == 's')) + || ((m[x + 2][y] == 0) && (cm2 == 'd')) + || ((m[x][y - 2] == 0) && (cm2 == 'w')) + || (((x - 1 == 0) || (m[x - 2][y] == 0)) && (cm2 == 'a'))) == 0) + && ((((m[x][y + 2] == 2) && (cm2 == 's')) + || ((m[x + 2][y] == 2) && (cm2 == 'd')) + || ((m[x][y - 2] == 2) && (cm2 == 'w')) + || (((x - 1 == 0) || (m[x - 2][y] == 2)) && (cm2 == 'a'))) == 0) )//if it's vaild + { + cm1 = cm2;//Accept + return 1; + } + } +} + +void loadMap(int lvl) +{ + char buf[50][50]; + FILE *fptr; + switch (lvl) + { + case 1: + fptr = fopen("lvl01.txt", "r"); + break; + case 2: + fptr = fopen("lvl02.txt", "r"); + break; + case 3: + fptr = fopen("lvl03.txt", "r"); + break; + default: + break; + + } + for (int i = 0; i < 11; i++)//input + { + for (int j = 0; j < 1; j++) + { + fgets(&buf[i][j], 256, fptr); + if (buf[i][j] == -52) + { + break; + } + for (int k = 0; buf[i][k] != 0 && buf[i][k] != 10; k++) + { + m[i][k] = (int)(buf[i][k] - 48); + } + } + } +} + +void loadBox(int lvl) +{ + char buf[50][50]; + FILE *fptr; + switch (lvl) + { + case 1: + fptr = fopen("bag01.txt", "r"); + break; + case 2: + fptr = fopen("bag02.txt", "r"); + break; + case 3: + fptr = fopen("bag03.txt", "r"); + break; + default: + break; + } + for (int i = 0; i < 2; i++)//input + { + fgets(&buf[0][0], 128, fptr); + for (int j = 0; j < 12; j += 4) + { + x[j / 4] = (int)(buf[0][j] - 48); + y[j / 4] = (int)(buf[0][j + 1] - 48); + x[j/4 + 3] = (int)(buf[0][j + 2] - 48); + y[j/4 + 3] = (int)(buf[0][j + 3] - 48); + } + } +} + +void makeMap() +{ + int z1, z2, x = 4, y = 4; + + for (z2 = 1; z2 <= y * 2 + 1; z2++) + { + for (z1 = 1; z1 <= x * 2 + 1; z1++) + printf(m[z1][z2] ? " " : "█"); + if (z2 <= y * 2) + { + putchar(10); + } + } +} + +int loadScore(int lvl) +{ + int score = 0; + char *charScore; + charScore = (char*)malloc(8 * sizeof(char)); + char *state; + char hash[8]; + FILE *fpsr; + switch (lvl) + { + case 1: + fpsr = fopen("s01.txt", "r"); + break; + case 2: + fpsr = fopen("s02.txt", "r"); + break; + case 3: + fpsr = fopen("s03.txt", "r"); + break; + default: + break; + } + state = fgets(hash, 128, fpsr); + if (state == NULL) + { + return 999; + } + hash[7] = '\0'; + char *currentHash; + currentHash = (char*)malloc(8 * sizeof(char)); + while (1) + { + itoa(score, charScore, 10); + itoa(SDBMHash(charScore), currentHash, 16); + if (!strcmp(hash, currentHash)) + { + break; + } + score++; + } + + return score; + +} + +int saveScore(int lvl, int step) +{ + FILE *fps; + char *newScore; + newScore = (char*)malloc(8 * sizeof(char)); + switch (lvl) + { + case 1: + fps = fopen("s01.txt", "w+"); + break; + case 2: + fps = fopen("s02.txt", "w+"); + break; + case 3: + fps = fopen("s03.txt", "w+"); + break; + default: + break; + } + itoa(step, newScore, 10); + fprintf(fps, "%x", SDBMHash(newScore)); + return 0; +} + +int main() +{ + system("color 0f"); + int level = 1; + + while (1) + { + loadMap(level); + loadBox(level); + int best = loadScore(level); + + nx = 3; ny = 2; + int step = 0, PoG; + system("mode con cols=32 lines=11"); + + makeMap(); + + writeScreen(L"█", x[0], y[0], FOREGROUND_GREEN); + writeScreen(L"█", x[1], y[1], FOREGROUND_GREEN); + writeScreen(L"█", x[2], y[2], FOREGROUND_GREEN); + writeScreen(L"▒", x[3]*2 - 2, y[3], FOREGROUND_RED | FOREGROUND_INTENSITY); + writeScreen(L"▒", x[4]*2 - 2, y[4], FOREGROUND_RED | FOREGROUND_INTENSITY); + writeScreen(L"▒", x[5]*2 - 2, y[5], FOREGROUND_RED | FOREGROUND_INTENSITY); + + gotoxy(21, 3); + puts("Step: 0"); + gotoxy(21, 4); + printf("Best: %d", best); + cm1 = 'd'; + + while (1) + { + gotoxy(2 * nx - 2, ny - 1); + printf("♂"); + gotoxy(2 * nx - 2, ny - 1); + PoG = ctrl(nx, ny); + gotoxy(2 * nx - 2, ny - 1); + putchar(' '); putchar(' '); + + PoG ? push(cm1) : go(cm1); + gotoxy(21, 3); + printf("Step: %d", ++step); + + writeScreen((m[x[3]][y[3]+1] == 2) ? L"█" : L"▒", x[3] * 2 - 2, y[3], (m[x[3]][y[3] + 1] == 2) ? FOREGROUND_GREEN | FOREGROUND_INTENSITY : FOREGROUND_RED | FOREGROUND_INTENSITY); + writeScreen((m[x[4]][y[4]+1] == 2) ? L"█" : L"▒", x[4] * 2 - 2, y[4], (m[x[4]][y[4] + 1] == 2) ? FOREGROUND_GREEN | FOREGROUND_INTENSITY : FOREGROUND_RED | FOREGROUND_INTENSITY); + writeScreen((m[x[5]][y[5]+1] == 2) ? L"█" : L"▒", x[5] * 2 - 2, y[5], (m[x[5]][y[5] + 1] == 2) ? FOREGROUND_GREEN | FOREGROUND_INTENSITY : FOREGROUND_RED | FOREGROUND_INTENSITY); + + if (m[x[3]][y[3] + 1] == 2 && m[x[4]][y[4] + 1] == 2 && m[x[5]][y[5] + 1] == 2) + { + gotoxy(0, 9); + puts("Congratulations!!!"); + if (step < best) + { + saveScore(level, step); + } + Sleep(1000); + system("cls"); + + if (level < 3) + { + level++; + break; + } + + system("mode con cols=54 lines=3"); + puts(" C language is the best language in the world!!"); + printf(" Press any key to quit"); + cm2 = _getch(); + exit(0); + } + } + + } + + return 0; +} + \ No newline at end of file diff --git a/practices/c/level1/p11_linkedList/lvl1_11_LinkedList.c b/practices/c/level1/p11_linkedList/lvl1_11_LinkedList.c new file mode 100644 index 00000000..4ccd8d80 --- /dev/null +++ b/practices/c/level1/p11_linkedList/lvl1_11_LinkedList.c @@ -0,0 +1,114 @@ +/* code: Linked list Step1 + * author: Kyrios0 + * date: 2017.03.09 + * state: unfinished + * version: 1.0.2 + */ + +#include "stdafx.h" +#include +#include +#include +#include +#include + +typedef struct linked { + int data; + linked *next; +}linked; + +linked *head, *tail; + +linked* creat(int length) +{ + linked *p; + int x; + head = tail = NULL; + + for (x = 0; x < length; x++) + { + p = (linked *)malloc(sizeof(linked)); + p->data = x + 2; + p->next = NULL; + + if (head == NULL) + { + head = tail = p; + } + else + { + tail = tail->next = p; + } + } + return head; +} + +int reverseL() +{ + linked *currentHead = head, *temp = head->next, *currentTail; + currentHead->next = NULL; currentTail = temp->next; + + while (currentTail->next != NULL) + { + if (temp != tail) + { + currentTail = temp->next; + } + temp->next = currentHead; + currentHead = temp; + temp = currentTail; + } + temp->next = currentHead; + currentHead = temp; + temp = currentTail; + + temp = head; + head = tail; + tail = head; + return 0; +} + +int main(int argc, char** argv) +{ + int len = 10; + creat(len); + linked *currentHead = head, *currentTail = tail; + + printf("Before:\t"); + for (int i = 0; i < len; i++)//output + { + printf("%d, ", currentHead->data); + currentHead = currentHead->next; + } + printf("\n"); + + reverseL(); + + currentHead = head, currentTail = tail; + printf("After:\t"); + for (int i = 0; i < len; i++)//output + { + printf("%d, ", currentHead->data); + currentHead = currentHead->next; + } + printf("\n"); + + currentHead = head, currentTail = tail; + int state = 0; + for (int i = 0; i < len; i++) + { + if (currentHead->data == 5) + { + printf("Node%d : 5\n", i+1); + state = 1; + } + currentHead = currentHead->next; + } + if (state == 0) + { + puts("5 not find: -1"); + } + _getch(); + return 0; +} + diff --git a/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c b/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c new file mode 100644 index 00000000..71955b4c --- /dev/null +++ b/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c @@ -0,0 +1,258 @@ +// house.c +// +/* author: Kyrios0 + * date: 2017.03.23 + * version:1.0.6 + * state: list unfinished//strlen * ' ' + * pop unfinished//number + */ +#include "stdafx.h" +#include +#include +#include +#include +#include +FILE* fp = fopen("house.txt", "r+"); + +typedef struct list { + int data; + char name[128]; + list *next; +}list; + +list *head = NULL, *currentTail = NULL; + +list* getList() +{ + list *tail, *p; + char *state; + + p = (list *)malloc(sizeof(list)); + while (!feof(fp)) + { + state = fgets(p->name, 128, fp); + if (state == NULL)//for empty list + { + return head; + } + p->name[strlen(p->name) - 1] = '\0'; + fscanf(fp, "%d", &p->data); + fgetc(fp); + p->next = NULL; + tail = p; + if (head->next == NULL) + { + head->next = tail; + } + p = (list *)malloc(sizeof(list)); + tail->next = p; + } + free(p); + p = NULL; + tail->next = NULL; + return tail; +} + +void help() +{ + puts("\n\tGNU bash, Version 4.3.42(1)-release (x86_64-pc-kyrinux-gnu)\n\n\ + \tCommand\t\tInfo\n\ + \tlist\t\tView\n\ + \tpush\t\tWrite\n\ + \tpop\t\tDelete\n\ + \tquit\t\tQuit\n"); +} + +int pop() +{ + list *p = head->next, *prev = NULL; + if (p == NULL)//for empty list + { + puts("ERROR: The list is empty!"); + return -1; + } + puts("Which one do you want to remove?"); + int i = 1, j = 1, popN; + while (p->next != NULL) + { + printf("%d:%s\n", i, p->name); + p = p->next; + i++; + } + /*if (i == 1) + { + strcpy(p->name, "Empty");//p->name = "Empty"; + }*/ + printf("%d:%s\n", i, p->name); + while (1)//filter + { + printf("Please enter the serial number(1-%d)(Enter 0 to exit pop):", i); + scanf("%d", &popN); + getchar(); + if (popN == 0) + { + return 1; + } + if (popN >= 1 && popN <= i) + { + break; + } + puts("Invaild serial number"); + } + + p = head->next; + while (j < popN) + { + prev = p; + p = p->next; + j++; + } + printf("%d:%s\n", j, p->name); + if (popN == 1) + { + head = head->next; + } + else + { + if (popN == i) + { + currentTail = prev; + currentTail->next = NULL; + } + else + { + prev->next = p->next; + } + } + puts("You poped it!"); + return 0; + +} + +int allList() +{ + list *p = head->next; + if (p == NULL)//for empty list + { + puts("\n\tEMPTY\n"); + return -1; + } + printf("\n\tName\t\tAmount\n"); + while (p->next != NULL) + { + printf("\t%s\t\t%5d\n", p->name, p->data); + p = p->next; + } + printf("\t%s\t\t%5d\n\n", p->name, p->data); + return 0; +} + +void invalid(char *cm) +{ + cm[strlen(cm) - 1] = '\0'; + printf("\"%s\" isn't a valid command, Type \"help\" for more information.\n", cm); +} + +int push() +{ + list *p; + char yn; + while (1) + { + p = (list *)malloc(sizeof(list)); + p->next = NULL; + printf("Please enter name: "); + fgets(p->name, 128, stdin); + p->name[strlen(p->name) - 1] = '\0'; + printf("Please enter amount:"); + scanf_s("%d", &p->data); + getchar(); + if (p->data <= 0) + { + puts("ERROR: The number of items must be greater than zero."); + free(p); + return -1; + } + printf("\"%s\" has been added. Would you like to continue to push?(y/n)", p->name); + currentTail->next = p; + currentTail = p; + yn = getchar(); + getchar(); + while (yn != 'n' && yn != 'y') + { + printf("\"%s\" has been added. Would you like to continue to push?(y/n)", p->name); + yn = getchar(); + getchar(); + } + if (yn == 'n') + { + break; + } + } + return 0; +} + +int saveData() +{ + FILE* fpw = fopen("house.txt", "w+"); + list *p = head->next; + if (p == NULL)//for empty list + { + return -1; + } + while (p->next != NULL) + { + fprintf(fpw, "%s\n%d\n", p->name, p->data); + p = p->next; + } + + fprintf(fpw, "%s\n%d", p->name, p->data); + return 0; +} + +int main(int argc, char **argv) +{ + char cm[128] = "Kyrios"; + puts("Kyrinux 1.0.0 (default, Mar 10 2017, 11:07:07) [MSC v.1500 64 bit (AMD64)] on win64"); + puts("Type \"help\" for more information."); + + head = (list *)malloc(sizeof(list)); + head->next = NULL; + currentTail = getList(); + while (1) + { + printf("root@user: "); + fgets(cm, 128, stdin); + if (!strcmp(cm, "help\n")) + { + help(); + } + else if (!strcmp(cm, "push\n")) + { + push(); + } + else if (!strcmp(cm, "pop\n")) + { + pop(); + } + else if (!strcmp(cm, "list\n")) + { + allList(); + } + else if (!strcmp(cm, "quit\n")) + { + break; + } + else + { + invalid(cm); + } + + } + saveData(); + puts("Kyrios hope you'll have a nice day, bye."); + puts("Press any key to quit..."); + _getch(); + return 0; +} + diff --git a/practices/cpp/level1/p01_Queue/main.cpp b/practices/cpp/level1/p01_Queue/main.cpp new file mode 100644 index 00000000..e56c2c5d --- /dev/null +++ b/practices/cpp/level1/p01_Queue/main.cpp @@ -0,0 +1,32 @@ +/* + * Author: Kyrios0 + * Date: 2016.04 + * To-Do List: + * ~~isEmpty~~ + * ~~isFull~~ + * ~~append~~ + * ~~pop~~ + * ~~Optimization~~ + * and more? + * State: Completed + */ +#include +#include "queue.h" + +int main(int argc, char** argv) +{ + Queue queue; + + if(queue.isEmpty()) + { + puts("Status: Empty"); + } + if(queue.isFull()) + { + puts("Status: Full"); + } + queue.append(1); + queue.pop(); + + return 0; +} diff --git a/practices/cpp/level1/p01_Queue/queue.cpp b/practices/cpp/level1/p01_Queue/queue.cpp new file mode 100644 index 00000000..69ec2652 --- /dev/null +++ b/practices/cpp/level1/p01_Queue/queue.cpp @@ -0,0 +1,49 @@ +#include + +#include "queue.h" + + + +bool Queue::isEmpty() +{ + if(tail == head) + { + return true; + } + return false; +} + +bool Queue::isFull() +{ + if((tail + 1) % 100 == head) + { + return true; + } + return false; +} + +int Queue::append(int x) +{ + if(isFull()) + { + puts("Error: List is full, appending failed."); + return -1; + } + data[tail] = x; + tail++; + tail = tail % 100; + return 0; +} +int Queue::pop() +{ + if(isEmpty()) + { + puts("Error: List is empty, poping failed."); + return -1; + } + data[head] = 0; + head++; + head = head % 100; + return 0; +} + diff --git a/practices/cpp/level1/p01_Queue/queue.h b/practices/cpp/level1/p01_Queue/queue.h new file mode 100644 index 00000000..a748e57b --- /dev/null +++ b/practices/cpp/level1/p01_Queue/queue.h @@ -0,0 +1,14 @@ + +class Queue +{ + private: + int head = 0; + int tail = 0; + int data[100]; + public: + bool isEmpty(); + bool isFull(); + int append(int x); + int pop(); +}; + diff --git a/practices/cpp/level1/p06_CircleAndPoint/circle.cpp b/practices/cpp/level1/p06_CircleAndPoint/circle.cpp new file mode 100644 index 00000000..a4af9d84 --- /dev/null +++ b/practices/cpp/level1/p06_CircleAndPoint/circle.cpp @@ -0,0 +1,42 @@ +#include "circle.h" + +Point::Point(double nx, double ny) +{ + this->x = nx; + this->y = ny; +} + +void Point::move(double nx, double ny) +{ + this->x += nx; + this->y += ny; +} + +void Point::reset(double nx, double ny) +{ + this->x = nx; + this->y = ny; +} + +Circle::Circle(double r, double x, double y) +{ + Point p(x, y); + this->radius = r; + this->center = p; +} + +Circle::Circle(double r, Point &p) +{ + this->radius = r; + this->center = p; +} + +void Circle::move(double cx, double cy) +{ + (this->center).move(cx, cy); +} + +void Circle::moveTo(double nx, double ny) +{ + (this->center).reset(nx, ny); +} diff --git a/practices/cpp/level1/p06_CircleAndPoint/circle.h b/practices/cpp/level1/p06_CircleAndPoint/circle.h new file mode 100644 index 00000000..5fd6a05e --- /dev/null +++ b/practices/cpp/level1/p06_CircleAndPoint/circle.h @@ -0,0 +1,26 @@ + +class Point +{ + private: + double x; + double y; + + public: + Point(){}; + Point(double nx, double ny); + void move(double nx, double ny); + void reset(double nx, double ny); + +}; + +class Circle +{ + private: + Point center; + double radius; + public: + Circle(double r, double x, double y); + Circle(double r, Point &p); + void move(double cx, double cy); + void moveTo(double nx, double ny); +}; diff --git a/practices/cpp/level1/p06_CircleAndPoint/main.cpp b/practices/cpp/level1/p06_CircleAndPoint/main.cpp new file mode 100644 index 00000000..cba2999e --- /dev/null +++ b/practices/cpp/level1/p06_CircleAndPoint/main.cpp @@ -0,0 +1,20 @@ +/* + * Author: Kyrios0 + * Date: 2016.04 + * To-Do List: + * Circle + * Point + * State: Processing + */ +#include +#include "circle.h" +using namespace std; + + +int main(int argc, char** argv) { + Point p1(2.0, 2.0); + Circle ra(5.0, p1); + ra.move(1.0, 2.0); + ra.moveTo(3.0, 3.0); + return 0; +} From 4d35a10fbdf6a7cc3b35213364e14acba4c62361 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Thu, 27 Apr 2017 10:39:02 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=BE=AE=E5=B0=8F=E7=9A=84=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重写了Goldbach的素数筛取部分,新增cpp1_3和1_5 --- .../c/level1/p06_Goldbach/lvl1_6_Goldbach.c | 110 +++-------- .../cpp/level1/p03_SafeArray/SafeArray.cpp | 28 +++ .../cpp/level1/p03_SafeArray/SafeArray.h | 12 ++ practices/cpp/level1/p03_SafeArray/main.cpp | 9 + practices/cpp/level1/p05_Canvas/canvas.cpp | 173 ++++++++++++++++++ practices/cpp/level1/p05_Canvas/canvas.h | 57 ++++++ practices/cpp/level1/p05_Canvas/main.cpp | 78 ++++++++ 7 files changed, 384 insertions(+), 83 deletions(-) create mode 100644 practices/cpp/level1/p03_SafeArray/SafeArray.cpp create mode 100644 practices/cpp/level1/p03_SafeArray/SafeArray.h create mode 100644 practices/cpp/level1/p03_SafeArray/main.cpp create mode 100644 practices/cpp/level1/p05_Canvas/canvas.cpp create mode 100644 practices/cpp/level1/p05_Canvas/canvas.h create mode 100644 practices/cpp/level1/p05_Canvas/main.cpp diff --git a/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c b/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c index e7fdebdc..b85d6e93 100644 --- a/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c +++ b/practices/c/level1/p06_Goldbach/lvl1_6_Goldbach.c @@ -1,127 +1,70 @@ -// Goldbach.cpp +// Goldbach.c // -#include "stdafx.h" /* code: Goldbach (change from lvl1_5) - * author: Kyrios0 - * date: 2017.02.26 - * state: finished - * version: 1.0.1 - */ +* author: Kyrios0 +* date: 2017.02.26 +* state: finished +* version: 2.0.1 +*/ #include -#include//malloc() #include #include - -typedef struct linked { - int data; - linked *next; -}linked; - -linked* creat(int length) -{ - linked *head, *tail, *p; - int x; - head = tail = NULL; - - for (x = 0; x < length; x++) - { - p = (linked *)malloc(sizeof(linked)); - p->data = x + 2;//0 and 1 aren't prime or composite number - p->next = NULL; - - if (head == NULL) - { - head = tail = p; - } - else - { - tail = tail->next = p; - } - } - - return head; -} - - +int prime[1000000]; +int judge[80000]; int main(int argc, char** argv) { - long len = 1000000;//about 8min - int primeList[80000]; - linked *current, *head, *temp, *currentHead; - current = creat(len); - head = current; - currentHead = head; + long MAX = 1000000;//about 8min + long ct = 0; + judge[0] = judge[1] = 1; - puts("Working..."); - - for (long i = 0; ; i++) + for (long i = 2; i < MAX; i++) { - if (i * i >= len)//Termination + if (!judge[i]) { - break; + prime[ct] = i; + ct++; } - while (current->next != NULL) + for (int j = 0; j < ct && i * prime[j] < MAX; j++) { - temp = current->next; - - while (temp->data % currentHead->data == 0)//Delete this number - { - current->next = temp->next; - temp = temp->next; - len--; - if (temp == NULL) - { - break; - } - } - - if (current->next == NULL) + judge[i * prime[j]] = 1; + if (!(i%prime[j])) { break; } - else - { - current = current->next; - } + } - currentHead = currentHead->next; - current = currentHead; } FILE *fpt; fpt = fopen("Goldbach.txt", "w"); puts("Start writing... Please wait a moment."); - for (int i = 0; i < len; i++)//output - { - primeList[i] = head->data;//printf("%d, ", head->data); - head = head->next; - } - int x = 0, y = 0; + for (int i = 4; i <= 1000000;) { - if (primeList[x] < i - 300)//The speed can be increased by 40% if i == 100,000 + if (prime[x] < i - 300)//The speed can be increased by 40% if i == 100,000 { x++; } - if (i - primeList[x] != primeList[y]) + + if (i - prime[x] != prime[y]) { x++; - if (primeList[x] > 1000000) + if (prime[x] > 1000000) { x = 0; y++; } } else - { - fprintf(fpt, "%d = %d + %d\n", i, primeList[x], primeList[y]);//printf("%d = %d + %d\n", i, primeList[x], primeList[y]); + { + fprintf(fpt, "%d = %d + %d\n", i, prime[x], prime[y]); if (i % 20000 == 0) { printf("%d lines has been writen.\n", i / 2); @@ -129,6 +72,7 @@ int main(int argc, char** argv) x = 0; y = 0, i += 2; continue; } + } puts("DONE!"); diff --git a/practices/cpp/level1/p03_SafeArray/SafeArray.cpp b/practices/cpp/level1/p03_SafeArray/SafeArray.cpp new file mode 100644 index 00000000..c8d4bd4c --- /dev/null +++ b/practices/cpp/level1/p03_SafeArray/SafeArray.cpp @@ -0,0 +1,28 @@ +#include "SafeArray.h" +#include + +int capbility; + +SafeArray::SafeArray(int cap) +{ + data = new int [cap + 1];//extra space for saving error data + capbility = cap; +} + +SafeArray::~SafeArray() +{ + delete data; +} + +int& SafeArray::operator[] (int n) +{ + if(n >= 0 && n < capbility) + { + return data[n]; + } + else + { + printf("Error: Out of limit"); + return data[capbility]; + } +} diff --git a/practices/cpp/level1/p03_SafeArray/SafeArray.h b/practices/cpp/level1/p03_SafeArray/SafeArray.h new file mode 100644 index 00000000..935c4990 --- /dev/null +++ b/practices/cpp/level1/p03_SafeArray/SafeArray.h @@ -0,0 +1,12 @@ + +class SafeArray +{ + + private: + int *data; + int capbility; + public: + SafeArray(int cap); + ~SafeArray(); + int& operator[] (int n); +}; diff --git a/practices/cpp/level1/p03_SafeArray/main.cpp b/practices/cpp/level1/p03_SafeArray/main.cpp new file mode 100644 index 00000000..3ae2a0d7 --- /dev/null +++ b/practices/cpp/level1/p03_SafeArray/main.cpp @@ -0,0 +1,9 @@ +#include +#include "SafeArray.h" + +int main(int argc, char** argv) { + SafeArray a(100); + a[0] = 0; + a[200] = 1; + return 0; +} diff --git a/practices/cpp/level1/p05_Canvas/canvas.cpp b/practices/cpp/level1/p05_Canvas/canvas.cpp new file mode 100644 index 00000000..93352125 --- /dev/null +++ b/practices/cpp/level1/p05_Canvas/canvas.cpp @@ -0,0 +1,173 @@ +#include +#include +#include "canvas.h" +using namespace std; + +Point::Point(double nx, double ny) +{ + this->x = nx; + this->y = ny; +} + +Circle::Circle(double r, double x, double y) +{ + Point p(x, y); + this->radius = r; + this->center = p; +} + +Circle::Circle(double r, Point &p) +{ + this->radius = r; + this->center = p; +} + +Rectan::Rectan(double l, double h, double x, double y, double the) +{ + Point p(x, y); + this->len = l; + this->hei = h; + this->theta = the; + this->center = p; +} + +Rectan::Rectan(double l, double h, Point &p, double the) +{ + this->len = l; + this->hei = h; + this->theta = the; + this->center = p; +} + +void Canvas::paint() +{ + puts("\nCircles:"); + if (circles.size() == 0) + { + puts("None"); + } + for (int i = 0; i < circles.size(); i++) + { + if (circles[i].radius != 0) + { + printf("%d.Circle: center:(%.2lf, %.2lf), radius: %.2lf\n", i+1, circles[i].center.x, circles[i].center.y, circles[i].radius); + } + } + + puts("\nRectangles:"); + if (rectans.size() == 0) + { + puts("None"); + } + for (int i = 0; i < rectans.size(); i++) + { + if (rectans[i].len != 0) + { + printf("%d.Rectanle: center:(%.2lf, %.2lf), length: %.2lf, height: %.2lf, theta: %.2lf\n", i+1, rectans[i].center.x, rectans[i].center.y, rectans[i].len, rectans[i].hei, rectans[i].theta); + } + } + puts(""); +} + +void Canvas::add() +{ + int mod = 0; + Circle newCir; + Rectan newRec; + printf("Please confirm the type of item you will add\n1.Circle\n2.Rectangle\n:"); + cin >> mod; + getchar(); + switch (mod) + { + case 1: + printf("Please enter radius: "); + std::cin >> newCir.radius; + printf("Please enter x and y of center point: "); + std::cin >> newCir.center.x >> newCir.center.y; + getchar(); + circles.push_back(newCir); + puts("Add success!"); + break; + case 2: + printf("Please enter length and height: "); + std::cin >> newRec.len >> newRec.hei; + printf("Please enter x and y of center point: "); + std::cin >> newRec.center.x >> newRec.center.y; + printf("Please enter theta: "); + std::cin >> newRec.theta; + getchar(); + rectans.push_back(newRec); + puts("Add success!"); + break; + default: + puts("Error: Invalid mode!"); + } + +} + +void Canvas::del() +{ + int mod = 0, serial = 0; + vector::iterator itc; + vector::iterator itr; + printf("Please confirm the type of item you will delete\n1.Circle\n2.Rectangle\n:"); + cin >> mod; + getchar(); + switch (mod) + { + case 1: + if (circles.size() == 0) + { + puts("Error: no circle!"); + break; + } + puts("\nLists: "); + for (int i = 0; i < circles.size(); i++) + { + if (circles[i].radius != 0) + { + printf("%d.Circle: center:(%.2lf, %.2lf), radius: %.2lf\n", i + 1, circles[i].center.x, circles[i].center.y, circles[i].radius); + } + } + puts("\nWhich one do you want to remove?"); + cin >> serial; + getchar(); + if (serial < 1 || serial > circles.size()) + { + puts("Error: Wrong serial number!"); + break; + } + itc = circles.begin() + serial - 1; + itc = circles.erase(itc); + puts("Delete success!"); + break; + case 2: + if (rectans.size() == 0) + { + puts("Error: no rectangle!"); + break; + } + puts("\nLists: "); + for (int i = 0; i < rectans.size(); i++) + { + if (rectans[i].len != 0) + { + printf("%d.Rectanle: center:(%.2lf, %.2lf), length: %.2lf, height: %.2lf, theta: %.2lf\n", i + 1, rectans[i].center.x, rectans[i].center.y, rectans[i].len, rectans[i].hei, rectans[i].theta); + } + } + puts("\nWhich one do you want to remove?"); + cin >> serial; + getchar(); + if (serial < 1 || serial > rectans.size()) + { + puts("Error: Wrong serial number!"); + break; + } + itr = rectans.begin() + serial - 1; + itr = rectans.erase(itr); + puts("Delete success!"); + break; + default: + puts("Error: Invalid mode!"); + } +} \ No newline at end of file diff --git a/practices/cpp/level1/p05_Canvas/canvas.h b/practices/cpp/level1/p05_Canvas/canvas.h new file mode 100644 index 00000000..4f3b6326 --- /dev/null +++ b/practices/cpp/level1/p05_Canvas/canvas.h @@ -0,0 +1,57 @@ +#include +using namespace std; + +class Point; +class Circle; +class Rectan; +class Canvas; + +class Point +{ +private: + double x; + double y; + +public: + Point() {}; + Point(double nx, double ny); + friend Canvas; +}; + +class Circle +{ +private: + Point center; + double radius; +public: + Circle() {}; + Circle(double r, double x, double y); + Circle(double r, Point &p); + friend Canvas; +}; + +class Rectan +{ +private: + Point center; + double len; + double hei; + double theta; +public: + Rectan() {}; + Rectan(double l, double h, double x, double y, double the); + Rectan(double l, double h, Point &p, double the = 0); + friend Canvas; +}; + +class Canvas +{ +private: + vector circles; + vector rectans; +public: + Canvas() {}; + void paint(); + void add(); + void del(); +}; \ No newline at end of file diff --git a/practices/cpp/level1/p05_Canvas/main.cpp b/practices/cpp/level1/p05_Canvas/main.cpp new file mode 100644 index 00000000..af854484 --- /dev/null +++ b/practices/cpp/level1/p05_Canvas/main.cpp @@ -0,0 +1,78 @@ +/* +* Author: Kyrios0 +* Date: 2016.04 +* To-Do List: +* ~~Circle&Rectan~~ +* ~~paint~~ +* ~~add~~ + * addCir + * addRec +* ~~del~~ + * delCir + * delRec +* ~~help~~ +* Optimization +* and more? +* State: Processing +*/ +#include +#include +#include +#include "canvas.h" + +void invalid(char *cm) +{ + cm[strlen(cm) - 1] = '\0'; + printf("\"%s\" isn't a valid command, Type \"help\" for more information.\n", cm); +} + +void help() +{ + puts("\n\tGNU bash, Version 4.3.42(1)-release (x86_64-pc-kyanvas-gnu)\n\n\ + \tCommand\t\tInfo\n\ + \tadd\t\tAdd a circle or rectangle\n\ + \tdel\t\tDelete an item\n\ + \tpaint\t\tDisplay all items\n\ + \tquit\t\tQuit\n"); +} + +int main(int argc, char** argv) { + char cm[128] = "Kyrios"; + puts("Kyanvas 1.0.0 (default, Apr 25 2017, 09:18:07) [MSC v.1500 64 bit (AMD64)] on win64"); + puts("Type \"help\" for more information."); + Canvas canvas; + while (1) + { + printf("root@user: "); + fgets(cm, 128, stdin); + if (!strcmp(cm, "help\n")) + { + help(); + } + else if (!strcmp(cm, "paint\n")) + { + canvas.paint(); + } + else if (!strcmp(cm, "add\n")) + { + canvas.add(); + } + else if (!strcmp(cm, "del\n")) + { + canvas.del(); + } + else if (!strcmp(cm, "quit\n")) + { + break; + } + else + { + invalid(cm); + } + + } + puts("Kyrios hope you'll have a nice day, bye."); + puts("Press any key to quit..."); + _getch(); + return 0; +} \ No newline at end of file From a9f3a71d5a6d0e6e2232a3c091673dc224c152cc Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Tue, 30 May 2017 14:35:54 +0800 Subject: [PATCH 06/10] 111 --- practices/cpp/level1/p11_Fighters/FO.cpp | 55 ++ practices/cpp/level1/p11_Fighters/FO.h | 23 + practices/cpp/level1/p11_Fighters/Game.cpp | 559 +++++++++++++++++++++ practices/cpp/level1/p11_Fighters/Game.h | 61 +++ practices/cpp/level1/p11_Fighters/main.cpp | 12 + 5 files changed, 710 insertions(+) create mode 100644 practices/cpp/level1/p11_Fighters/FO.cpp create mode 100644 practices/cpp/level1/p11_Fighters/FO.h create mode 100644 practices/cpp/level1/p11_Fighters/Game.cpp create mode 100644 practices/cpp/level1/p11_Fighters/Game.h create mode 100644 practices/cpp/level1/p11_Fighters/main.cpp diff --git a/practices/cpp/level1/p11_Fighters/FO.cpp b/practices/cpp/level1/p11_Fighters/FO.cpp new file mode 100644 index 00000000..e1f607fc --- /dev/null +++ b/practices/cpp/level1/p11_Fighters/FO.cpp @@ -0,0 +1,55 @@ +#include "FO.h" +#include +#include +#include +#include +void FO::crash() +{ + ; +} + +FO::FO() +{ + staticFrame = 0; + dynamicFrame = 0; + width = 48; + height = 72; + speed = 10.0; +} + +FO::FO(int flag) +{ + staticFrame = 0; + dynamicFrame = 0; + + switch (flag) + { + case 1://player + width = 48; + height = 72; + speed = 10.0; + break; + case 2://sButterfly + width = 32; + height = 32; + break; + case 3://sElf + width = 48; + height = 32; + break; + case 4://mElf + width = 48; + height = 48; + break; + case 5://mButterfly + width = 64; + height = 64; + break; + +} + } + + +FO::~FO() +{ +} diff --git a/practices/cpp/level1/p11_Fighters/FO.h b/practices/cpp/level1/p11_Fighters/FO.h new file mode 100644 index 00000000..dde3b349 --- /dev/null +++ b/practices/cpp/level1/p11_Fighters/FO.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include +#include +#include +class FO +{ +public: + void crash(); + FO(); + FO(int flag); + ~FO(); + sf::Sprite hero, HSAmmo, LSAmmo; + //sf::Texture frame; + +public: + int HealthPoint, Score, width, height, staticFrame, dynamicFrame; + sf::Vector2f velocity; + double damage, speed, theta; + int type; + +}; + diff --git a/practices/cpp/level1/p11_Fighters/Game.cpp b/practices/cpp/level1/p11_Fighters/Game.cpp new file mode 100644 index 00000000..178d4799 --- /dev/null +++ b/practices/cpp/level1/p11_Fighters/Game.cpp @@ -0,0 +1,559 @@ +#include "Game.h" +#include +#include +#include +#include +#include //Delete when project completes +#include +#include +#include +#define PI 3.1415926 +using namespace std; + +Game::Game() + :mWindow(sf::VideoMode(1280, 960), "TouHou20.0-chs") + , font() + , player(1) +{ + NowLoading(); + + loadBackgrounds(); + + mIsMovingUp = false; + mIsMovingDown = false; + mIsMovingLeft = false; + mIsMovingRight = false; + mIsGrazing = false; + mIsFire = false; + + loadPrimeFrame(); + + loadPlayer(); + + loadEnemy(); + + // Create a graphical text to display + if (!font.loadFromFile("C:\\Users\\Administrator\\Documents\\Rainmeter\\Skins\\Ultralight\\@Resources\\Fonts\\RobotoCondensed-Regular.ttf")) + { + puts("Error: Load RobotoCondensed-Regular.ttf failed!"); + } + text.setString("Testing..."); + text.setFont(font); + text.setCharacterSize(50); + + loadMusicAndSounds(); + + Sleep(1000);//Cancel it when Game project completes + +} +// +void Game::NowLoading() +{ + // Create the loading window + if (!loading.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\loading\\sig.png")) + { + puts("Error: Load loading failed!"); + } + if (!nowLoading.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\ascii\\loading.png", sf::IntRect(0, 0, 128, 64))) + { + puts("Error: Load nowloading failed!"); + } + loadingUI.setTexture(loading); + loadingUISub.setTexture(nowLoading); + loadingUISub.setPosition(sf::Vector2f(1100, 860)); + mWindow.clear(); + mWindow.draw(loadingUI); + mWindow.draw(loadingUISub); + mWindow.display(); +} +// +void Game::loadBackgrounds() +{ + if (!bg1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\background\\stage02\\stage02a.png")) + { + puts("Error: Load stage02a failed!"); + } + if (!bgEff1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\background\\stage02\\stage02b.png")) + { + puts("Error: Load stage02b failed!"); + } + if (!bg2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.10\\background\\stg3bg.png")) + { + puts("Error: Load stage3bg failed!"); + } + if (!bgEff2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.10\\background\\stg3bg2.png")) + { + puts("Error: Load stage3bg failed!"); + } + for (int i = 0; i < 6; i++) + { + back[i].setTexture(bg1); + back[i].setScale(sf::Vector2f(1.5, 1.5)); + back[i].setPosition((float)65.0, (float)(i - 1)*192.0 + 35.0); + backEff[i].setTexture(bgEff1); + backEff[i].setScale(sf::Vector2f(1.5, 1.5)); + backEff[i].setPosition(65.0, (i - 1)*384.0 + 35.0); + } + + /*for (int i = 0; i < 6; i++) + { + back[i].setTexture(bg2); + back[i].setScale(sf::Vector2f(3.0, 3.0)); + back[i].setPosition(65.0, (i - 1)*4*192.0 + 35.0); + backEff[i].setTexture(bgEff2); + backEff[i].setScale(sf::Vector2f(6.0, 6.0)); + backEff[i].setPosition(65.0, (i - 1)*384.0/2.0 + 35.0); + }*/ +} +// +void Game::loadPrimeFrame() +{ + // Load a windowsframe to display + if (!front00.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\front\\front00.png")) + { + puts("Error: Load front failed!"); + } + front01.setTexture(front00); + front01.setTextureRect(sf::IntRect(65, 0, 490, 1280)); + front01.setPosition(sf::Vector2f(795, 0)); + front02.setTexture(front00); + front02.setTextureRect(sf::IntRect(69, 1030, 730, 39)); + front02.setPosition(sf::Vector2f(65, 0)); + front03.setTexture(front00); + front03.setTextureRect(sf::IntRect(69, 1062, 739, 38)); + front03.setPosition(sf::Vector2f(65, 922)); + front04.setTexture(front00); + front04.setTextureRect(sf::IntRect(0, 0, 70, 1280)); + front04.setPosition(sf::Vector2f(0, 0)); +} +// +void Game::loadPlayer() +{ + // Load a player to display + if (!Reimu.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl00\\pl00.png")) + { + puts("Error: Load Reimu failed!"); + } + if (!Marisa.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl01\\pl01.png")) + { + puts("Error: Load Marisa failed!"); + } + if (!Sanae.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl02\\pl02.png")) + { + puts("Error: Load Marisa failed!"); + } + + player.hero.setTexture(Reimu); + player.hero.setTextureRect(sf::IntRect(0, 0, player.width, player.height)); + player.hero.setPosition(sf::Vector2f(400, 820)); + player.HSAmmo.setTexture(Reimu); + player.HSAmmo.setTextureRect(sf::IntRect(0, 3 * player.height + 0, 2.0 / 3.0 * player.width, 24)); + player.HSAmmo.setRotation(270); + player.LSAmmo.setTexture(Reimu); + player.LSAmmo.setTextureRect(sf::IntRect(4 * player.width, 3 * player.height + 48, 2 * player.width, 24)); + player.LSAmmo.setRotation(270); + + + if (!julgePointArray.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\bullet\\etama2.png"))//into player + { + puts("Error: Load julgePointArray failed!"); + } + + julgePoint.setTexture(julgePointArray); + julgePoint.setTextureRect(sf::IntRect(0, 16, 64, 64)); + + if (!bullets.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\bullet\\etama.png")) + { + puts("Error: Load bullets failed!"); + } +} +// +void Game::loadEnemy() +{ + // Load a enemy to display + if (!Enemy1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + { + puts("Error: Load enemy1 failed!"); + } + if (!Enemy2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + { + puts("Error: Load enemy2 failed!"); + } +} +// +void Game::loadMusicAndSounds() +{ + if (!menuMusic.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - ˼hʤ𤤰.wav")) + { + puts("Error: Open ϺꥹØ - ˼hʤ𤤰.wav failed!"); + } + if (!stage1BGM.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - δդ.wav")) + { + puts("Error: Open ϺꥹØ - δդ.wav failed!"); + } + if (!stage2BGM.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - 񡩤_.wav")) + { + puts("Error: Open ϺꥹØ - 񘔤ͨ Dark Road.wav failed!"); + } + if (!stage3BGM.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - 񡩤_.wav")) + { + puts("Error: Open ϺꥹØ - 񡩤_.wav failed!"); + } + if (!playerBulletSoundBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\origin.15\\se_damage00.wav")) + { + puts("Error: Open se_damage00.wav failed!"); + } + playerBulletSound.setBuffer(playerBulletSoundBuffer); + playerBulletSound.setVolume(50); + if (!enemyBulletSoundBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\origin.12\\se_tan00.wav")) + { + puts("Error: Open se_tan00.wav failed!"); + } + enemyBulletSound.setBuffer(enemyBulletSoundBuffer); +} + +void Game::run() +{ + // Play the music + //menuMusic.play(); + //menuMusic.setLoop(true); + //Menu(); + int level = 1; + switch (level) + { + case 1: + stage1BGM.play(); + stage1BGM.setLoop(true); + break; + } + // Start the game loop + mWindow.setFramerateLimit(60); + mWindow.draw(player.hero);//updating + frameDisplay(); + /*HANDLE hThread_1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BGMPlay, self, 0, NULL);*/ + while (mWindow.isOpen()) + { + mWindow.clear(); + + switch (level) + { + case 1: + Stage1(); + break; + } + processTaps(); + mainProcessing(); + + frameDisplay(); + } +} + +void Game::Stage1() +{ + static sf::Time elapsed1 = clock.restart(); + elapsed1 = clock.getElapsedTime(); + static int Evt = 0; + static int evts[20] = { 0 }; + printf("%.0f\n", elapsed1.asSeconds()); + switch ((int)elapsed1.asSeconds()) + { + case 12: + //title + if (Evt < 1) + { + Evt = 1; + evts[1] = 1; + printf("1s\n"); + } + break; + case 37: + //wave + if (Evt < 2) + { + Evt = 2; + printf("2s\n"); + } + break; + case 50: + //middle + if (Evt < 3) + { + Evt = 3; + printf("3s\n"); + } + break; + case 63: + //spellCard1 + if (Evt < 4) + { + Evt = 4; + printf("4s\n"); + } + break; + case 100: + //boss + ; + } + + if (evts[1]) + { + static int i1 = 0; + static list wave1; + i1++; + + if (i1 == 1) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 64, sButterfly.width, sButterfly.height)); + sButterfly.hero.setPosition(sf::Vector2f(400, 420)); + wave1.push_back(sButterfly); + + + } + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + it->hero.move(0.0, 1.0); + enemies.push_back(it->hero); + //mWindow.draw(it->hero); + } + + if (i1 > 3000) + { + evts[1] = 0; + } + } +} + +void Game::frameDisplay()//ammo->front->player->jpoint +{ + + player.staticFrame = player.staticFrame % 56; + player.staticFrame++; + mWindow.clear(); + + backgroundDisplay(); + + playerAmmoDisplay(); + + enemiesDisplay(); + + // Draw the sprite + mWindow.draw(front01); + mWindow.draw(front02); + mWindow.draw(front03); + mWindow.draw(front04); + + playerDisplay(); + + // Draw the string + mWindow.draw(text); + // Update the window + mWindow.display(); +} +// +void Game::backgroundDisplay() +{ + for (int i = 0; i < 6; i++) + { + if (back[i].getPosition().y >= 5 * 192 + 35) + { + back[i].setPosition(65.0, 35 - 192); + } + back[i].move(0.0, 3.0); + mWindow.draw(back[i]); + + } + for (int i = 0; i < 4; i++) + { + if (backEff[i].getPosition().y >= 3 * 384 + 35) + { + backEff[i].setPosition(65.0, 35 - 384); + } + backEff[i].move(0.0, 5.0); + mWindow.draw(backEff[i]); + } +} +// +void Game::playerAmmoDisplay() +{ + //Ammo + if (mIsFire) + { + //playerAmmo = (mIsGrazing) ? player.LSAmmo : player.HSAmmo; + if (player.staticFrame % 2 == 1) + { + player.LSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 4, player.hero.getPosition().y + 80)); + playerBullets.push_back(player.LSAmmo); + player.LSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 20, player.hero.getPosition().y + 80)); + playerBullets.push_back(player.LSAmmo); + player.HSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 4, player.hero.getPosition().y + 110)); + playerBullets.push_back(player.HSAmmo); + player.HSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 20, player.hero.getPosition().y + 110)); + playerBullets.push_back(player.HSAmmo); + } + } + playerBullets.remove_if(isOutOfBoard); + for (list::iterator it = playerBullets.begin(); it != playerBullets.end(); it++) + { + //it->setPosition(it->getPosition().x, it->getPosition().y - 60); + it->move(0.0, - 60.0); + mWindow.draw(*it); + } +} +// +void Game::enemiesDisplay() +{ + for (list::iterator it = enemies.begin(); it != enemies.end(); it++) + { + mWindow.draw(*it); + } + enemies.clear(); +} +// +void Game::playerDisplay() +{ + //player + if (mIsMovingLeft) + { + if (player.dynamicFrame < 14) + { + player.dynamicFrame++; + } + player.hero.setTextureRect(sf::IntRect(player.width * (player.dynamicFrame / 2), player.height, player.width, player.height)); + } + else if (mIsMovingRight) + { + if (player.dynamicFrame < 14) + { + player.dynamicFrame++; + } + player.hero.setTextureRect(sf::IntRect(player.width * (player.dynamicFrame / 2), 2 * player.height, player.width, player.height)); + } + else + { + player.hero.setTextureRect(sf::IntRect(player.width * (player.staticFrame / 8), 0, player.width, player.height)); + player.dynamicFrame = 0; + } + + mWindow.draw(player.hero);//updating + + if (mIsGrazing) + { + julgePoint.setPosition(sf::Vector2f(player.hero.getPosition().x - 8, player.hero.getPosition().y + 4)); + mWindow.draw(julgePoint); + } +} + +void Game::processTaps() +{ + sf::Event event; + while (mWindow.pollEvent(event)) + { + switch (event.type) + { + case sf::Event::KeyPressed: + playerInput(event.key.code, true); + break; + case sf::Event::KeyReleased: + playerInput(event.key.code, false); + break; + case sf::Event::Closed: + mWindow.close(); + break; + default: + break; + } + } +} + +void Game::playerInput(sf::Keyboard::Key key, bool isPressed) +{ + if (key == sf::Keyboard::Up) + mIsMovingUp = isPressed; + else if (key == sf::Keyboard::Down) + mIsMovingDown = isPressed; + else if (key == sf::Keyboard::Left) + mIsMovingLeft = isPressed; + else if (key == sf::Keyboard::Right) + mIsMovingRight = isPressed; + else if (key == sf::Keyboard::Z) + mIsFire = isPressed; + else if (key == sf::Keyboard::LShift) + mIsGrazing = isPressed; + player.speed = (mIsGrazing) ? 4.0 : 10.0; +} + +bool isOutOfBoard(sf::Sprite value) +{ + if (value.getPosition().y >= 136) + { + return false; + } + return true; +} + +void Game::mainProcessing() +{ + if (mIsMovingUp == true && player.hero.getPosition().y > 40) + { + //player.theta = PI*0.5; + player.hero.move(0.0, float(-player.speed)); + } + if (mIsMovingDown == true && player.hero.getPosition().y < 850) + { + //player.theta = PI*1.5; + player.hero.move(0.0, float(player.speed)); + } + if (mIsMovingLeft == true && player.hero.getPosition().x > 69) + { + //player.theta = PI; + player.hero.move(float(-player.speed), 0.0); + } + if (mIsMovingRight == true && player.hero.getPosition().x < 751) + { + //player.theta = 0.0; + player.hero.move(float(player.speed), 0.0); + } + /*if ((mIsMovingDown || mIsMovingLeft || mIsMovingRight || mIsMovingUp) && !isOutOfBoard(player.hero)) + { + player.velocity.x = player.speed * cos(player.theta); + player.velocity.y = player.speed * sin(player.theta); + player.hero.move(player.velocity); + }*/ + + + if (mIsFire) + { + if (playerBulletSound.getStatus() != playerBulletSound.Playing) + { + playerBulletSound.play(); + } + } +} + +/*DWORD WINAPI BGMPlay(LPVOID lpParameter) +{ + Game* game = (Game*)lpParameter; + int i = 0; + while (1) + { + i %= 10; + i++; + if (game->mIsFire && i == 1) + { + if (game->playerBulletSound.getStatus() != game->playerBulletSound.Playing) + { + game->playerBulletSound.play(); + } + + // + } + } + return 0; +}*/ + +Game::~Game() +{ + ; +} diff --git a/practices/cpp/level1/p11_Fighters/Game.h b/practices/cpp/level1/p11_Fighters/Game.h new file mode 100644 index 00000000..1af92472 --- /dev/null +++ b/practices/cpp/level1/p11_Fighters/Game.h @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include "FO.h" +#include +using namespace std; + +class Game +{ +public: + Game(); + void NowLoading(); + void loadBackgrounds(); + void loadPrimeFrame(); + void loadPlayer(); + void loadEnemy(); + void loadMusicAndSounds(); + void run(); + void menu(); + void Stage1(); + void frameDisplay(); + void backgroundDisplay(); + void playerAmmoDisplay(); + void enemiesDisplay(); + void playerDisplay(); + void processTaps(); + void playerInput(sf::Keyboard::Key key, bool isPressed); + friend bool isOutOfBoard(sf::Sprite value);//wait for updating + void mainProcessing(); + /*friend DWORD WINAPI BGMPlay(LPVOID lpParameter);*/ + ~Game(); + +/*private: + void checkCollision(PFITERATOR object1, PFITERATOR object2); + bool checkOverstep(PFITERATOR object); + */ +private: + Game* self = this; + bool mIsMovingUp, mIsMovingDown, mIsMovingLeft, mIsMovingRight, mIsGrazing, mIsFire; + sf::RenderWindow mWindow; + sf::Font font; + sf::Text text; + sf::Texture Reimu, Marisa, Sanae, loading, nowLoading, stageSelect, front00, julgePointArray; + sf::Texture bullets, bg1, bgEff1, bg2, bgEff2, bg3, bgEff3, Enemy1, Enemy2; + sf::Sprite loadingUI, loadingUISub, back[6], backEff[6], front01, front02, front03, front04; + sf::Sprite julgePoint, playerAmmo; + sf::Music menuMusic, stage1BGM, stage2BGM, stage3BGM; + sf::SoundBuffer playerBulletSoundBuffer, playerBulletSoundBuffer1, enemyBulletSoundBuffer, collisionSoundBuffer, spellCardSoundBuffer, buttomSoundBuffer; + sf::Sound playerBulletSound, playerBulletSound1, enemyBulletSound, collisionSound, spellCardSound, buttomSound; + sf::Clock clock; + FO player; + list playerBullets, enemyBullets; + list enemies; + +/* sf::Time globalTime, fireTime; + sf::Clock fireClock; + */ +}; + diff --git a/practices/cpp/level1/p11_Fighters/main.cpp b/practices/cpp/level1/p11_Fighters/main.cpp new file mode 100644 index 00000000..f9ec5fdf --- /dev/null +++ b/practices/cpp/level1/p11_Fighters/main.cpp @@ -0,0 +1,12 @@ +#include +#include +#include +#include +#include "Game.h" + +int main(int argc, char* argv[]) +{ + Game game; + game.run(); + return 0; +} \ No newline at end of file From c765dd04232dbab99f638a82d13698ce0ed17b72 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Tue, 6 Jun 2017 19:41:16 +0800 Subject: [PATCH 07/10] 170606 --- practices/cpp/level1/p11_Fighters/FO.cpp | 127 +++++- practices/cpp/level1/p11_Fighters/FO.h | 11 +- practices/cpp/level1/p11_Fighters/Game.cpp | 487 ++++++++++++++++++--- practices/cpp/level1/p11_Fighters/Game.h | 33 +- 4 files changed, 568 insertions(+), 90 deletions(-) diff --git a/practices/cpp/level1/p11_Fighters/FO.cpp b/practices/cpp/level1/p11_Fighters/FO.cpp index e1f607fc..de68e940 100644 --- a/practices/cpp/level1/p11_Fighters/FO.cpp +++ b/practices/cpp/level1/p11_Fighters/FO.cpp @@ -12,44 +12,161 @@ FO::FO() { staticFrame = 0; dynamicFrame = 0; - width = 48; - height = 72; - speed = 10.0; + damage = 1.0; + isSym = false; } FO::FO(int flag) { + staticFrame = 0; dynamicFrame = 0; + damage = 1.0; + isSym = false; + switch (flag) { + case 0://title + type = 0; + width = 512; + height = 256; + speed = 0.0; + theta = 0.0; + velocity = sf::Vector2f(0.0, 0.0); case 1://player + type = 1; + if (!Reimu.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl00\\pl00.png")) + { + puts("Error: Load Reimu failed!"); + } + if (!Marisa.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl01\\pl01.png")) + { + puts("Error: Load Marisa failed!"); + } + if (!Sanae.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl02\\pl02.png")) + { + puts("Error: Load Marisa failed!"); + } + HealthPoint = 1; + damage = 1.0; width = 48; height = 72; speed = 10.0; + hero.setTexture(Reimu); + hero.setTextureRect(sf::IntRect(0, 0, width, height)); + hero.setPosition(sf::Vector2f(400, 820)); + HSAmmo.setTexture(Reimu); + HSAmmo.setTextureRect(sf::IntRect(0, 3 * height + 0, 25, 24)); + HSAmmo.setRotation(270); + LSAmmo.setTexture(Reimu); + LSAmmo.setTextureRect(sf::IntRect(4 * width, 3 * height + 48, 2 * width, 24)); + LSAmmo.setRotation(270); break; case 2://sButterfly + type = 2; + // Load an enemy to display + /*if (!Enemy1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + { + puts("Error: Load enemy1 failed!"); + } + if (!Enemy2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + { + puts("Error: Load enemy2 failed!"); + }*/ + HealthPoint = 5; width = 32; height = 32; + speed = 2; + //hero.setTexture(Enemy1); + //hero.setTextureRect(sf::IntRect(0, 64, width, height)); + //hero.setScale(sf::Vector2f(1.5, 1.5)); + //printf("%x\n", hero); break; - case 3://sElf + case 3://sFairy + type = 3; width = 48; height = 32; break; - case 4://mElf + case 4://mFairy + type = 4; width = 48; height = 48; break; case 5://mButterfly + HealthPoint = 120; + type = 5; width = 64; height = 64; break; } } + +/*void FO::setSButterfly(double x, double y) +{ + if (!Enemy1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + { + puts("Error: Load enemy1 failed!"); + } + if (!Enemy2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + { + puts("Error: Load enemy2 failed!"); + } + hero.setTexture(Enemy1); + hero.setTextureRect(sf::IntRect(0, 320, width, height)); + hero.setScale(sf::Vector2f(1.5, 1.5)); + hero.setPosition(sf::Vector2f(x, y)); +}*/ +sf::Vector2f FO::getJulgeArea() +{ + float x, y; + if (type == 1) + { + x = hero.getPosition().x - 24; + y = hero.getPosition().y - 8; + } + else + { + x = hero.getPosition().x; + y = hero.getPosition().y; + } + return sf::Vector2f(x, y); +} + FO::~FO() { } + +/*Player::Player() +{ + staticFrame = 0; + dynamicFrame = 0; + // Load a player to display + if (!Reimu.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl00\\pl00.png")) + { + puts("Error: Load Reimu failed!"); + } + if (!Marisa.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl01\\pl01.png")) + { + puts("Error: Load Marisa failed!"); + } + if (!Sanae.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl02\\pl02.png")) + { + puts("Error: Load Marisa failed!"); + } + width = 48; + height = 72; + speed = 10.0; + hero.setTexture(Reimu); + hero.setTextureRect(sf::IntRect(0, 0, width, height)); + hero.setPosition(sf::Vector2f(400, 820)); + HSAmmo.setTexture(Reimu); + HSAmmo.setTextureRect(sf::IntRect(0, 3 * height + 0, 2.0 / 3.0 * width, 24)); + HSAmmo.setRotation(270); + LSAmmo.setTexture(Reimu); + LSAmmo.setTextureRect(sf::IntRect(4 * width, 3 * height + 48, 2 * width, 24)); + LSAmmo.setRotation(270); +}*/ diff --git a/practices/cpp/level1/p11_Fighters/FO.h b/practices/cpp/level1/p11_Fighters/FO.h index dde3b349..75f0c2f2 100644 --- a/practices/cpp/level1/p11_Fighters/FO.h +++ b/practices/cpp/level1/p11_Fighters/FO.h @@ -9,15 +9,20 @@ class FO void crash(); FO(); FO(int flag); + void setSButterfly(double x, double y); + sf::Vector2f getJulgeArea(); ~FO(); - sf::Sprite hero, HSAmmo, LSAmmo; - //sf::Texture frame; + public: + sf::Sprite hero, HSAmmo, LSAmmo; + sf::Texture Reimu, Marisa, Sanae, Enemy1, Enemy2; + //sf::Texture frame; int HealthPoint, Score, width, height, staticFrame, dynamicFrame; sf::Vector2f velocity; double damage, speed, theta; - int type; + bool isSym; + int type, gap, born; }; diff --git a/practices/cpp/level1/p11_Fighters/Game.cpp b/practices/cpp/level1/p11_Fighters/Game.cpp index 178d4799..0271a069 100644 --- a/practices/cpp/level1/p11_Fighters/Game.cpp +++ b/practices/cpp/level1/p11_Fighters/Game.cpp @@ -3,11 +3,15 @@ #include #include #include -#include //Delete when project completes +#include //Delete it when project completes +#include #include #include #include +#include +#include #define PI 3.1415926 +#define EPS 0.00001 using namespace std; Game::Game() @@ -19,6 +23,8 @@ Game::Game() loadBackgrounds(); + srand((unsigned)time(NULL)); + remnant = 3; mIsMovingUp = false; mIsMovingDown = false; mIsMovingLeft = false; @@ -28,7 +34,7 @@ Game::Game() loadPrimeFrame(); - loadPlayer(); + loadPointsAndEffs(); loadEnemy(); @@ -60,7 +66,8 @@ void Game::NowLoading() } loadingUI.setTexture(loading); loadingUISub.setTexture(nowLoading); - loadingUISub.setPosition(sf::Vector2f(1100, 860)); + loadingUISub.setScale(1.5, 1.5); + loadingUISub.setPosition(sf::Vector2f(1000, 800)); mWindow.clear(); mWindow.draw(loadingUI); mWindow.draw(loadingUISub); @@ -104,6 +111,11 @@ void Game::loadBackgrounds() backEff[i].setScale(sf::Vector2f(6.0, 6.0)); backEff[i].setPosition(65.0, (i - 1)*384.0/2.0 + 35.0); }*/ + + if (!Title1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\front\\logo\\stg01logo.png")) + { + puts("Error: Load stg01logo failed!"); + } } // void Game::loadPrimeFrame() @@ -127,33 +139,8 @@ void Game::loadPrimeFrame() front04.setPosition(sf::Vector2f(0, 0)); } // -void Game::loadPlayer() +void Game::loadPointsAndEffs() { - // Load a player to display - if (!Reimu.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl00\\pl00.png")) - { - puts("Error: Load Reimu failed!"); - } - if (!Marisa.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl01\\pl01.png")) - { - puts("Error: Load Marisa failed!"); - } - if (!Sanae.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\player\\pl02\\pl02.png")) - { - puts("Error: Load Marisa failed!"); - } - - player.hero.setTexture(Reimu); - player.hero.setTextureRect(sf::IntRect(0, 0, player.width, player.height)); - player.hero.setPosition(sf::Vector2f(400, 820)); - player.HSAmmo.setTexture(Reimu); - player.HSAmmo.setTextureRect(sf::IntRect(0, 3 * player.height + 0, 2.0 / 3.0 * player.width, 24)); - player.HSAmmo.setRotation(270); - player.LSAmmo.setTexture(Reimu); - player.LSAmmo.setTextureRect(sf::IntRect(4 * player.width, 3 * player.height + 48, 2 * player.width, 24)); - player.LSAmmo.setRotation(270); - - if (!julgePointArray.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\bullet\\etama2.png"))//into player { puts("Error: Load julgePointArray failed!"); @@ -161,11 +148,28 @@ void Game::loadPlayer() julgePoint.setTexture(julgePointArray); julgePoint.setTextureRect(sf::IntRect(0, 16, 64, 64)); + julgePoint.setScale(1.5, 1.5); if (!bullets.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\bullet\\etama.png")) { puts("Error: Load bullets failed!"); } + if (!buffetsEff.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy_aura.png")) + { + puts("Error: Load buffetsEff failed!"); + } + if (!deathCircle.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\effect\\eff_deadcircle.png")) + { + puts("Error: Load deathCircle failed!"); + } + if (!allBullets1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\bullet\\bullet1.png")) + { + puts("Error: Load deathCircle failed!"); + } + if (!allBullets2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\bullet\\bullet2.png")) + { + puts("Error: Load deathCircle failed!"); + } } // void Game::loadEnemy() @@ -210,6 +214,12 @@ void Game::loadMusicAndSounds() puts("Error: Open se_tan00.wav failed!"); } enemyBulletSound.setBuffer(enemyBulletSoundBuffer); + enemyBulletSound.setVolume(30); + if (!breakSoundBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\origin.12\\se_enep00.wav")) + { + puts("Error: Open se_enep02.wav failed!"); + } + breakSound.setBuffer(breakSoundBuffer); } void Game::run() @@ -252,77 +262,239 @@ void Game::Stage1() { static sf::Time elapsed1 = clock.restart(); elapsed1 = clock.getElapsedTime(); - static int Evt = 0; + static int evts[20] = { 0 }; - printf("%.0f\n", elapsed1.asSeconds()); + + static int curTime = 1; + if (curTime < elapsed1.asSeconds()) + { + printf("%.0f\n", elapsed1.asSeconds()); + curTime++; + } + switch ((int)elapsed1.asSeconds()) { + case 1: + //pre + evts[1] = 1; + break; case 12: //title - if (Evt < 1) - { - Evt = 1; - evts[1] = 1; - printf("1s\n"); - } + evts[2] = 1; + break; + case 17: + evts[3] = 1; break; case 37: //wave - if (Evt < 2) - { - Evt = 2; - printf("2s\n"); - } + break; case 50: //middle - if (Evt < 3) - { - Evt = 3; - printf("3s\n"); - } + break; case 63: //spellCard1 - if (Evt < 4) - { - Evt = 4; - printf("4s\n"); - } + break; case 100: //boss - ; + break; } if (evts[1]) { - static int i1 = 0; - static list wave1; - i1++; + if (S1E1()) + { + evts[1] = 0; + } + } + if (evts[2]) + { + if (S1E2()) + { + evts[2] = 0; + } + } +} - if (i1 == 1) +int Game::S1E1() +{ + static int i1 = 0; + i1++; + static list wave1, wave2; + double gapTime = 0.4; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + if (i1 % gapFrame == 1 && i1 < 15 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(400 + pow(-1.0, i1 / gapFrame) * 0.8 * i1, 20.0)); + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave1.push_back(sButterfly); + } + if (i1 == 270) + { + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.hero.setPosition(sf::Vector2f(400 + 200, -20.0)); + mButterfly.born = i1; + wave2.push_back(mButterfly); + mButterfly.hero.setPosition(sf::Vector2f(400 - 200, -20.0)); + wave2.push_back(mButterfly); + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + if (temp < 200)//phase1 { - FO sButterfly(2); - sButterfly.hero.setTexture(Enemy1); - sButterfly.hero.setTextureRect(sf::IntRect(0, 64, sButterfly.width, sButterfly.height)); - sButterfly.hero.setPosition(sf::Vector2f(400, 420)); - wave1.push_back(sButterfly); + if (i1 % 20 == 0) + { + setRoundSnipe(it, 5.0); + } + it->speed = 50.0 / (temp + 1.0); + it->theta = 0.5*PI; + it->hero.setTextureRect(sf::IntRect(i1 % 35 / 7 * it->width, 320, it->width, it->height)); + } + else//phase2 + { + it->speed = (temp - 200) / 10.0; + it->theta = 0.5 * PI + pow(-1.0, it->gap + 1.0) * 10.0*PI / 360.0; + if (it->speed <= 11) + { + it->hero.setTextureRect(sf::IntRect((int)it->speed * it->width, 320, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)11 * it->width, 320, it->width, it->height)); + } + if (it->theta > PI / 2.0) + { + it->hero.setScale(-1.5, 1.5); + if (!it->isSym) + { + it->hero.move(1.5*it->width, 0); + it->isSym = true; + } + } } - for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + + enemyCollisionProcessing(it); + + pushToDraw(it); + } + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) + { + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 400) { - it->hero.move(0.0, 1.0); - enemies.push_back(it->hero); - //mWindow.draw(it->hero); + it->speed = (650.0 - i1) / 240; + it->theta = 0.5 * PI; } - - if (i1 > 3000) + else if (i1 >= 400 && i1 < 500) { - evts[1] = 0; + it->speed = 0.0; + + setSharpRandom(it, 3.0); + setSharpRandom(it, 3.0); + + } + else + { + it->speed = (i1 - 500) / 60.0; + it->theta = 1.5 * PI; } + + enemyCollisionProcessing(it); + + pushToDraw(it); + } + + if (i1 > 15 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; + } + return 0; +} + +int Game::S1E2() +{ + static int i1 = 0; + i1++; + static list wave1; + + if (i1 == 1) + { + FO mainTitle(0); + mainTitle.hero.setTexture(Title1); + mainTitle.hero.setTextureRect(sf::IntRect(0, 0, 512, 256)); + //mainTitle.hero.setScale(sf::Vector2f(1.5, 1.5)); + mainTitle.speed = 0.0; + mainTitle.hero.setPosition(sf::Vector2f(200.0, 150.0)); + mainTitle.hero.setColor(sf::Color(255, 255, 255, 0)); + + wave1.push_back(mainTitle); + } + + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + it->hero.setColor(sf::Color(255, 255, 255, -i1*(i1-301) / (151.0*150.0) * 255)); + pushToDraw(it); + } + if (i1 > 5 * 60) + { + wave1.clear();//Final clear for accident + return 1; + } + return 0; +} + +int Game::S1E3() +{ + static int i1 = 0; + i1++; + static list wave1, wave2; + double gapTime = 0.4; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 > 10 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; } + return 0; +} + +void Game::pushToDraw(list::iterator it) +{ + if (it->speed > EPS) + { + it->velocity.x = it->speed * cos(it->theta); + it->velocity.y = it->speed * sin(it->theta); + it->hero.move(it->velocity); + } + + enemies.push_back(it->hero); } void Game::frameDisplay()//ammo->front->player->jpoint @@ -337,7 +509,10 @@ void Game::frameDisplay()//ammo->front->player->jpoint playerAmmoDisplay(); enemiesDisplay(); + + enemyBulletsDisplay(); + effsDisplay(); // Draw the sprite mWindow.draw(front01); mWindow.draw(front02); @@ -406,11 +581,20 @@ void Game::enemiesDisplay() { for (list::iterator it = enemies.begin(); it != enemies.end(); it++) { + //printf("Now %lf %lf!\n", it->getPosition().x, it->getPosition().y); mWindow.draw(*it); } enemies.clear(); } // +void Game::enemyBulletsDisplay() +{ + for (list::iterator it = enemyBullets.begin(); it != enemyBullets.end(); it++) + { + pushToDraw(it); + } +} +// void Game::playerDisplay() { //player @@ -438,12 +622,113 @@ void Game::playerDisplay() mWindow.draw(player.hero);//updating + + static int julgeRotate = 0; + julgeRotate++; + julgeRotate %= 360; + julgePoint.setOrigin(32, 32); + julgePoint.setRotation(julgeRotate); + julgePoint.setPosition(sf::Vector2f(player.hero.getPosition().x - 22 + 48, player.hero.getPosition().y - 8 + 48)); if (mIsGrazing) - { - julgePoint.setPosition(sf::Vector2f(player.hero.getPosition().x - 8, player.hero.getPosition().y + 4)); + { mWindow.draw(julgePoint); } } +// +void Game::effsDisplay() +{ + for (list::iterator it = playerBulletsEffs.begin(); it != playerBulletsEffs.end(); it++) + { + mWindow.draw(*it); + } + playerBulletsEffs.clear(); + for (list::iterator it = deathEffs.begin(); it != deathEffs.end(); it++) + { + double i = it->getScale().x, j = it->getScale().y / it->getScale().x; + i += 0.1; + it->setScale(i, i*j); + it->setColor(sf::Color(255, 255, 255, 255 * (1.2 - 0.5*i))); + /*if (it->getRotation() > EPS) + { + // it->setScale(i + 0.3, (i + 0.3)*j); + it->setColor(sf::Color(255, 255, 255, 255 * (1 - 0.5*(i - 0.3)))); + }*/ + + mWindow.draw(*it); + } + deathEffs.remove_if([](sf::Sprite obj) { if (obj.getScale().x > 2.3 || (obj.getRotation() < EPS && obj.getScale().x > 2.0))/* * 1.0 && obj.getRotation() == 0) || (obj.getScale().x > 2.3 && obj.getRotation() != 0))*/ return true; else return false; }); +} + +void Game::enemyCollisionProcessing(list::iterator it) +{ + for (list::iterator itAmmo = playerBullets.begin(); itAmmo != playerBullets.end(); itAmmo++) + { + if (checkCollision(it->hero, *itAmmo)) + { + enemyUnderAttack(it, itAmmo); + + if (it->HealthPoint <= 0) + { + enemyCrash(it); + } + } + } +} + +void Game::enemyUnderAttack(list::iterator it, list::iterator itAmmo) +{ + //printf("%d\n", it->HealthPoint); + it->HealthPoint -= player.damage; + AmmoEff.setTexture(buffetsEff); + AmmoEff.setTextureRect(sf::IntRect(player.staticFrame % 7 * 48, 0, 48, 48)); + AmmoEff.setPosition(itAmmo->getPosition().x - 10, it->hero.getPosition().y + it->height - 10); + playerBulletsEffs.push_back(AmmoEff); + itAmmo->setPosition(-100, -100); +} + +void Game::enemyCrash(list::iterator it) +{ + breakSound.play(); + deathEff.setTexture(deathCircle); + deathEff.setTextureRect(sf::IntRect(64, 0, 64, 64)); + deathEff.setOrigin(32, 32); + deathEff.setPosition(it->hero.getPosition().x + it->width * 0.5, it->hero.getPosition().y + it->height * 0.5); + deathEff.setScale(0.1, 0.1); + deathEffs.push_back(deathEff); + deathEff.setScale(0.3, 0.06); + deathEff.setRotation(rand() % 360); + deathEffs.push_back(deathEff); + it->hero.setPosition(-100, -100); +} + +void Game::setRoundSnipe(list::iterator it, double speed) +{ + enemyBulletSound.play(); + FO RoundSnipe; + RoundSnipe.speed = speed; + RoundSnipe.hero.setTexture(allBullets1); + RoundSnipe.hero.setTextureRect(sf::IntRect(80, 32, 16, 16)); + RoundSnipe.hero.setOrigin(8, 8); + RoundSnipe.hero.setScale(1.5, 1.5); + RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); + enemyBullets.push_back(RoundSnipe); +} + +void Game::setSharpRandom(list::iterator it, double speed) +{ + enemyBulletSound.play(); + FO SharpRandom; + SharpRandom.speed = speed; + SharpRandom.theta = rand()%360; + SharpRandom.hero.setTexture(allBullets1); + SharpRandom.hero.setTextureRect(sf::IntRect(80, 96, 16, 16)); + SharpRandom.hero.setOrigin(8, 8); + SharpRandom.hero.setScale(1.5, 1.5); + SharpRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + SharpRandom.hero.setRotation(SharpRandom.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpRandom); +} void Game::processTaps() { @@ -486,7 +771,16 @@ void Game::playerInput(sf::Keyboard::Key key, bool isPressed) bool isOutOfBoard(sf::Sprite value) { - if (value.getPosition().y >= 136) + if (value.getPosition().y >= 0 && value.getPosition().y <= 960 && value.getPosition().x >= 0 && value.getPosition().x <= 960) + { + return false; + } + return true; +} + +bool isFOOutOfBoard(const FO value) +{ + if (value.hero.getPosition().y >= -100 && value.hero.getPosition().y <= 960 && value.hero.getPosition().x >= 0 && value.hero.getPosition().x <= 960) { return false; } @@ -532,6 +826,55 @@ void Game::mainProcessing() } } +bool Game::checkCollision(sf::Sprite obj1, sf::Sprite obj2) +{ + sf::FloatRect f1 = obj1.getGlobalBounds(); + sf::FloatRect f2 = obj2.getGlobalBounds(); + if (f1.intersects(f2)) + { + return true; + } + return false; +} + +/*bool Game::checkCollision(sf::Sprite obj1, sf::Sprite obj2) +{ + double x1, y1, th1, x2, y2, th2; + sf::Vector2f v1[4], v2[4]; + x1 = obj1.getPosition().x; + y1 = obj1.getPosition().y; + th1 = obj1.getRotation(); + x2 = obj2.getPosition().x; + y2 = obj2.getPosition().y; + th2 = obj1.getRotation(); + v1[0].x = x1; + v1[0].y = y1; + v1[1].x = x1 + obj1.getTextureRect().width + cos(obj1.getRotation()); + v1[1].y = y1; + v1[2].x = x1; + v1[2].y = y1 + obj1.getTextureRect().height + sin(obj1.getRotation()); + v1[3].x = x1 + obj1.getTextureRect().width + cos(obj1.getRotation()); + v1[3].y = y1 + obj1.getTextureRect().height + sin(obj1.getRotation()); + v2[0].x = x2; + v2[0].y = y2; + v2[1].x = x2 + obj2.getTextureRect().width + cos(obj2.getRotation()); + v2[1].y = y2; + v2[2].x = x2; + v2[2].y = y2 + obj2.getTextureRect().height + sin(obj2.getRotation()); + v2[3].x = x2 + obj2.getTextureRect().width + cos(obj2.getRotation()); + v2[3].y = y2 + obj2.getTextureRect().height + sin(obj2.getRotation()); + if (max(x1, x1 + obj1.getTextureRect().width) < min(x2, x2 + obj2.getTextureRect().width) || min(x1, x1 + obj1.getTextureRect().width) > max(x2, x2 + obj2.getTextureRect().width)) + { + return false; + } + if (max(y1, y1 + obj1.getTextureRect().height) < min(y2, y2 + obj2.getTextureRect().height) || min(y1, y1 + obj1.getTextureRect().height) > max(y2, y2 + obj2.getTextureRect().height)) + { + return false; + } + + return true; +}*/ + /*DWORD WINAPI BGMPlay(LPVOID lpParameter) { Game* game = (Game*)lpParameter; diff --git a/practices/cpp/level1/p11_Fighters/Game.h b/practices/cpp/level1/p11_Fighters/Game.h index 1af92472..58dea049 100644 --- a/practices/cpp/level1/p11_Fighters/Game.h +++ b/practices/cpp/level1/p11_Fighters/Game.h @@ -14,21 +14,34 @@ class Game void NowLoading(); void loadBackgrounds(); void loadPrimeFrame(); - void loadPlayer(); + void loadPointsAndEffs(); void loadEnemy(); void loadMusicAndSounds(); void run(); void menu(); void Stage1(); + int S1E1(); + int S1E2(); + int S1E3(); + void pushToDraw(list::iterator it); void frameDisplay(); void backgroundDisplay(); void playerAmmoDisplay(); void enemiesDisplay(); + void enemyBulletsDisplay(); void playerDisplay(); + void effsDisplay(); + void enemyCollisionProcessing(list::iterator it); + void enemyUnderAttack(list::iterator it, list::iterator itAmmo); + void enemyCrash(list::iterator it); + void setRoundSnipe(list::iterator it, double speed); + void setSharpRandom(list::iterator it, double speed); void processTaps(); void playerInput(sf::Keyboard::Key key, bool isPressed); friend bool isOutOfBoard(sf::Sprite value);//wait for updating + friend bool isFOOutOfBoard(FO value);//wait for updating void mainProcessing(); + bool checkCollision(sf::Sprite obj1, sf::Sprite obj2); /*friend DWORD WINAPI BGMPlay(LPVOID lpParameter);*/ ~Game(); @@ -42,20 +55,20 @@ class Game sf::RenderWindow mWindow; sf::Font font; sf::Text text; - sf::Texture Reimu, Marisa, Sanae, loading, nowLoading, stageSelect, front00, julgePointArray; - sf::Texture bullets, bg1, bgEff1, bg2, bgEff2, bg3, bgEff3, Enemy1, Enemy2; + sf::Texture loading, nowLoading, stageSelect, front00, julgePointArray, Title1, allBullets1, allBullets2; + sf::Texture bullets, buffetsEff, deathCircle, bg1, bgEff1, bg2, bgEff2, bg3, bgEff3, Enemy1, Enemy2; sf::Sprite loadingUI, loadingUISub, back[6], backEff[6], front01, front02, front03, front04; - sf::Sprite julgePoint, playerAmmo; + sf::Sprite julgePoint, playerAmmo, AmmoEff, deathEff; sf::Music menuMusic, stage1BGM, stage2BGM, stage3BGM; sf::SoundBuffer playerBulletSoundBuffer, playerBulletSoundBuffer1, enemyBulletSoundBuffer, collisionSoundBuffer, spellCardSoundBuffer, buttomSoundBuffer; + sf::SoundBuffer breakSoundBuffer; sf::Sound playerBulletSound, playerBulletSound1, enemyBulletSound, collisionSound, spellCardSound, buttomSound; + sf::Sound breakSound; sf::Clock clock; FO player; - list playerBullets, enemyBullets; - list enemies; - -/* sf::Time globalTime, fireTime; - sf::Clock fireClock; - */ + list enemyBullets; + list playerBullets, deathEffs; + list enemies, playerBulletsEffs; + int remnant; }; From f313a0a8fa85a59e7ec3ff7963ae42551612ea6a Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Sun, 11 Jun 2017 18:40:22 +0800 Subject: [PATCH 08/10] 170611 --- practices/cpp/level1/p11_Fighters/FO.cpp | 30 +- practices/cpp/level1/p11_Fighters/FO.h | 4 +- practices/cpp/level1/p11_Fighters/Game.cpp | 2148 ++++++++++++++++++-- practices/cpp/level1/p11_Fighters/Game.h | 67 +- 4 files changed, 2059 insertions(+), 190 deletions(-) diff --git a/practices/cpp/level1/p11_Fighters/FO.cpp b/practices/cpp/level1/p11_Fighters/FO.cpp index de68e940..e0dca091 100644 --- a/practices/cpp/level1/p11_Fighters/FO.cpp +++ b/practices/cpp/level1/p11_Fighters/FO.cpp @@ -10,17 +10,26 @@ void FO::crash() FO::FO() { + phase = 1; + bounds = 0; staticFrame = 0; dynamicFrame = 0; + width = 0; + height = 0; + score = 0; damage = 1.0; isSym = false; } FO::FO(int flag) { - + phase = 1; + bounds = 0; staticFrame = 0; dynamicFrame = 0; + width = 0; + height = 0; + score = 0; damage = 1.0; isSym = false; @@ -55,7 +64,7 @@ FO::FO(int flag) speed = 10.0; hero.setTexture(Reimu); hero.setTextureRect(sf::IntRect(0, 0, width, height)); - hero.setPosition(sf::Vector2f(400, 820)); + hero.setPosition(sf::Vector2f(430, 820)); HSAmmo.setTexture(Reimu); HSAmmo.setTextureRect(sf::IntRect(0, 3 * height + 0, 25, 24)); HSAmmo.setRotation(270); @@ -78,6 +87,7 @@ FO::FO(int flag) width = 32; height = 32; speed = 2; + score = 50; //hero.setTexture(Enemy1); //hero.setTextureRect(sf::IntRect(0, 64, width, height)); //hero.setScale(sf::Vector2f(1.5, 1.5)); @@ -87,21 +97,31 @@ FO::FO(int flag) type = 3; width = 48; height = 32; + score = 200; break; case 4://mFairy type = 4; width = 48; height = 48; + score = 1000; break; case 5://mButterfly - HealthPoint = 120; + HealthPoint = 100; type = 5; width = 64; height = 64; + score = 1000; + break; + case 6://Ghost + HealthPoint = 1340; + type = 6; + width = 32; + height = 32; + score = 10000; + phase = 2; break; - -} } +} /*void FO::setSButterfly(double x, double y) { diff --git a/practices/cpp/level1/p11_Fighters/FO.h b/practices/cpp/level1/p11_Fighters/FO.h index 75f0c2f2..c0863975 100644 --- a/practices/cpp/level1/p11_Fighters/FO.h +++ b/practices/cpp/level1/p11_Fighters/FO.h @@ -18,11 +18,11 @@ class FO sf::Sprite hero, HSAmmo, LSAmmo; sf::Texture Reimu, Marisa, Sanae, Enemy1, Enemy2; //sf::Texture frame; - int HealthPoint, Score, width, height, staticFrame, dynamicFrame; + int HealthPoint, Score, width, height, staticFrame, dynamicFrame, phase; sf::Vector2f velocity; double damage, speed, theta; bool isSym; - int type, gap, born; + int type, gap, born, score, bounds; }; diff --git a/practices/cpp/level1/p11_Fighters/Game.cpp b/practices/cpp/level1/p11_Fighters/Game.cpp index 0271a069..ef146735 100644 --- a/practices/cpp/level1/p11_Fighters/Game.cpp +++ b/practices/cpp/level1/p11_Fighters/Game.cpp @@ -25,6 +25,7 @@ Game::Game() srand((unsigned)time(NULL)); remnant = 3; + score = 0; mIsMovingUp = false; mIsMovingDown = false; mIsMovingLeft = false; @@ -84,11 +85,11 @@ void Game::loadBackgrounds() { puts("Error: Load stage02b failed!"); } - if (!bg2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.10\\background\\stg3bg.png")) + if (!bg2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\background\\stage07\\stage02a.png")) { puts("Error: Load stage3bg failed!"); } - if (!bgEff2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.10\\background\\stg3bg2.png")) + if (!bgEff2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex\\background\\stage07\\stage02b.png")) { puts("Error: Load stage3bg failed!"); } @@ -112,10 +113,20 @@ void Game::loadBackgrounds() backEff[i].setPosition(65.0, (i - 1)*384.0/2.0 + 35.0); }*/ + if (!lifePieces.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\front\\lifePieces.png")) + { + puts("Error: Load lifePieces failed!"); + } + lifeBoard.setTexture(lifePieces); + if (!Title1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\front\\logo\\stg01logo.png")) { puts("Error: Load stg01logo failed!"); } + if (!whiteSpark.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\front\\White.png")) + { + puts("Error: Load White failed!"); + } } // void Game::loadPrimeFrame() @@ -170,6 +181,10 @@ void Game::loadPointsAndEffs() { puts("Error: Load deathCircle failed!"); } + if (!magicSquare.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\effect\\eff_magicsquare.png")) + { + puts("Error: Load magicsquare failed!"); + } } // void Game::loadEnemy() @@ -179,7 +194,11 @@ void Game::loadEnemy() { puts("Error: Load enemy1 failed!"); } - if (!Enemy2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy.png")) + if (!Enemy2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy2.png")) + { + puts("Error: Load enemy2 failed!"); + } + if (!Enemy3.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy5.png")) { puts("Error: Load enemy2 failed!"); } @@ -195,9 +214,9 @@ void Game::loadMusicAndSounds() { puts("Error: Open ϺꥹØ - δդ.wav failed!"); } - if (!stage2BGM.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - 񡩤_.wav")) + if (!stage2BGM.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - xᘤС Little Princess.wav")) { - puts("Error: Open ϺꥹØ - 񘔤ͨ Dark Road.wav failed!"); + puts("Error: Open ϺꥹØ - xᘤС Little Princess Dark Road.wav failed!"); } if (!stage3BGM.openFromFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\Canvas\\x64\\Debug\\ϺꥹØ - 񡩤_.wav")) { @@ -214,12 +233,27 @@ void Game::loadMusicAndSounds() puts("Error: Open se_tan00.wav failed!"); } enemyBulletSound.setBuffer(enemyBulletSoundBuffer); - enemyBulletSound.setVolume(30); + enemyBulletSound.setVolume(15); if (!breakSoundBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\origin.12\\se_enep00.wav")) { - puts("Error: Open se_enep02.wav failed!"); + puts("Error: Open se_enep00.wav failed!"); } breakSound.setBuffer(breakSoundBuffer); + if (!playerDeadSoundBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\origin.15\\se_pldead00.wav")) + { + puts("Error: Open se_pldead00.wav failed!"); + } + playerDeadSound.setBuffer(playerDeadSoundBuffer); + if (!SCAnounceBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.143\\se_cat00.wav")) + { + puts("Error: Open se_cat00.wav failed!"); + } + SCAnounce.setBuffer(SCAnounceBuffer); + if (!cardGetBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.143\\se_cardget.wav")) + { + puts("Error: Open se_cat00.wav failed!"); + } + cardGet.setBuffer(cardGetBuffer); } void Game::run() @@ -272,7 +306,7 @@ void Game::Stage1() curTime++; } - switch ((int)elapsed1.asSeconds()) + switch ((int)elapsed1.asSeconds()+0) { case 1: //pre @@ -285,20 +319,40 @@ void Game::Stage1() case 17: evts[3] = 1; break; - case 37: + case 23: + evts[4] = 1; + break; + case 29: + evts[5] = 1; + break; + case 36: //wave - + evts[6] = 1; + break; + case 41: + evts[7] = 1; break; - case 50: + case 49: //middle - + evts[8] = 1; break; - case 63: - //spellCard1 - + case 75: + //help + evts[9] = 1; + break; + case 81: + evts[10] = 1; + break; + case 90: + evts[11] = 1; break; case 100: //boss + evts[12] = 1; + break; + case 105: + //boss + evts[13] = 1; break; } @@ -316,6 +370,83 @@ void Game::Stage1() evts[2] = 0; } } + if (evts[3]) + { + if (S1E3()) + { + evts[3] = 0; + } + } + if (evts[4]) + { + if (S1E4()) + { + evts[4] = 0; + } + } + if (evts[5]) + { + if (S1E5()) + { + evts[5] = 0; + } + } + if (evts[6]) + { + if (S1E6()) + { + evts[6] = 0; + } + } + if (evts[7]) + { + if (S1E7()) + { + evts[7] = 0; + } + } + if (evts[8]) + { + if (S1E8()) + { + evts[8] = 0; + } + } + if (evts[9] && !evts[8]) + { + if (S1E9()) + { + evts[9] = 0; + } + } + if (evts[10]) + { + if (S1E10()) + { + evts[10] = 0; + } + } + if (evts[11]) + { + if (S1E11()) + { + evts[11] = 0; + } + } + if (evts[12]) + { + if (S1E12()) + { + evts[12] = 0; + } + } + if (evts[13]) + { + if (S1E13()) + { + evts[13] = 0; + } + } } int Game::S1E1() @@ -326,6 +457,7 @@ int Game::S1E1() double gapTime = 0.4; int gapFrame = gapTime * 60; static int gap = 0, temp = 0; + if (i1 % gapFrame == 1 && i1 < 15 * gapFrame) { FO sButterfly(2); @@ -338,7 +470,6 @@ int Game::S1E1() sButterfly.gap = gap; gap++; //printf("Now %x\n", sButterfly.hero); - wave1.push_back(sButterfly); } if (i1 == 270) @@ -354,6 +485,7 @@ int Game::S1E1() mButterfly.hero.setPosition(sf::Vector2f(400 - 200, -20.0)); wave2.push_back(mButterfly); } + wave1.remove_if(isFOOutOfBoard); for (list::iterator it = wave1.begin(); it != wave1.end(); it++) { @@ -361,9 +493,9 @@ int Game::S1E1() temp = i1 - it->gap * gapFrame; if (temp < 200)//phase1 { - if (i1 % 20 == 0) + if (rand() % 20 == 0) { - setRoundSnipe(it, 5.0); + setMultiRoundSnipe(it, 5.0, 5); } it->speed = 50.0 / (temp + 1.0); it->theta = 0.5*PI; @@ -396,8 +528,9 @@ int Game::S1E1() enemyCollisionProcessing(it); - pushToDraw(it); + enemiesPushToDraw(it); } + wave2.remove_if(isFOOutOfBoard); for (list::iterator it = wave2.begin(); it != wave2.end(); it++) { @@ -423,7 +556,7 @@ int Game::S1E1() enemyCollisionProcessing(it); - pushToDraw(it); + enemiesPushToDraw(it); } if (i1 > 15 * 60) @@ -457,7 +590,7 @@ int Game::S1E2() for (list::iterator it = wave1.begin(); it != wave1.end(); it++) { it->hero.setColor(sf::Color(255, 255, 255, -i1*(i1-301) / (151.0*150.0) * 255)); - pushToDraw(it); + enemiesPushToDraw(it); } if (i1 > 5 * 60) { @@ -472,141 +605,1428 @@ int Game::S1E3() static int i1 = 0; i1++; static list wave1, wave2; - double gapTime = 0.4; + double gapTime = 0.2; int gapFrame = gapTime * 60; static int gap = 0, temp = 0; + if (i1 % gapFrame == 1 && i1 < 15 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(600.0, 20.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); - if (i1 > 10 * 60) + wave1.push_back(sButterfly); + } + if (i1 == 21) { - wave1.clear();//Final clear for accident - wave2.clear(); - return 1; + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.born = i1; + mButterfly.hero.setPosition(sf::Vector2f(200.0, -20.0)); + wave2.push_back(mButterfly); } - return 0; -} -void Game::pushToDraw(list::iterator it) -{ - if (it->speed > EPS) + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) { - it->velocity.x = it->speed * cos(it->theta); - it->velocity.y = it->speed * sin(it->theta); - it->hero.move(it->velocity); - } - - enemies.push_back(it->hero); -} -void Game::frameDisplay()//ammo->front->player->jpoint -{ - - player.staticFrame = player.staticFrame % 56; - player.staticFrame++; - mWindow.clear(); - - backgroundDisplay(); + temp = i1 - it->gap * gapFrame; - playerAmmoDisplay(); + if (rand() % 5 == 0) + { + setRoundRandom(it, 4.0, 5, 60, 90);//setMultiRoundSnipe(it, 8.0, 5); + } + it->theta = 0.5*PI + temp * temp / 20000.0 * 0.2 * PI; + if (it->theta >= 0.9 * PI) + { + it->theta = 0.9 * PI; + } + if (it->theta <= 0.7 * PI) + { + it->hero.setTextureRect(sf::IntRect((int)(it->theta * 10.0 / PI) * it->width, 320, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp % 4 + 8) * it->width, 320, it->width, it->height)); + } - enemiesDisplay(); - - enemyBulletsDisplay(); + if (it->theta > PI / 2.0) + { + it->hero.setScale(-1.5, 1.5); + } - effsDisplay(); - // Draw the sprite - mWindow.draw(front01); - mWindow.draw(front02); - mWindow.draw(front03); - mWindow.draw(front04); + enemyCollisionProcessing(it); - playerDisplay(); + enemiesPushToDraw(it); + } - // Draw the string - mWindow.draw(text); - // Update the window - mWindow.display(); -} -// -void Game::backgroundDisplay() -{ - for (int i = 0; i < 6; i++) + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) { - if (back[i].getPosition().y >= 5 * 192 + 35) + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 150) { - back[i].setPosition(65.0, 35 - 192); + it->speed = (400.0 - i1) / 240; + it->theta = 0.5 * PI; } - back[i].move(0.0, 3.0); - mWindow.draw(back[i]); - - } - for (int i = 0; i < 4; i++) - { - if (backEff[i].getPosition().y >= 3 * 384 + 35) + else if (i1 >= 150 && i1 < 250) { - backEff[i].setPosition(65.0, 35 - 384); + it->speed = 0.0; + for (int i = 0; i < 4; i++) + { + setSharpRandom(it, 3.0); + } } - backEff[i].move(0.0, 5.0); - mWindow.draw(backEff[i]); - } -} -// -void Game::playerAmmoDisplay() -{ - //Ammo - if (mIsFire) - { - //playerAmmo = (mIsGrazing) ? player.LSAmmo : player.HSAmmo; - if (player.staticFrame % 2 == 1) + else { - player.LSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 4, player.hero.getPosition().y + 80)); - playerBullets.push_back(player.LSAmmo); - player.LSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 20, player.hero.getPosition().y + 80)); - playerBullets.push_back(player.LSAmmo); - player.HSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 4, player.hero.getPosition().y + 110)); - playerBullets.push_back(player.HSAmmo); - player.HSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 20, player.hero.getPosition().y + 110)); - playerBullets.push_back(player.HSAmmo); + it->speed = (i1 - 250) / 60.0; + it->theta = 1.5 * PI; } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); } - playerBullets.remove_if(isOutOfBoard); - for (list::iterator it = playerBullets.begin(); it != playerBullets.end(); it++) - { - //it->setPosition(it->getPosition().x, it->getPosition().y - 60); - it->move(0.0, - 60.0); - mWindow.draw(*it); - } -} -// -void Game::enemiesDisplay() -{ - for (list::iterator it = enemies.begin(); it != enemies.end(); it++) + + if (i1 > 10 * 60) { - //printf("Now %lf %lf!\n", it->getPosition().x, it->getPosition().y); - mWindow.draw(*it); + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; } - enemies.clear(); + return 0; } -// -void Game::enemyBulletsDisplay() + +int Game::S1E4() { - for (list::iterator it = enemyBullets.begin(); it != enemyBullets.end(); it++) + static int i1 = 0; + i1++; + static list wave1, wave2, wave3; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 % gapFrame == 1 && i1 < 10 * gapFrame) { - pushToDraw(it); + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(700.0, 960.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave1.push_back(sButterfly); } -} -// -void Game::playerDisplay() -{ - //player - if (mIsMovingLeft) + if (i1 % gapFrame == 1 && (i1 - 3 * 60) < 10 * gapFrame && (i1 - 3 * 60) > 0) { - if (player.dynamicFrame < 14) - { - player.dynamicFrame++; - } - player.hero.setTextureRect(sf::IntRect(player.width * (player.dynamicFrame / 2), player.height, player.width, player.height)); + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320 + 3 * sButterfly.height, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(200.0, 20.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave2.push_back(sButterfly); } - else if (mIsMovingRight) + if (i1 % gapFrame == 1 && (i1 - 3 * 60) < 10 * gapFrame && (i1 - 3 * 60) > 0) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(200.0, 960.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave3.push_back(sButterfly); + } + + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + + if (rand() % 10 == 0 && it->hero.getPosition().y < 400) + { + setRandom(it, 4.0, 1, 5, 60, 90); //setRoundRandom(it, 4.0, 5, 60, 90);//setMultiRoundSnipe(it, 8.0, 5); + } + + if (it->hero.getPosition().y >= 400) + { + it->theta = -0.5*PI; + } + else if (it->hero.getPosition().y < 400) + { + it->theta -= (0.5 * PI / 180.0); + } + + if (it->theta >= -0.7 * PI && it->hero.getPosition().y >= 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4) * it->width, 320, it->width, it->height)); + } + else if (it->theta >= -0.7 * PI && it->hero.getPosition().y < 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 32 % 4 + 3) * it->width, 320, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4 + 8) * it->width, 320, it->width, it->height)); + } + + if (it->theta < PI / 2.0) + { + it->hero.setScale(-1.5, 1.5); + } + //it->theta = -it->theta; + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + + if (rand() % 20 == 0) + { + setRandom(it, 4.0, 1, 5, 60, 90); //setRoundRandom(it, 4.0, 5, 60, 90);//setMultiRoundSnipe(it, 8.0, 5); + } + it->theta = 0.5*PI - temp * temp / 20000.0 * 0.2 * PI; + if (it->theta <= 0.1 * PI) + { + it->theta = 0.1 * PI; + } + if (it->theta >= 0.3 * PI) + { + it->hero.setTextureRect(sf::IntRect((int)(it->theta * 10.0 / PI) * it->width, 320 + 3 * it->height, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp % 4 + 8) * it->width, 320 + 3 * it->height, it->width, it->height)); + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + wave3.remove_if(isFOOutOfBoard); + for (list::iterator it = wave3.begin(); it != wave3.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + + if (rand() % 10 == 0 && it->hero.getPosition().y < 400) + { + setRandom(it, 4.0, 1, 5, 60, 90); //setRoundRandom(it, 4.0, 5, 60, 90);//setMultiRoundSnipe(it, 8.0, 5); + } + + if (it->hero.getPosition().y >= 400) + { + it->theta = -0.5*PI; + } + else if (it->hero.getPosition().y < 400) + { + it->theta += (0.5 * PI / 180.0); + } + + if (it->theta >= -0.3 * PI && it->hero.getPosition().y >= 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4) * it->width, 320 + 2 * it->height, it->width, it->height)); + } + else if (it->theta >= -0.3 * PI && it->hero.getPosition().y < 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4 + 8) * it->width, 320 + 2 * it->height, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 32 % 4 + 3) * it->width, 320 + 2 * it->height, it->width, it->height)); + } + + + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + if (i1 > 15 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + wave3.clear(); + return 1; + } + return 0; +} + +int Game::S1E5()//mButter quit anime dierction +{ + static int i1 = 0; + i1++; + static list wave1, wave2, wave3, wave4; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 == 1) + { + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.born = i1; + mButterfly.hero.setPosition(sf::Vector2f(250.0, -20.0)); + wave1.push_back(mButterfly); + } + if (i1 == 41) + { + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.born = i1; + mButterfly.hero.setPosition(sf::Vector2f(600.0, -20.0)); + wave2.push_back(mButterfly); + } + if (i1 % gapFrame == 1 && i1 < 10 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(700.0, 960.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave3.push_back(sButterfly); + } + if (i1 % gapFrame == 1 && i1 < 10 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320 + sButterfly.height, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(150.0, 960.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave4.push_back(sButterfly); + } + + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 80) + { + it->speed = (80 - i1) / 8.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 80 && i1 < 250) + { + it->speed = 0.0; + for (int i = 0; i < 1; i++) + { + setSharpRandom(it, 3.0); + } + } + else + { + it->speed = (i1 - 250) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) + { + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 120) + { + it->speed = (120 - i1) / 8.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 120 && i1 < 290) + { + it->speed = 0.0; + for (int i = 0; i < 1; i++) + { + setSharpRandom(it, 3.0); + } + } + else + { + it->speed = (i1 - 290) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + wave3.remove_if(isFOOutOfBoard); + for (list::iterator it = wave3.begin(); it != wave3.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + + if (rand() % 10 == 0 && it->hero.getPosition().y < 400) + { + setRandom(it, 4.0, 1, 5, 60, 90); //setRoundRandom(it, 4.0, 5, 60, 90);//setMultiRoundSnipe(it, 8.0, 5); + } + + if (it->hero.getPosition().y >= 400) + { + it->theta = -0.5*PI; + } + else if (it->hero.getPosition().y < 400) + { + it->theta -= (0.5 * PI / 180.0); + } + + if (it->theta >= -0.7 * PI && it->hero.getPosition().y >= 400) + { + it->hero.setTextureRect(sf::IntRect((int)fabs(temp / 8 % 4 - 1) * it->width, 320, it->width, it->height)); + } + else if (it->theta >= -0.7 * PI && it->hero.getPosition().y < 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 32 % 4 + 3) * it->width, 320, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4 + 8) * it->width, 320, it->width, it->height)); + } + + if (it->theta < PI / 2.0) + { + it->hero.setScale(-1.5, 1.5); + } + //it->theta = -it->theta; + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + wave4.remove_if(isFOOutOfBoard); + for (list::iterator it = wave4.begin(); it != wave4.end(); it++) + { + + temp = i1 - it->gap * gapFrame + 32; + + if (rand() % 30 == 0 && it->hero.getPosition().y < 400) + { + setRandom(it, 8.0, 1, 5, 60, 90); //setRoundRandom(it, 4.0, 5, 60, 90);//setMultiRoundSnipe(it, 8.0, 5); + } + + if (it->hero.getPosition().y >= 400) + { + it->theta = -0.5*PI; + } + else if (it->hero.getPosition().y < 400) + { + it->theta += (0.5 * PI / 180.0); + } + + if (it->theta >= -0.3 * PI && it->hero.getPosition().y >= 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4) * it->width, 320 + 2 * it->height, it->width, it->height)); + } + else if (it->theta >= -0.3 * PI && it->hero.getPosition().y < 400) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4 + 8) * it->width, 320 + 2 * it->height, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 32 % 4 + 3) * it->width, 320 + 2 * it->height, it->width, it->height)); + } + + + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + if (i1 > 15 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; + } + return 0; +} + +int Game::S1E6() +{ + static int i1 = 0; + i1++; + static list wave1, wave2, wave3, wave4; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 == 41) + { + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.born = i1; + mButterfly.hero.setPosition(sf::Vector2f(250.0, -20.0)); + wave1.push_back(mButterfly); + } + if (i1 == 1) + { + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.born = i1; + mButterfly.hero.setPosition(sf::Vector2f(600.0, -20.0)); + wave2.push_back(mButterfly); + } + if (i1 % gapFrame == 1 && i1 < 7 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setOrigin(sButterfly.width / 2, sButterfly.height / 2); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(800.0, 660.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave3.push_back(sButterfly); + } + if (i1 % gapFrame == 1 && i1 < 7 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320 + sButterfly.height, sButterfly.width, sButterfly.height)); + sButterfly.hero.setOrigin(sButterfly.width / 2, sButterfly.height / 2); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(0.0, 660.0)); + sButterfly.speed = 3.0; + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave4.push_back(sButterfly); + } + + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 120) + { + it->speed = (120 - i1) / 8.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 120 && i1 < 290) + { + it->speed = 0.0; + for (int i = 0; i < 1; i++) + { + setSharpRandom(it, 3.0); + } + } + else + { + it->speed = (i1 - 290) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) + { + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 80) + { + it->speed = (80 - i1) / 8.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 80 && i1 < 250) + { + it->speed = 0.0; + for (int i = 0; i < 1; i++) + { + setSharpRandom(it, 3.0); + } + } + else + { + it->speed = (i1 - 250) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + wave3.remove_if(isFOOutOfBoard); + for (list::iterator it = wave3.begin(); it != wave3.end(); it++) + { + temp = i1 - it->gap * gapFrame; + + if (rand() % 25 == 0 && it->hero.getPosition().y < 400) + { + setMultiRoundSnipe(it, 4.0, 5); + } + + if (it->hero.getPosition().x >= 650 && it->hero.getPosition().y < 500) + { + it->theta = 0; + } + else if (it->hero.getPosition().x >= 650 && it->hero.getPosition().y > 500) + { + it->theta = PI; + } + else + { + it->theta += (0.5 * PI / 100.0); + } + + standardSButterflyFrame(it, temp); + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + wave4.remove_if(isFOOutOfBoard); + for (list::iterator it = wave4.begin(); it != wave4.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + + if (rand() % 25 == 0 && it->hero.getPosition().y < 400) + { + setMultiRoundSnipe(it, 4.0, 5); + } + + if (it->hero.getPosition().x <= 150 && it->hero.getPosition().y > 500) + { + it->theta = 0; + } + else if (it->hero.getPosition().x <= 150 && it->hero.getPosition().y < 500) + { + it->theta = PI; + } + else + { + it->theta -= (0.5 * PI / 100.0); + } + + standardSButterflyFrame(it, temp); + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + if (i1 > 15 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + wave3.clear(); + wave4.clear(); + return 1; + } + return 0; +} + +int Game::S1E7() +{ + static int i1 = 0; + i1++; + static list wave1; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 == 1) + { + FO mButterflt(5); + mButterflt.hero.setTexture(Enemy1); + mButterflt.hero.setTextureRect(sf::IntRect(0, 448, mButterflt.width, mButterflt.height)); + mButterflt.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterflt.hero.setOrigin(mButterflt.width*0.5, mButterflt.height*0.5 - 24); + mButterflt.born = i1; + mButterflt.hero.setPosition(sf::Vector2f(450.0, -20.0)); + mButterflt.HealthPoint *= 4; + mButterflt.score *= 4; + wave1.push_back(mButterflt); + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + it->hero.setTextureRect(sf::IntRect(i1 % 50 / 10 * it->width, 448, it->width, it->height)); + if (i1 < 80) + { + it->speed = (80 - i1) / 16.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 80 && i1 < 400) + { + it->speed = 0.0; + + setSharpFlower1(it, 4.0, 4, 0); + + } + else + { + it->speed = (i1 - 400) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + if (i1 > 10 * 60) + { + wave1.clear();//Final clear for accident + return 1; + } + return 0; +} + +int Game::S1E8() +{ + static int i1 = 0, stp = 0; + i1++; + static list wave1, wave2; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 == 1) + { + FO ghost(6); + ghost.hero.setTexture(Enemy2); + ghost.hero.setTextureRect(sf::IntRect(0, 64, ghost.width, ghost.height)); + ghost.hero.setScale(sf::Vector2f(1.5, 1.5)); + ghost.hero.setOrigin(ghost.width*0.5, ghost.height*0.5 - 24); + ghost.born = i1; + ghost.hero.setPosition(sf::Vector2f(450.0, -20.0)); + FO spellBoard; + spellBoard.hero.setTexture(magicSquare); + spellBoard.hero.setOrigin(128, 128); + spellBoard.hero.setPosition(ghost.hero.getPosition()); + spellBoard.theta = 0; + spellBoard.hero.setColor(sf::Color(255, 255, 255, 127)); + wave1.push_back(ghost); + wave2.push_back(spellBoard); + } + if (wave1.size() == 0) + { + wave2.clear(); + return 1; + } + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) + { + it->hero.setPosition(wave1.begin()->hero.getPosition().x, wave1.begin()->hero.getPosition().y + 32); + it->theta += PI / 100.0; + it->hero.setRotation(it->theta / PI * 180.0 + 90); + backEsPushToDraw(it); + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + if (it->phase == 1 && stp == 0) + { + stp = 1; + i1 = 80; + } + it->hero.setTextureRect(sf::IntRect(i1 % 80 / 10 * it->width, 64, it->width, it->height)); + if (i1 < 80) + { + it->speed = (80 - i1) / 16.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 80 && i1 < 1200) + { + it->speed = 0.0; + switch (it->phase) + { + case 2: + nonSpellCard1(it); + break; + case 1: + if (i1 == 141) + { + SCAnounce.play(); + } + if (i1 > 3 * 60) + { + spellCard1(it); + } + break; + } + + + } + else + { + it->speed = (i1 - 1200) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + if (i1 > 60 * 60) + { + wave1.clear();//Final clear for accident + return 1; + } + return 0; +} + +int Game::S1E9() +{ + static int i1 = 0; + i1++; + static list wave1, wave2; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 % gapFrame == 1 && i1 < 30 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(rand() * 30 % 650 + 100, 20.0)); + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave1.push_back(sButterfly); + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + if (temp < 200)//phase1 + { + if (rand() % 45 == 0) + { + setMultiRoundSnipe(it, 5.0, 5); + } + it->speed = 50.0 / (temp + 1.0); + it->theta = 0.5*PI; + it->hero.setTextureRect(sf::IntRect(i1 % 35 / 7 * it->width, 320, it->width, it->height)); + } + else//phase2 + { + it->speed = (temp - 200) / 10.0; + it->theta = 0.5 * PI + pow(-1.0, it->gap + 1.0) * 10.0*PI / 360.0; + + if (it->speed <= 11) + { + it->hero.setTextureRect(sf::IntRect((int)it->speed * it->width, 320, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)11 * it->width, 320, it->width, it->height)); + } + if (it->theta > PI / 2.0) + { + it->hero.setScale(-1.5, 1.5); + + if (!it->isSym) + { + it->hero.move(1.5*it->width, 0); + it->isSym = true; + } + } + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + if (i1 > 10 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; + } + return 0; +} + +int Game::S1E10() +{ + static int i1 = 0; + i1++; + static list wave1, wave2; + double gapTime = 1.5; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 % gapFrame == 1 && i1 < 6 * gapFrame) + { + FO mButterfly(5); + mButterfly.hero.setTexture(Enemy1); + mButterfly.hero.setTextureRect(sf::IntRect(0, 448, mButterfly.width, mButterfly.height)); + mButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); + mButterfly.hero.setPosition(sf::Vector2f(450 + pow(-1, gap)*200, -20.0)); + mButterfly.born = i1; + mButterfly.gap = gap; + wave1.push_back(mButterfly); + gap++; + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + if (temp < 120)//phase1 + { + it->speed = 70.0 / (temp + 1.0); + it->theta = 0.5*PI; + //it->hero.setTextureRect(sf::IntRect(i1 % 35 / 7 * it->width, 320, it->width, it->height)); + } + else//phase2 + { + if (temp < 220) + { + it->speed = (temp - 120) / 20.0; + } + else + { + it->speed = 5; + } + if (it->gap % 2 == 0) + { + it->theta = PI; + } + else + { + it->theta = 0; + } + if (temp % 6 == 0) + { + setSharpLine(it, 5.0); + } + } + standardMButterflyFrame(it, temp); + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + if (i1 > 20 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; + } + return 0; + return 0; +} + +int Game::S1E11() +{ + static int i1 = 0; + i1++; + static list wave1, wave2; + double gapTime = 0.1; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 % gapFrame == 1 && i1 < 60 * gapFrame) + { + FO sButterfly(2); + sButterfly.hero.setTexture(Enemy1); + sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); + sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); + sButterfly.hero.setPosition(sf::Vector2f(rand() * 30 % 650 + 100, 20.0)); + //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); + sButterfly.born = i1; + sButterfly.gap = gap; + gap++; + //printf("Now %x\n", sButterfly.hero); + + wave1.push_back(sButterfly); + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + + temp = i1 - it->gap * gapFrame; + if (temp < 200)//phase1 + { + if (rand() % 90 == 0) + { + setRoundRandom(it, 6.0, 5, 0, PI); + } + it->speed = 50.0 / (temp + 1.0); + it->theta = 0.5*PI; + it->hero.setTextureRect(sf::IntRect(i1 % 35 / 7 * it->width, 320, it->width, it->height)); + } + else//phase2 + { + it->speed = (temp - 200) / 10.0; + it->theta = 0.5 * PI + pow(-1.0, it->gap + 1.0) * 10.0*PI / 360.0; + + if (it->speed <= 11) + { + it->hero.setTextureRect(sf::IntRect((int)it->speed * it->width, 320, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)11 * it->width, 320, it->width, it->height)); + } + if (it->theta > PI / 2.0) + { + it->hero.setScale(-1.5, 1.5); + + if (!it->isSym) + { + it->hero.move(1.5*it->width, 0); + it->isSym = true; + } + } + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + + if (i1 > 15 * 60) + { + wave1.clear();//Final clear for accident + wave2.clear(); + return 1; + } + return 0; +} + +int Game::S1E12() +{ + static int i1 = 0; + i1++; + static list wave1; + + if (i1 == 1) + { + FO mainTitle(0); + mainTitle.hero.setTexture(whiteSpark); + mainTitle.hero.setTextureRect(sf::IntRect(0, 0, 1280, 960)); + //mainTitle.hero.setScale(sf::Vector2f(1.5, 1.5)); + mainTitle.speed = 0.0; + mainTitle.hero.setPosition(sf::Vector2f(0, 0)); + mainTitle.hero.setColor(sf::Color(255, 255, 255, 0)); + + wave1.push_back(mainTitle); + } + + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + double alpha = -i1*(i1 - 301) / (151.0*150.0) * 255; + it->hero.setColor(sf::Color(255, 255, 255, alpha)); + if (i1 < 151) + { + stage1BGM.setVolume((255 - alpha) / 255.0*100.0); + if (alpha > 240) + { + stage1BGM.pause(); + for (int i = 0; i < 6; i++) + { + back[i].setTexture(bg2); + back[i].setScale(sf::Vector2f(1.5, 1.5)); + back[i].setPosition((float)65.0, (float)(i - 1)*192.0 + 35.0); + backEff[i].setTexture(bgEff2); + backEff[i].setScale(sf::Vector2f(1.5, 1.5)); + backEff[i].setPosition(65.0, (i - 1)*384.0 + 35.0); + } + } + } + enemiesPushToDraw(it); + } + if (i1 == 200) + { + stage2BGM.play(); + stage2BGM.setLoop(true); + } + if (i1 > 5 * 60) + { + wave1.clear();//Final clear for accident + return 1; + } + return 0; + /*static int i1 = 0; + i1++; + static list backGroundTrans; + + if (i1 == 1) + { + FO mainTitle(0); + mainTitle.hero.setTexture(Title1); + mainTitle.speed = 0.0; + mainTitle.hero.setPosition(sf::Vector2f(100, 100)); + mainTitle.hero.setColor(sf::Color(255, 255, 255, 0)); + backGroundTrans.push_back(mainTitle); + } + printf("1"); + for (list::iterator it = backGroundTrans.begin(); it != backGroundTrans.end(); it++) + { + it->hero.setColor(sf::Color(255, 255, 255, -i1*(i1 - 301) / (151.0*150.0) * 255)); + enemiesPushToDraw(it); + } + if (i1 > 5 * 60) + { + backGroundTrans.clear();//Final clear for accident + return 1; + } + return 0;*/ +} + +int Game::S1E13() +{ + static int i1 = 0, stp = 0; + i1++; + static list wave1, wave2; + double gapTime = 0.2; + int gapFrame = gapTime * 60; + static int gap = 0, temp = 0; + + if (i1 == 1) + { + FO ghost(6); + ghost.hero.setTexture(Enemy2); + ghost.hero.setTextureRect(sf::IntRect(0, 64, ghost.width, ghost.height)); + ghost.hero.setScale(sf::Vector2f(1.5, 1.5)); + ghost.hero.setOrigin(ghost.width*0.5, ghost.height*0.5 - 24); + ghost.born = i1; + ghost.hero.setPosition(sf::Vector2f(450.0, -20.0)); + FO spellBoard; + spellBoard.hero.setTexture(magicSquare); + spellBoard.hero.setOrigin(128, 128); + spellBoard.hero.setPosition(ghost.hero.getPosition()); + spellBoard.theta = 0; + spellBoard.hero.setColor(sf::Color(255, 255, 255, 127)); + wave1.push_back(ghost); + wave2.push_back(spellBoard); + } + if (wave1.size() == 0) + { + wave2.clear(); + return 1; + } + wave2.remove_if(isFOOutOfBoard); + for (list::iterator it = wave2.begin(); it != wave2.end(); it++) + { + it->hero.setPosition(wave1.begin()->hero.getPosition().x, wave1.begin()->hero.getPosition().y + 32); + it->theta += PI / 100.0; + it->hero.setRotation(it->theta / PI * 180.0 + 90); + backEsPushToDraw(it); + } + wave1.remove_if(isFOOutOfBoard); + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + if (it->phase == 1 && stp == 0) + { + stp = 1; + i1 = 80; + } + it->hero.setTextureRect(sf::IntRect(i1 % 80 / 10 * it->width, 64, it->width, it->height)); + if (i1 < 80) + { + it->speed = (80 - i1) / 16.0; + it->theta = 0.5 * PI; + } + else if (i1 >= 80 && i1 < 1200) + { + it->speed = 0.0; + switch (it->phase) + { + case 2: + nonSpellCard1(it); + break; + case 1: + if (i1 == 141) + { + SCAnounce.play(); + } + if (i1 > 3 * 60) + { + spellCard1(it); + } + break; + } + + + } + else + { + it->speed = (i1 - 1200) / 60.0; + it->theta = 1.5 * PI; + } + + enemyCollisionProcessing(it); + + enemiesPushToDraw(it); + } + if (i1 > 60 * 60) + { + wave1.clear();//Final clear for accident + return 1; + } + return 0; +} + +void Game::enemiesPushToDraw(list::iterator it) +{ + switch (it->type) + { + case 101://bound + if (it->hero.getPosition().y < 60 || it->hero.getPosition().y > 900) + { + if (it->bounds < 3) + { + it->theta += PI; + it->bounds++; + } + } + break; + } + if (it->speed > EPS) + { + it->velocity.x = it->speed * cos(it->theta); + it->velocity.y = it->speed * sin(it->theta); + it->hero.move(it->velocity); + } + + enemies.push_back(it->hero); +} + +void Game::backEsPushToDraw(list::iterator it) +{ + if (it->speed > EPS) + { + it->velocity.x = it->speed * cos(it->theta); + it->velocity.y = it->speed * sin(it->theta); + it->hero.move(it->velocity); + } + + backgroundEffs.push_back(it->hero); +} + +void Game::frameDisplay()//ammo->front->player->jpoint +{ + + player.staticFrame = player.staticFrame % 56; + player.staticFrame++; + mWindow.clear(); + + backgroundDisplay(); + + playerAmmoDisplay(); + + effsDisplay(); + + playerDisplay(); + + enemiesDisplay(); + + enemyBulletsDisplay(); + + boardDisplay(); + + // Draw the string + mWindow.draw(text); + // Update the window + mWindow.display(); +} +// +void Game::backgroundDisplay() +{ + for (int i = 0; i < 6; i++) + { + if (back[i].getPosition().y >= 5 * 192 + 35) + { + back[i].setPosition(65.0, 35 - 192); + } + back[i].move(0.0, 3.0); + mWindow.draw(back[i]); + + } + for (int i = 0; i < 4; i++) + { + if (backEff[i].getPosition().y >= 3 * 384 + 35) + { + backEff[i].setPosition(65.0, 35 - 384); + } + backEff[i].move(0.0, 5.0); + mWindow.draw(backEff[i]); + } + for (list::iterator it = backgroundEffs.begin(); it != backgroundEffs.end(); it++) + { + mWindow.draw(*it); + } + backgroundEffs.clear(); +} +// +void Game::playerAmmoDisplay() +{ + //Ammo + if (mIsFire) + { + //playerAmmo = (mIsGrazing) ? player.LSAmmo : player.HSAmmo; + if (player.staticFrame % 2 == 1) + { + player.LSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 4, player.hero.getPosition().y + 80)); + playerBullets.push_back(player.LSAmmo); + player.LSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 20, player.hero.getPosition().y + 80)); + playerBullets.push_back(player.LSAmmo); + player.HSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 4, player.hero.getPosition().y + 110)); + playerBullets.push_back(player.HSAmmo); + player.HSAmmo.setPosition(sf::Vector2f(player.hero.getPosition().x + 20, player.hero.getPosition().y + 110)); + playerBullets.push_back(player.HSAmmo); + } + } + playerBullets.remove_if(isOutOfBoard); + for (list::iterator it = playerBullets.begin(); it != playerBullets.end(); it++) + { + //it->setPosition(it->getPosition().x, it->getPosition().y - 60); + it->move(0.0, - 60.0); + mWindow.draw(*it); + } +} +// +void Game::enemiesDisplay() +{ + for (list::iterator it = enemies.begin(); it != enemies.end(); it++) + { + mWindow.draw(*it); + } + enemies.clear(); +} +// +/*void Game::enemyBulletsPreDisplay() +{ + enemyBulletsPre.remove_if([](FO obj) { if (obj.hero.getScale().x <= 1.0) return true; else return false; }); + for (list::iterator it = enemyBulletsPre.begin(); it != enemyBulletsPre.end(); it++) + { + it->hero.setScale(it->hero.getScale().x - 0.2, it->hero.getScale().y - 0.2); + it->hero.setColor(sf::Color(255, 255, 255, it->hero.getColor().White + 255 / 5)); + if (obj.hero.getScale().x <= 1.0) + { + enemyBullets.push_back(*it); + } + } +}*/ +// +void Game::enemyBulletsDisplay() +{ + enemyBullets.remove_if(isFOOutOfBoard); + for (list::iterator it = enemyBullets.begin(); it != enemyBullets.end(); it++) + { + enemiesPushToDraw(it); + } + + +} +// +void Game::playerDisplay() +{ + //player + static sf::Time elapsed1 = clock.getElapsedTime(); + if (checkPlayerCollision() && (clock.getElapsedTime().asSeconds() - elapsed1.asSeconds() > 1.0)) + { + for (list::iterator it = enemyBullets.begin(); it != enemyBullets.end(); it++) + { + enemyCrash(it); + } + elapsed1 = clock.getElapsedTime(); + playerDeadSound.play(); + if (remnant > 1) + { + remnant--; + } + else + { + printf("Game Over!\n"); + } + + } + if (mIsMovingLeft) + { + if (player.dynamicFrame < 14) + { + player.dynamicFrame++; + } + player.hero.setTextureRect(sf::IntRect(player.width * (player.dynamicFrame / 2), player.height, player.width, player.height)); + } + else if (mIsMovingRight) { if (player.dynamicFrame < 14) { @@ -622,13 +2042,12 @@ void Game::playerDisplay() mWindow.draw(player.hero);//updating - static int julgeRotate = 0; julgeRotate++; julgeRotate %= 360; julgePoint.setOrigin(32, 32); julgePoint.setRotation(julgeRotate); - julgePoint.setPosition(sf::Vector2f(player.hero.getPosition().x - 22 + 48, player.hero.getPosition().y - 8 + 48)); + julgePoint.setPosition(sf::Vector2f(player.hero.getPosition().x - 24 + 48, player.hero.getPosition().y - 8 + 48)); if (mIsGrazing) { mWindow.draw(julgePoint); @@ -656,7 +2075,44 @@ void Game::effsDisplay() mWindow.draw(*it); } - deathEffs.remove_if([](sf::Sprite obj) { if (obj.getScale().x > 2.3 || (obj.getRotation() < EPS && obj.getScale().x > 2.0))/* * 1.0 && obj.getRotation() == 0) || (obj.getScale().x > 2.3 && obj.getRotation() != 0))*/ return true; else return false; }); + deathEffs.remove_if([](sf::Sprite obj) { if (obj.getScale().x > 2.3 || (obj.getRotation() < EPS && obj.getScale().x > 2.0)) return true; else return false; }); +} +// +void Game::boardDisplay() +{ + mWindow.draw(front01); + mWindow.draw(front02); + mWindow.draw(front03); + mWindow.draw(front04); + + switch (remnant) + { + case 3: + lifeBoard.setTextureRect(sf::IntRect(0, 0, 272, 36)); + break; + case 2: + lifeBoard.setTextureRect(sf::IntRect(0, 44, 272, 36)); + break; + case 1: + lifeBoard.setTextureRect(sf::IntRect(0, 90, 272, 36)); + break; + default: + ; + } + + lifeBoard.setScale(1.5, 1.5); + lifeBoard.setPosition(830, 300); + mWindow.draw(lifeBoard); + + static string scoreStr; + scoreStr = "Score: "; + scoreStr += to_string(score); + tempScore.setString(scoreStr); + tempScore.setStyle(sf::Text::Italic); + tempScore.setFont(font); + tempScore.setCharacterSize(50); + tempScore.setPosition(840, 50); + mWindow.draw(tempScore); } void Game::enemyCollisionProcessing(list::iterator it) @@ -669,7 +2125,27 @@ void Game::enemyCollisionProcessing(list::iterator it) if (it->HealthPoint <= 0) { - enemyCrash(it); + it->phase--; + if (it->phase <= 0) + { + enemyCrash(it); + } + else + { + cardGet.play(); + breakSound.play(); + score += it->score; + deathEff.setTexture(deathCircle); + deathEff.setTextureRect(sf::IntRect(64, 0, 64, 64)); + deathEff.setOrigin(32, 32); + deathEff.setPosition(it->hero.getPosition().x + it->width * 0.25, it->hero.getPosition().y + it->height * 0.25); + deathEff.setScale(0.1, 0.1); + deathEffs.push_back(deathEff); + deathEff.setScale(0.3, 0.06); + deathEff.setRotation(rand() % 360); + deathEffs.push_back(deathEff); + it->HealthPoint += 1200; + } } } } @@ -678,6 +2154,7 @@ void Game::enemyCollisionProcessing(list::iterator it) void Game::enemyUnderAttack(list::iterator it, list::iterator itAmmo) { //printf("%d\n", it->HealthPoint); + score++; it->HealthPoint -= player.damage; AmmoEff.setTexture(buffetsEff); AmmoEff.setTextureRect(sf::IntRect(player.staticFrame % 7 * 48, 0, 48, 48)); @@ -689,10 +2166,11 @@ void Game::enemyUnderAttack(list::iterator it, list::iterator it void Game::enemyCrash(list::iterator it) { breakSound.play(); + score += it->score; deathEff.setTexture(deathCircle); deathEff.setTextureRect(sf::IntRect(64, 0, 64, 64)); deathEff.setOrigin(32, 32); - deathEff.setPosition(it->hero.getPosition().x + it->width * 0.5, it->hero.getPosition().y + it->height * 0.5); + deathEff.setPosition(it->hero.getPosition().x + it->width * 0.25, it->hero.getPosition().y + it->height * 0.25); deathEff.setScale(0.1, 0.1); deathEffs.push_back(deathEff); deathEff.setScale(0.3, 0.06); @@ -701,18 +2179,184 @@ void Game::enemyCrash(list::iterator it) it->hero.setPosition(-100, -100); } +void Game::standardSButterflyFrame(list::iterator it, int temp) +{ + double t1 = it->theta - 0.5 * PI; + double t2 = it->theta - 1.5 * PI; + int he = 320; + if (fabs(t1) < EPS || fabs(t2) * PI < EPS) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 5) * it->width, he, it->width, it->height)); + } + else if ((fabs(t1) > EPS && fabs(t1) < PI / 8.0) || (fabs(t2) > EPS && fabs(t2) < PI / 8.0)) + { + it->hero.setTextureRect(sf::IntRect(5 * it->width, he, it->width, it->height)); + } + else if ((fabs(t1) > PI / 8.0 && fabs(t1) < PI / 4.0) || (fabs(t2) > PI / 8.0 && fabs(t2) < PI / 4.0)) + { + it->hero.setTextureRect(sf::IntRect(6 * it->width, he, it->width, it->height)); + } + else if ((fabs(t1) > PI / 4.0 && fabs(t1) < PI / 2.0) || (fabs(t2) > PI / 4.0 && fabs(t2) < PI / 2.0)) + { + it->hero.setTextureRect(sf::IntRect(7 * it->width, he, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 4 + 8) * it->width, he, it->width, it->height)); + } + + if ((it->theta > 0.5 * PI && it->theta < 1.5 * PI) || (it->theta < -0.5 * PI && it->theta > -1.5 * PI)) + { + it->hero.setScale(-1.5, 1.5); + } + else + { + it->hero.setScale(1.5, 1.5); + } +} + +void Game::standardMButterflyFrame(list::iterator it, int temp) +{ + double t1 = it->theta - 0.5 * PI; + double t2 = it->theta - 1.5 * PI; + int he = 448; + if (fabs(t1) < EPS || fabs(t2) * PI < EPS) + { + it->hero.setTextureRect(sf::IntRect((int)(temp / 8 % 5) * it->width, he, it->width, it->height)); + } + else if ((fabs(t1) > EPS && fabs(t1) < PI / 8.0) || (fabs(t2) > EPS && fabs(t2) < PI / 8.0)) + { + it->hero.setTextureRect(sf::IntRect(5 * it->width, he, it->width, it->height)); + } + else if ((fabs(t1) > PI / 8.0 && fabs(t1) < PI / 4.0) || (fabs(t2) > PI / 8.0 && fabs(t2) < PI / 4.0)) + { + it->hero.setTextureRect(sf::IntRect(6 * it->width, he, it->width, it->height)); + } + else + { + it->hero.setTextureRect(sf::IntRect(7 * it->width, he + (temp / 8 % 3 - 2) * it->height, it->width, it->height)); + } + + if ((it->theta > 0.5 * PI && it->theta < 1.5 * PI) || (it->theta < -0.5 * PI && it->theta > -1.5 * PI)) + { + it->hero.setScale(-1.5, 1.5); + } + else + { + it->hero.setScale(1.5, 1.5); + } +} + +void Game::setSnipe(list::iterator it, double speed, int type, int color) +{ + enemyBulletSound.play(); + FO RoundSnipe; + RoundSnipe.speed = speed; + RoundSnipe.width = 16; + RoundSnipe.height = 16; + RoundSnipe.hero.setTexture(allBullets1); + RoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); + RoundSnipe.hero.setOrigin(8, 8); + RoundSnipe.hero.setScale(1.5, 1.5); + RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); + + //RoundSnipe.hero.setColor(sf::Color(255, 255, 255, 0)); + //RoundSnipe.hero.setScale(2.0, 2.0); + enemyBullets.push_back(RoundSnipe); +} + void Game::setRoundSnipe(list::iterator it, double speed) { enemyBulletSound.play(); FO RoundSnipe; RoundSnipe.speed = speed; + RoundSnipe.width = 16; + RoundSnipe.height = 16; RoundSnipe.hero.setTexture(allBullets1); RoundSnipe.hero.setTextureRect(sf::IntRect(80, 32, 16, 16)); RoundSnipe.hero.setOrigin(8, 8); RoundSnipe.hero.setScale(1.5, 1.5); RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); + + //RoundSnipe.hero.setColor(sf::Color(255, 255, 255, 0)); + //RoundSnipe.hero.setScale(2.0, 2.0); + enemyBullets.push_back(RoundSnipe); +} + +void Game::setMultiRoundSnipe(list::iterator it, double speed, int color) +{ + enemyBulletSound.play(); + FO RoundSnipe; + RoundSnipe.speed = speed; + RoundSnipe.width = 16; + RoundSnipe.height = 16; + RoundSnipe.hero.setTexture(allBullets1); + RoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, 48, 16, 16)); + RoundSnipe.hero.setOrigin(8, 8); + RoundSnipe.hero.setScale(1.5, 1.5); + RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); + enemyBullets.push_back(RoundSnipe); + RoundSnipe.theta += 0.4 * PI; enemyBullets.push_back(RoundSnipe); + RoundSnipe.theta -= 0.8 * PI; + enemyBullets.push_back(RoundSnipe); +} + +void Game::setGeneralMultiSnipe(list::iterator it, double speed, int type, int color, double angle) +{ + enemyBulletSound.play(); + FO RoundSnipe; + RoundSnipe.speed = speed; + RoundSnipe.width = 16; + RoundSnipe.height = 16; + RoundSnipe.hero.setTexture(allBullets1); + RoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); + RoundSnipe.hero.setOrigin(8, 8); + RoundSnipe.hero.setScale(1.5, 1.5); + RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x) + (rand() % 5 * 0.01 - 0.02) * PI; + enemyBullets.push_back(RoundSnipe); + RoundSnipe.theta += angle * PI; + enemyBullets.push_back(RoundSnipe); + RoundSnipe.theta -= angle * 2 * PI; + enemyBullets.push_back(RoundSnipe); +} + +void Game::setRandom(list::iterator it, double speed, int type, int color, double leftBoarder, double range) +{ + enemyBulletSound.play(); + FO RoundRandom; + RoundRandom.speed = speed; + RoundRandom.theta = rand() % (int)range + leftBoarder; + RoundRandom.width = 16; + RoundRandom.height = 16; + RoundRandom.hero.setTexture(allBullets1); + RoundRandom.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); + RoundRandom.hero.setOrigin(8, 8); + RoundRandom.hero.setScale(1.5, 1.5); + RoundRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + RoundRandom.hero.setRotation(RoundRandom.theta / PI * 180.0 + 90); + enemyBullets.push_back(RoundRandom); +} + +void Game::setRoundRandom(list::iterator it, double speed, int color, double leftBoarder, double range) +{ + enemyBulletSound.play(); + FO RoundRandom; + RoundRandom.speed = speed; + RoundRandom.theta = rand() % (int)range + leftBoarder; + RoundRandom.width = 16; + RoundRandom.height = 16; + RoundRandom.hero.setTexture(allBullets1); + RoundRandom.hero.setTextureRect(sf::IntRect(color * 16, 48, 16, 16)); + RoundRandom.hero.setOrigin(8, 8); + RoundRandom.hero.setScale(1.5, 1.5); + RoundRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + RoundRandom.hero.setRotation(RoundRandom.theta / PI * 180.0 + 90); + enemyBullets.push_back(RoundRandom); } void Game::setSharpRandom(list::iterator it, double speed) @@ -721,8 +2365,10 @@ void Game::setSharpRandom(list::iterator it, double speed) FO SharpRandom; SharpRandom.speed = speed; SharpRandom.theta = rand()%360; + SharpRandom.width = 16; + SharpRandom.height = 16; SharpRandom.hero.setTexture(allBullets1); - SharpRandom.hero.setTextureRect(sf::IntRect(80, 96, 16, 16)); + SharpRandom.hero.setTextureRect(sf::IntRect(64, 64, 16, 16));//80 96 SharpRandom.hero.setOrigin(8, 8); SharpRandom.hero.setScale(1.5, 1.5); SharpRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); @@ -730,6 +2376,180 @@ void Game::setSharpRandom(list::iterator it, double speed) enemyBullets.push_back(SharpRandom); } +void Game::setSharpLine(list::iterator it, double speed) +{ + enemyBulletSound.play(); + FO SharpRandom; + SharpRandom.speed = speed; + SharpRandom.theta = 0.5 * PI; + if (it->theta > 0.5 * PI) + { + SharpRandom.theta += it->speed * 0.04 * PI; + } + else + { + SharpRandom.theta -= it->speed * 0.04 * PI; + } + SharpRandom.width = 16; + SharpRandom.height = 16; + SharpRandom.hero.setTexture(allBullets1); + SharpRandom.hero.setTextureRect(sf::IntRect(64, 64, 16, 16));//80 96 + SharpRandom.hero.setOrigin(8, 8); + SharpRandom.hero.setScale(1.5, 1.5); + SharpRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + SharpRandom.hero.setRotation(SharpRandom.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpRandom); +} + +void Game::setSharpFlower1(list::iterator it, double speed, int type, int color)//sound Reform +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp -= 2 * PI; + } + enemyBulletSound.play(); + FO SharpFlower1; + SharpFlower1.speed = speed; + SharpFlower1.width = 16; + SharpFlower1.height = 16; + SharpFlower1.hero.setTexture(allBullets1); + SharpFlower1.hero.setTextureRect(sf::IntRect(0, 64, 16, 16)); + SharpFlower1.hero.setOrigin(8, 8); + SharpFlower1.hero.setScale(1.5, 1.5); + SharpFlower1.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (cts % 2 == 0) + { + for (int i = 0; i < 3; i++) + { + SharpFlower1.theta = theta1 + PI * 2 * i / 3.0; + SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpFlower1); + } + } + SharpFlower1.hero.setTextureRect(sf::IntRect(176, 64, 16, 16)); + SharpFlower1.hero.setOrigin(8, 8); + SharpFlower1.hero.setScale(1.5, 1.5); + SharpFlower1.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (temp >= 0 && temp <= PI) + { + SharpFlower1.speed /= 2.0; + SharpFlower1.speed += 9.0 / (temp + 1.5); + for (int i = 0; i < 3; i++) + { + SharpFlower1.theta = theta2 + PI * 2 * i / 3.0 + temp; + SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpFlower1); + SharpFlower1.theta = theta2 + PI * 2 * i / 3.0 - temp; + SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpFlower1); + } + } + + theta1 += 0.02 * PI; + temp += PI / 24.0; + if (sin(temp) < EPS) + { + theta2 = theta1 + PI / 6.0; + } +} + +void Game::nonSpellCard1(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp -= 2 * PI; + } + enemyBulletSound.play(); + FO nonSpell1; + nonSpell1.speed = 8.0; + nonSpell1.width = 16; + nonSpell1.height = 16; + nonSpell1.hero.setTexture(allBullets1); + nonSpell1.hero.setTextureRect(sf::IntRect(80, 64, 16, 16)); + nonSpell1.hero.setOrigin(8, 8); + nonSpell1.hero.setScale(1.5, 1.5); + nonSpell1.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + + for (int i = 0; i < 5; i++) + { + nonSpell1.theta = theta1 + PI * 2 * i / 5.0; + nonSpell1.hero.setRotation(nonSpell1.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell1); + } + + /*SharpFlower1.hero.setTextureRect(sf::IntRect(176, 64, 16, 16)); + SharpFlower1.hero.setOrigin(8, 8); + SharpFlower1.hero.setScale(1.5, 1.5); + SharpFlower1.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (temp >= 0 && temp <= PI) + { + SharpFlower1.speed /= 2.0; + SharpFlower1.speed += 9.0 / (temp + 1.5); + for (int i = 0; i < 3; i++) + { + SharpFlower1.theta = theta2 + PI * 2 * i / 3.0 + temp; + SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpFlower1); + SharpFlower1.theta = theta2 + PI * 2 * i / 3.0 - temp; + SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpFlower1); + } + }*/ + + theta1 += 0.04 * PI * sin(temp); + temp += PI / 120.0; + /*if (sin(temp) < EPS) + { + theta2 = theta1 + PI / 6.0; + }*/ +} + +void Game::spellCard1(list::iterator it) +{ + static double range = 0, x1 = rand() % 200 + 250; + static int ct = 0, temp = 0; + + FO Card1; + Card1.speed = 8.0; + Card1.width = 16; + Card1.height = 16; + Card1.hero.setTexture(allBullets1); + Card1.hero.setTextureRect(sf::IntRect(16, 7*16, 16, 16)); + Card1.hero.setOrigin(8, 8); + Card1.hero.setScale(1.5, 1.5); + Card1.theta = 1.5 * PI; + Card1.type = 101; + if (temp % 10 == 0) + { + enemyBulletSound.play(); + Card1.hero.setPosition(it->hero.getPosition().x + range, it->hero.getPosition().y + it->height); + enemyBullets.push_back(Card1); + Card1.hero.setPosition(it->hero.getPosition().x - range, it->hero.getPosition().y + it->height); + enemyBullets.push_back(Card1); + Card1.hero.setPosition(x1 + range, it->hero.getPosition().y + it->height); + enemyBullets.push_back(Card1); + Card1.hero.setPosition(x1 - range, it->hero.getPosition().y + it->height); + enemyBullets.push_back(Card1); + } + + (ct % 2) ? range-=16 : range+=16; + temp++; + if (range >= 350 || range <= 0) + { + ct++; + } +} + void Game::processTaps() { sf::Event event; @@ -766,7 +2586,7 @@ void Game::playerInput(sf::Keyboard::Key key, bool isPressed) mIsFire = isPressed; else if (key == sf::Keyboard::LShift) mIsGrazing = isPressed; - player.speed = (mIsGrazing) ? 4.0 : 10.0; + player.speed = (mIsGrazing) ? 3.0 : 10.0; } bool isOutOfBoard(sf::Sprite value) @@ -837,43 +2657,35 @@ bool Game::checkCollision(sf::Sprite obj1, sf::Sprite obj2) return false; } -/*bool Game::checkCollision(sf::Sprite obj1, sf::Sprite obj2) -{ - double x1, y1, th1, x2, y2, th2; - sf::Vector2f v1[4], v2[4]; - x1 = obj1.getPosition().x; - y1 = obj1.getPosition().y; - th1 = obj1.getRotation(); - x2 = obj2.getPosition().x; - y2 = obj2.getPosition().y; - th2 = obj1.getRotation(); - v1[0].x = x1; - v1[0].y = y1; - v1[1].x = x1 + obj1.getTextureRect().width + cos(obj1.getRotation()); - v1[1].y = y1; - v1[2].x = x1; - v1[2].y = y1 + obj1.getTextureRect().height + sin(obj1.getRotation()); - v1[3].x = x1 + obj1.getTextureRect().width + cos(obj1.getRotation()); - v1[3].y = y1 + obj1.getTextureRect().height + sin(obj1.getRotation()); - v2[0].x = x2; - v2[0].y = y2; - v2[1].x = x2 + obj2.getTextureRect().width + cos(obj2.getRotation()); - v2[1].y = y2; - v2[2].x = x2; - v2[2].y = y2 + obj2.getTextureRect().height + sin(obj2.getRotation()); - v2[3].x = x2 + obj2.getTextureRect().width + cos(obj2.getRotation()); - v2[3].y = y2 + obj2.getTextureRect().height + sin(obj2.getRotation()); - if (max(x1, x1 + obj1.getTextureRect().width) < min(x2, x2 + obj2.getTextureRect().width) || min(x1, x1 + obj1.getTextureRect().width) > max(x2, x2 + obj2.getTextureRect().width)) +bool Game::checkPlayerCollision() +{ + sf::Vector2f JP = julgePoint.getPosition(); + JP.x -= 8; + JP.y -= 8; + /*for (list::iterator it = enemies.begin(); it != enemies.end(); it++) { - return false; - } - if (max(y1, y1 + obj1.getTextureRect().height) < min(y2, y2 + obj2.getTextureRect().height) || min(y1, y1 + obj1.getTextureRect().height) > max(y2, y2 + obj2.getTextureRect().height)) + sf::FloatRect f = it->getGlobalBounds(); + + f.width /= 2.0; + f.height /= 2.0; + if (f.contains(JP)) + { + return true; + } + }*/ + for (list::iterator it = enemyBullets.begin(); it != enemyBullets.end(); it++) { - return false; - } + sf::FloatRect f = it->hero.getGlobalBounds(); - return true; -}*/ + f.width /= 2.0; + f.height /= 2.0; + if (f.contains(JP)) + { + return true; + } + } + return false; +} /*DWORD WINAPI BGMPlay(LPVOID lpParameter) { diff --git a/practices/cpp/level1/p11_Fighters/Game.h b/practices/cpp/level1/p11_Fighters/Game.h index 58dea049..25958bf0 100644 --- a/practices/cpp/level1/p11_Fighters/Game.h +++ b/practices/cpp/level1/p11_Fighters/Game.h @@ -23,52 +23,89 @@ class Game int S1E1(); int S1E2(); int S1E3(); - void pushToDraw(list::iterator it); + int S1E4(); + int S1E5(); + int S1E6(); + int S1E7(); + + int S1E8(); + + int S1E9(); + int S1E10(); + int S1E11(); + + int S1E12(); + + int S1E13(); + + void enemiesPushToDraw(list::iterator it); + void backEsPushToDraw(list::iterator it); void frameDisplay(); void backgroundDisplay(); void playerAmmoDisplay(); void enemiesDisplay(); + //void enemyBulletsPreDisplay(); void enemyBulletsDisplay(); void playerDisplay(); void effsDisplay(); + void boardDisplay(); void enemyCollisionProcessing(list::iterator it); void enemyUnderAttack(list::iterator it, list::iterator itAmmo); void enemyCrash(list::iterator it); + void standardSButterflyFrame(list::iterator it, int temp); + void standardMButterflyFrame(list::iterator it, int temp); + + void setSnipe(list::iterator it, double speed, int type, int color); + // void setRoundSnipe(list::iterator it, double speed); + // + void setMultiRoundSnipe(list::iterator it, double speed, int color); + + void setGeneralMultiSnipe(list::iterator it, double speed, int type, int color, double angle); + + void setRandom(list::iterator it, double speed, int type, int color, double leftBoarder, double range); + // + void setRoundRandom(list::iterator it, double speed, int color, double leftBoarder, double range); + // void setSharpRandom(list::iterator it, double speed); + + void setSharpLine(list::iterator it, double speed); + + void setSharpFlower1(list::iterator it, double speed, int type, int color); + + void nonSpellCard1(list::iterator it); + void spellCard1(list::iterator it); + void processTaps(); void playerInput(sf::Keyboard::Key key, bool isPressed); friend bool isOutOfBoard(sf::Sprite value);//wait for updating friend bool isFOOutOfBoard(FO value);//wait for updating void mainProcessing(); bool checkCollision(sf::Sprite obj1, sf::Sprite obj2); + bool checkPlayerCollision(); /*friend DWORD WINAPI BGMPlay(LPVOID lpParameter);*/ ~Game(); -/*private: - void checkCollision(PFITERATOR object1, PFITERATOR object2); - bool checkOverstep(PFITERATOR object); - */ private: Game* self = this; bool mIsMovingUp, mIsMovingDown, mIsMovingLeft, mIsMovingRight, mIsGrazing, mIsFire; sf::RenderWindow mWindow; sf::Font font; - sf::Text text; - sf::Texture loading, nowLoading, stageSelect, front00, julgePointArray, Title1, allBullets1, allBullets2; - sf::Texture bullets, buffetsEff, deathCircle, bg1, bgEff1, bg2, bgEff2, bg3, bgEff3, Enemy1, Enemy2; + sf::Text text, tempScore; + sf::Texture loading, nowLoading, stageSelect, front00, julgePointArray, Title1, allBullets1, allBullets2, whiteSpark; + sf::Texture bullets, buffetsEff, deathCircle, bg1, bgEff1, bg2, bgEff2, bg3, bgEff3, Enemy1, Enemy2, Enemy3, lifePieces, magicSquare; sf::Sprite loadingUI, loadingUISub, back[6], backEff[6], front01, front02, front03, front04; - sf::Sprite julgePoint, playerAmmo, AmmoEff, deathEff; + sf::Sprite julgePoint, playerAmmo, AmmoEff, deathEff, lifeBoard; sf::Music menuMusic, stage1BGM, stage2BGM, stage3BGM; sf::SoundBuffer playerBulletSoundBuffer, playerBulletSoundBuffer1, enemyBulletSoundBuffer, collisionSoundBuffer, spellCardSoundBuffer, buttomSoundBuffer; - sf::SoundBuffer breakSoundBuffer; - sf::Sound playerBulletSound, playerBulletSound1, enemyBulletSound, collisionSound, spellCardSound, buttomSound; - sf::Sound breakSound; + sf::SoundBuffer breakSoundBuffer, playerDeadSoundBuffer, SCAnounceBuffer, cardGetBuffer; + sf::Sound playerBulletSound, playerBulletSound1, enemyBulletSound, collisionSound, spellCardSound, buttomSound, SCAnounce, cardGet; + sf::Sound breakSound, playerDeadSound; sf::Clock clock; FO player; - list enemyBullets; + list enemyBullets, enemyBulletsPre; list playerBullets, deathEffs; - list enemies, playerBulletsEffs; - int remnant; + list enemies, playerBulletsEffs, backgroundEffs; + long long remnant, score; }; From fefbf4a6740949a884aee6708bd9b5b47c54dc20 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Wed, 14 Jun 2017 00:32:09 +0800 Subject: [PATCH 09/10] 0614 --- practices/cpp/level1/p11_Fighters/FO.cpp | 7 +- practices/cpp/level1/p11_Fighters/FO.h | 7 +- practices/cpp/level1/p11_Fighters/Game.cpp | 912 +++++++++++++++++---- practices/cpp/level1/p11_Fighters/Game.h | 14 +- 4 files changed, 753 insertions(+), 187 deletions(-) diff --git a/practices/cpp/level1/p11_Fighters/FO.cpp b/practices/cpp/level1/p11_Fighters/FO.cpp index e0dca091..4780c6c6 100644 --- a/practices/cpp/level1/p11_Fighters/FO.cpp +++ b/practices/cpp/level1/p11_Fighters/FO.cpp @@ -3,10 +3,6 @@ #include #include #include -void FO::crash() -{ - ; -} FO::FO() { @@ -19,6 +15,7 @@ FO::FO() score = 0; damage = 1.0; isSym = false; + HealthPoint = 1; } FO::FO(int flag) @@ -32,7 +29,7 @@ FO::FO(int flag) score = 0; damage = 1.0; isSym = false; - + HealthPoint = 1; switch (flag) { diff --git a/practices/cpp/level1/p11_Fighters/FO.h b/practices/cpp/level1/p11_Fighters/FO.h index c0863975..5c7c30bf 100644 --- a/practices/cpp/level1/p11_Fighters/FO.h +++ b/practices/cpp/level1/p11_Fighters/FO.h @@ -6,7 +6,6 @@ class FO { public: - void crash(); FO(); FO(int flag); void setSButterfly(double x, double y); @@ -15,14 +14,12 @@ class FO public: + sf::Vector2f velocity; sf::Sprite hero, HSAmmo, LSAmmo; sf::Texture Reimu, Marisa, Sanae, Enemy1, Enemy2; - //sf::Texture frame; int HealthPoint, Score, width, height, staticFrame, dynamicFrame, phase; - sf::Vector2f velocity; + int type, gap, born, score, bounds; double damage, speed, theta; bool isSym; - int type, gap, born, score, bounds; - }; diff --git a/practices/cpp/level1/p11_Fighters/Game.cpp b/practices/cpp/level1/p11_Fighters/Game.cpp index ef146735..939d27bf 100644 --- a/practices/cpp/level1/p11_Fighters/Game.cpp +++ b/practices/cpp/level1/p11_Fighters/Game.cpp @@ -3,7 +3,6 @@ #include #include #include -#include //Delete it when project completes #include #include #include @@ -50,8 +49,6 @@ Game::Game() loadMusicAndSounds(); - Sleep(1000);//Cancel it when Game project completes - } // void Game::NowLoading() @@ -123,6 +120,10 @@ void Game::loadBackgrounds() { puts("Error: Load stg01logo failed!"); } + if (!Title2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\front\\front01.png")) + { + puts("Error: Load clear failed!"); + } if (!whiteSpark.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\front\\White.png")) { puts("Error: Load White failed!"); @@ -175,11 +176,11 @@ void Game::loadPointsAndEffs() } if (!allBullets1.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\bullet\\bullet1.png")) { - puts("Error: Load deathCircle failed!"); + puts("Error: Load bullet1 failed!"); } if (!allBullets2.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\bullet\\bullet2.png")) { - puts("Error: Load deathCircle failed!"); + puts("Error: Load bullet2 failed!"); } if (!magicSquare.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\effect\\eff_magicsquare.png")) { @@ -200,7 +201,7 @@ void Game::loadEnemy() } if (!Enemy3.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.15\\enemy\\enemy5.png")) { - puts("Error: Load enemy2 failed!"); + puts("Error: Load enemy3 failed!"); } } // @@ -251,7 +252,7 @@ void Game::loadMusicAndSounds() SCAnounce.setBuffer(SCAnounceBuffer); if (!cardGetBuffer.loadFromFile("E:\\Media\\Sources\\Jpg&Png\\TH\\Ex.143\\se_cardget.wav")) { - puts("Error: Open se_cat00.wav failed!"); + puts("Error: Open se_cardget.wav failed!"); } cardGet.setBuffer(cardGetBuffer); } @@ -306,7 +307,7 @@ void Game::Stage1() curTime++; } - switch ((int)elapsed1.asSeconds()+0) + switch ((int)elapsed1.asSeconds() + 0)//for testing { case 1: //pre @@ -329,7 +330,7 @@ void Game::Stage1() //wave evts[6] = 1; break; - case 41: + case 42: evts[7] = 1; break; case 49: @@ -337,7 +338,7 @@ void Game::Stage1() evts[8] = 1; break; case 75: - //help + //reinforce evts[9] = 1; break; case 81: @@ -347,7 +348,7 @@ void Game::Stage1() evts[11] = 1; break; case 100: - //boss + //Scene switching evts[12] = 1; break; case 105: @@ -445,6 +446,14 @@ void Game::Stage1() if (S1E13()) { evts[13] = 0; + evts[14] = 1; + } + } + if (evts[14]) + { + if (S1E14()) + { + evts[14] = 0; } } } @@ -616,11 +625,9 @@ int Game::S1E3() sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); sButterfly.hero.setPosition(sf::Vector2f(600.0, 20.0)); sButterfly.speed = 3.0; - //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); sButterfly.born = i1; sButterfly.gap = gap; gap++; - //printf("Now %x\n", sButterfly.hero); wave1.push_back(sButterfly); } @@ -915,6 +922,7 @@ int Game::S1E5()//mButter quit anime dierction mButterfly.hero.setOrigin(mButterfly.width*0.5, mButterfly.height*0.5 - 24); mButterfly.born = i1; mButterfly.hero.setPosition(sf::Vector2f(600.0, -20.0)); + mButterfly.HealthPoint = 60; wave2.push_back(mButterfly); } if (i1 % gapFrame == 1 && i1 < 10 * gapFrame) @@ -1082,9 +1090,6 @@ int Game::S1E5()//mButter quit anime dierction { it->hero.setTextureRect(sf::IntRect((int)(temp / 32 % 4 + 3) * it->width, 320 + 2 * it->height, it->width, it->height)); } - - - enemyCollisionProcessing(it); enemiesPushToDraw(it); @@ -1295,9 +1300,6 @@ int Game::S1E7() static int i1 = 0; i1++; static list wave1; - double gapTime = 0.2; - int gapFrame = gapTime * 60; - static int gap = 0, temp = 0; if (i1 == 1) { @@ -1325,7 +1327,7 @@ int Game::S1E7() { it->speed = 0.0; - setSharpFlower1(it, 4.0, 4, 0); + setSharpFlower1(it, 4.0, 4, 0); } else @@ -1351,9 +1353,6 @@ int Game::S1E8() static int i1 = 0, stp = 0; i1++; static list wave1, wave2; - double gapTime = 0.2; - int gapFrame = gapTime * 60; - static int gap = 0, temp = 0; if (i1 == 1) { @@ -1523,11 +1522,11 @@ int Game::S1E10() static int i1 = 0; i1++; static list wave1, wave2; - double gapTime = 1.5; + double gapTime = 1.8; int gapFrame = gapTime * 60; static int gap = 0, temp = 0; - if (i1 % gapFrame == 1 && i1 < 6 * gapFrame) + if (i1 % gapFrame == 1 && i1 < 5 * gapFrame) { FO mButterfly(5); mButterfly.hero.setTexture(Enemy1); @@ -1549,7 +1548,6 @@ int Game::S1E10() { it->speed = 70.0 / (temp + 1.0); it->theta = 0.5*PI; - //it->hero.setTextureRect(sf::IntRect(i1 % 35 / 7 * it->width, 320, it->width, it->height)); } else//phase2 { @@ -1588,7 +1586,6 @@ int Game::S1E10() return 1; } return 0; - return 0; } int Game::S1E11() @@ -1607,11 +1604,9 @@ int Game::S1E11() sButterfly.hero.setTextureRect(sf::IntRect(0, 320, sButterfly.width, sButterfly.height)); sButterfly.hero.setScale(sf::Vector2f(1.5, 1.5)); sButterfly.hero.setPosition(sf::Vector2f(rand() * 30 % 650 + 100, 20.0)); - //sButterfly.setSButterfly(400 + pow(-1.0, i1 / gapFrame) * i1, 20.0); sButterfly.born = i1; sButterfly.gap = gap; gap++; - //printf("Now %x\n", sButterfly.hero); wave1.push_back(sButterfly); } @@ -1680,7 +1675,6 @@ int Game::S1E12() FO mainTitle(0); mainTitle.hero.setTexture(whiteSpark); mainTitle.hero.setTextureRect(sf::IntRect(0, 0, 1280, 960)); - //mainTitle.hero.setScale(sf::Vector2f(1.5, 1.5)); mainTitle.speed = 0.0; mainTitle.hero.setPosition(sf::Vector2f(0, 0)); mainTitle.hero.setColor(sf::Color(255, 255, 255, 0)); @@ -1722,31 +1716,6 @@ int Game::S1E12() return 1; } return 0; - /*static int i1 = 0; - i1++; - static list backGroundTrans; - - if (i1 == 1) - { - FO mainTitle(0); - mainTitle.hero.setTexture(Title1); - mainTitle.speed = 0.0; - mainTitle.hero.setPosition(sf::Vector2f(100, 100)); - mainTitle.hero.setColor(sf::Color(255, 255, 255, 0)); - backGroundTrans.push_back(mainTitle); - } - printf("1"); - for (list::iterator it = backGroundTrans.begin(); it != backGroundTrans.end(); it++) - { - it->hero.setColor(sf::Color(255, 255, 255, -i1*(i1 - 301) / (151.0*150.0) * 255)); - enemiesPushToDraw(it); - } - if (i1 > 5 * 60) - { - backGroundTrans.clear();//Final clear for accident - return 1; - } - return 0;*/ } int Game::S1E13() @@ -1754,9 +1723,6 @@ int Game::S1E13() static int i1 = 0, stp = 0; i1++; static list wave1, wave2; - double gapTime = 0.2; - int gapFrame = gapTime * 60; - static int gap = 0, temp = 0; if (i1 == 1) { @@ -1773,6 +1739,7 @@ int Game::S1E13() spellBoard.hero.setPosition(ghost.hero.getPosition()); spellBoard.theta = 0; spellBoard.hero.setColor(sf::Color(255, 255, 255, 127)); + ghost.phase = 10; wave1.push_back(ghost); wave2.push_back(spellBoard); } @@ -1786,15 +1753,16 @@ int Game::S1E13() { it->hero.setPosition(wave1.begin()->hero.getPosition().x, wave1.begin()->hero.getPosition().y + 32); it->theta += PI / 100.0; + it->hero.setScale(1.0 + 0.1*sin(i1 / 11.0), 1.0 + 0.1*sin(i1 / 11.0)); it->hero.setRotation(it->theta / PI * 180.0 + 90); backEsPushToDraw(it); } wave1.remove_if(isFOOutOfBoard); for (list::iterator it = wave1.begin(); it != wave1.end(); it++) { - if (it->phase == 1 && stp == 0) + if (it->phase + stp == 9) { - stp = 1; + stp++; i1 = 80; } it->hero.setTextureRect(sf::IntRect(i1 % 80 / 10 * it->width, 64, it->width, it->height)); @@ -1803,39 +1771,169 @@ int Game::S1E13() it->speed = (80 - i1) / 16.0; it->theta = 0.5 * PI; } - else if (i1 >= 80 && i1 < 1200) + else if (i1 >= 80 && i1 < 12000) { it->speed = 0.0; switch (it->phase) { + case 10: + nonSpellCard2(it); + break; + case 9: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + spellCard2(it); + } + break; + case 8: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + nonSpellCard3(it); + } + break; + case 7: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + spellCard3(it); + } + break; + case 6: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + nonSpellCard4(it); + } + break; + case 5: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + spellCard4(it); + } + break; + case 4: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + nonSpellCard5(it); + } + break; + case 3: + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + spellCard5(it); + } + break; case 2: - nonSpellCard1(it); + if (i1 == 241) + { + SCAnounce.play(); + } + if (i1 > 6 * 60) + { + nonSpellCard6(it); + } break; case 1: - if (i1 == 141) + if (i1 == 241) { SCAnounce.play(); } - if (i1 > 3 * 60) + if (i1 > 6 * 60) { - spellCard1(it); + spellCard6(it); } break; } - - } else { - it->speed = (i1 - 1200) / 60.0; + it->speed = (i1 - 12000) / 60.0; it->theta = 1.5 * PI; } enemyCollisionProcessing(it); enemiesPushToDraw(it); + + if (i1 > 120 * 60) + { + if (it->phase >= 2) + { + cardGet.play(); + breakSound.play(); + score += it->score; + deathEff.setTexture(deathCircle); + deathEff.setTextureRect(sf::IntRect(64, 0, 64, 64)); + deathEff.setOrigin(32, 32); + deathEff.setPosition(it->hero.getPosition().x + it->width * 0.25, it->hero.getPosition().y + it->height * 0.25); + deathEff.setScale(0.1, 0.1); + deathEffs.push_back(deathEff); + deathEff.setScale(0.3, 0.06); + deathEff.setRotation(rand() % 360); + deathEffs.push_back(deathEff); + it->HealthPoint += 1500; + } + else + { + wave1.clear();//Final clear for accident + } + + return 1; + } + } + return 0; +} + +int Game::S1E14() +{ + static int i1 = 0; + i1++; + static list wave1; + + if (i1 == 1) + { + FO mainTitle(0); + mainTitle.hero.setTexture(Title2); + mainTitle.hero.setTextureRect(sf::IntRect(0, 0, 512, 256)); + mainTitle.speed = 0.0; + mainTitle.hero.setPosition(sf::Vector2f(200.0, 150.0)); + mainTitle.hero.setColor(sf::Color(255, 255, 255, 0)); + + wave1.push_back(mainTitle); + } + + for (list::iterator it = wave1.begin(); it != wave1.end(); it++) + { + it->hero.setColor(sf::Color(255, 255, 255, -i1*(i1 - 301) / (151.0*150.0) * 255)); + enemiesPushToDraw(it); } - if (i1 > 60 * 60) + if (i1 > 5 * 60) { wave1.clear();//Final clear for accident return 1; @@ -1857,6 +1955,63 @@ void Game::enemiesPushToDraw(list::iterator it) } } break; + case 103: + it->HealthPoint++; + if (it->HealthPoint > 60 && it->phase > 0) + { + enemyBulletSound.play(); + FO nonSpell1; + nonSpell1.speed = it->speed; + nonSpell1.width = 16; + nonSpell1.height = 16; + nonSpell1.hero.setTexture(allBullets1); + switch (it->phase) + { + case 4: + nonSpell1.hero.setTextureRect(sf::IntRect(32, 16, 16, 16)); + break; + case 3: + nonSpell1.hero.setTextureRect(sf::IntRect(32, 16, 16, 16)); + break; + case 2: + nonSpell1.hero.setTextureRect(sf::IntRect(240, 16, 16, 16)); + break; + case 1: + nonSpell1.hero.setTextureRect(sf::IntRect(160, 16, 16, 16)); + break; + } + nonSpell1.hero.setOrigin(8, 8); + nonSpell1.hero.setScale(1.5, 1.5); + nonSpell1.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y); + nonSpell1.type = 103; + nonSpell1.phase = it->phase-1; + for (int i = 0; i < 5; i++) + { + nonSpell1.speed += i / 10.0; + nonSpell1.theta = it->theta + PI - 18 / 180.0*PI + i*18.0 / 180.0*PI; + nonSpell1.hero.setRotation(nonSpell1.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell1); + } + it->hero.setPosition(-100, -100); + return; + } + break; + case 104: + it->HealthPoint++; + if (it->speed > EPS) + { + it->velocity.x = it->speed * cos(it->theta); + it->velocity.y = it->speed * sin(it->theta) + 4.9*it->HealthPoint*it->HealthPoint/7200.0; + it->hero.setRotation(atan2(it->velocity.y, it->velocity.x) / PI * 180.0 + 90); + if (it->velocity.y >= 8) + { + it->velocity.y = 8; + } + it->hero.move(it->velocity); + } + enemies.push_back(it->hero); + return; + break; } if (it->speed > EPS) { @@ -1956,7 +2111,6 @@ void Game::playerAmmoDisplay() playerBullets.remove_if(isOutOfBoard); for (list::iterator it = playerBullets.begin(); it != playerBullets.end(); it++) { - //it->setPosition(it->getPosition().x, it->getPosition().y - 60); it->move(0.0, - 60.0); mWindow.draw(*it); } @@ -1992,8 +2146,6 @@ void Game::enemyBulletsDisplay() { enemiesPushToDraw(it); } - - } // void Game::playerDisplay() @@ -2014,7 +2166,7 @@ void Game::playerDisplay() } else { - printf("Game Over!\n"); + GameOver();//printf("Game Over!\n"); } } @@ -2067,11 +2219,6 @@ void Game::effsDisplay() i += 0.1; it->setScale(i, i*j); it->setColor(sf::Color(255, 255, 255, 255 * (1.2 - 0.5*i))); - /*if (it->getRotation() > EPS) - { - // it->setScale(i + 0.3, (i + 0.3)*j); - it->setColor(sf::Color(255, 255, 255, 255 * (1 - 0.5*(i - 0.3)))); - }*/ mWindow.draw(*it); } @@ -2144,7 +2291,7 @@ void Game::enemyCollisionProcessing(list::iterator it) deathEff.setScale(0.3, 0.06); deathEff.setRotation(rand() % 360); deathEffs.push_back(deathEff); - it->HealthPoint += 1200; + it->HealthPoint += 1500; } } } @@ -2153,7 +2300,6 @@ void Game::enemyCollisionProcessing(list::iterator it) void Game::enemyUnderAttack(list::iterator it, list::iterator itAmmo) { - //printf("%d\n", it->HealthPoint); score++; it->HealthPoint -= player.damage; AmmoEff.setTexture(buffetsEff); @@ -2250,20 +2396,18 @@ void Game::standardMButterflyFrame(list::iterator it, int temp) void Game::setSnipe(list::iterator it, double speed, int type, int color) { enemyBulletSound.play(); - FO RoundSnipe; - RoundSnipe.speed = speed; - RoundSnipe.width = 16; - RoundSnipe.height = 16; - RoundSnipe.hero.setTexture(allBullets1); - RoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); - RoundSnipe.hero.setOrigin(8, 8); - RoundSnipe.hero.setScale(1.5, 1.5); - RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); - RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); - - //RoundSnipe.hero.setColor(sf::Color(255, 255, 255, 0)); - //RoundSnipe.hero.setScale(2.0, 2.0); - enemyBullets.push_back(RoundSnipe); + FO Snipe; + Snipe.speed = speed; + Snipe.width = 16; + Snipe.height = 16; + Snipe.hero.setTexture(allBullets1); + Snipe.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); + Snipe.hero.setOrigin(8, 8); + Snipe.hero.setScale(1.5, 1.5); + Snipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + Snipe.theta = atan2(julgePoint.getPosition().y - Snipe.hero.getPosition().y, julgePoint.getPosition().x - Snipe.hero.getPosition().x); + + enemyBullets.push_back(Snipe); } void Game::setRoundSnipe(list::iterator it, double speed) @@ -2280,66 +2424,64 @@ void Game::setRoundSnipe(list::iterator it, double speed) RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); - //RoundSnipe.hero.setColor(sf::Color(255, 255, 255, 0)); - //RoundSnipe.hero.setScale(2.0, 2.0); enemyBullets.push_back(RoundSnipe); } void Game::setMultiRoundSnipe(list::iterator it, double speed, int color) { enemyBulletSound.play(); - FO RoundSnipe; - RoundSnipe.speed = speed; - RoundSnipe.width = 16; - RoundSnipe.height = 16; - RoundSnipe.hero.setTexture(allBullets1); - RoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, 48, 16, 16)); - RoundSnipe.hero.setOrigin(8, 8); - RoundSnipe.hero.setScale(1.5, 1.5); - RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); - RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x); - enemyBullets.push_back(RoundSnipe); - RoundSnipe.theta += 0.4 * PI; - enemyBullets.push_back(RoundSnipe); - RoundSnipe.theta -= 0.8 * PI; - enemyBullets.push_back(RoundSnipe); + FO MultiRoundSnipe; + MultiRoundSnipe.speed = speed; + MultiRoundSnipe.width = 16; + MultiRoundSnipe.height = 16; + MultiRoundSnipe.hero.setTexture(allBullets1); + MultiRoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, 48, 16, 16)); + MultiRoundSnipe.hero.setOrigin(8, 8); + MultiRoundSnipe.hero.setScale(1.5, 1.5); + MultiRoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + MultiRoundSnipe.theta = atan2(julgePoint.getPosition().y - MultiRoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - MultiRoundSnipe.hero.getPosition().x); + enemyBullets.push_back(MultiRoundSnipe); + MultiRoundSnipe.theta += 0.4 * PI; + enemyBullets.push_back(MultiRoundSnipe); + MultiRoundSnipe.theta -= 0.8 * PI; + enemyBullets.push_back(MultiRoundSnipe); } void Game::setGeneralMultiSnipe(list::iterator it, double speed, int type, int color, double angle) { enemyBulletSound.play(); - FO RoundSnipe; - RoundSnipe.speed = speed; - RoundSnipe.width = 16; - RoundSnipe.height = 16; - RoundSnipe.hero.setTexture(allBullets1); - RoundSnipe.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); - RoundSnipe.hero.setOrigin(8, 8); - RoundSnipe.hero.setScale(1.5, 1.5); - RoundSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); - RoundSnipe.theta = atan2(julgePoint.getPosition().y - RoundSnipe.hero.getPosition().y, julgePoint.getPosition().x - RoundSnipe.hero.getPosition().x) + (rand() % 5 * 0.01 - 0.02) * PI; - enemyBullets.push_back(RoundSnipe); - RoundSnipe.theta += angle * PI; - enemyBullets.push_back(RoundSnipe); - RoundSnipe.theta -= angle * 2 * PI; - enemyBullets.push_back(RoundSnipe); + FO GeneralMultiSnipe; + GeneralMultiSnipe.speed = speed; + GeneralMultiSnipe.width = 16; + GeneralMultiSnipe.height = 16; + GeneralMultiSnipe.hero.setTexture(allBullets1); + GeneralMultiSnipe.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); + GeneralMultiSnipe.hero.setOrigin(8, 8); + GeneralMultiSnipe.hero.setScale(1.5, 1.5); + GeneralMultiSnipe.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + GeneralMultiSnipe.theta = atan2(julgePoint.getPosition().y - GeneralMultiSnipe.hero.getPosition().y, julgePoint.getPosition().x - GeneralMultiSnipe.hero.getPosition().x) + (rand() % 5 * 0.01 - 0.02) * PI; + enemyBullets.push_back(GeneralMultiSnipe); + GeneralMultiSnipe.theta += angle * PI; + enemyBullets.push_back(GeneralMultiSnipe); + GeneralMultiSnipe.theta -= angle * 2 * PI; + enemyBullets.push_back(GeneralMultiSnipe); } void Game::setRandom(list::iterator it, double speed, int type, int color, double leftBoarder, double range) { enemyBulletSound.play(); - FO RoundRandom; - RoundRandom.speed = speed; - RoundRandom.theta = rand() % (int)range + leftBoarder; - RoundRandom.width = 16; - RoundRandom.height = 16; - RoundRandom.hero.setTexture(allBullets1); - RoundRandom.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); - RoundRandom.hero.setOrigin(8, 8); - RoundRandom.hero.setScale(1.5, 1.5); - RoundRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); - RoundRandom.hero.setRotation(RoundRandom.theta / PI * 180.0 + 90); - enemyBullets.push_back(RoundRandom); + FO Random; + Random.speed = speed; + Random.theta = rand() % (int)range + leftBoarder; + Random.width = 16; + Random.height = 16; + Random.hero.setTexture(allBullets1); + Random.hero.setTextureRect(sf::IntRect(color * 16, type * 16, 16, 16)); + Random.hero.setOrigin(8, 8); + Random.hero.setScale(1.5, 1.5); + Random.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + Random.hero.setRotation(Random.theta / PI * 180.0 + 90); + enemyBullets.push_back(Random); } void Game::setRoundRandom(list::iterator it, double speed, int color, double leftBoarder, double range) @@ -2379,26 +2521,26 @@ void Game::setSharpRandom(list::iterator it, double speed) void Game::setSharpLine(list::iterator it, double speed) { enemyBulletSound.play(); - FO SharpRandom; - SharpRandom.speed = speed; - SharpRandom.theta = 0.5 * PI; + FO SharpLine; + SharpLine.speed = speed; + SharpLine.theta = 0.5 * PI; if (it->theta > 0.5 * PI) { - SharpRandom.theta += it->speed * 0.04 * PI; + SharpLine.theta += it->speed * 0.04 * PI; } else { - SharpRandom.theta -= it->speed * 0.04 * PI; - } - SharpRandom.width = 16; - SharpRandom.height = 16; - SharpRandom.hero.setTexture(allBullets1); - SharpRandom.hero.setTextureRect(sf::IntRect(64, 64, 16, 16));//80 96 - SharpRandom.hero.setOrigin(8, 8); - SharpRandom.hero.setScale(1.5, 1.5); - SharpRandom.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); - SharpRandom.hero.setRotation(SharpRandom.theta / PI * 180.0 + 90); - enemyBullets.push_back(SharpRandom); + SharpLine.theta -= it->speed * 0.04 * PI; + } + SharpLine.width = 16; + SharpLine.height = 16; + SharpLine.hero.setTexture(allBullets1); + SharpLine.hero.setTextureRect(sf::IntRect(64, 64, 16, 16));//80 96 + SharpLine.hero.setOrigin(8, 8); + SharpLine.hero.setScale(1.5, 1.5); + SharpLine.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + SharpLine.hero.setRotation(SharpLine.theta / PI * 180.0 + 90); + enemyBullets.push_back(SharpLine); } void Game::setSharpFlower1(list::iterator it, double speed, int type, int color)//sound Reform @@ -2486,51 +2628,236 @@ void Game::nonSpellCard1(list::iterator it) nonSpell1.hero.setRotation(nonSpell1.theta / PI * 180.0 + 90); enemyBullets.push_back(nonSpell1); } + + theta1 += 0.04 * PI * sin(temp); + temp += PI / 120.0; +} + +void Game::nonSpellCard2(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } - /*SharpFlower1.hero.setTextureRect(sf::IntRect(176, 64, 16, 16)); - SharpFlower1.hero.setOrigin(8, 8); - SharpFlower1.hero.setScale(1.5, 1.5); - SharpFlower1.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); - if (temp >= 0 && temp <= PI) + FO nonSpell2; + nonSpell2.speed = 4.0; + nonSpell2.width = 16; + nonSpell2.height = 16; + nonSpell2.hero.setTexture(allBullets1); + nonSpell2.hero.setTextureRect(sf::IntRect(80, 128, 16, 16)); + nonSpell2.hero.setOrigin(8, 8); + nonSpell2.hero.setScale(1.5, 1.5); + nonSpell2.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (cts % 360 <= 120) + { + if (cts % 24 == 0) + { + enemyBulletSound.play(); + nonSpell2.hero.setPosition((rand() % 300) * 2 + 100, (rand() % 100) + 60); + for (int i = 0; i < 72; i++) + { + nonSpell2.theta = theta1 + PI * 2 * i / 72.0; + nonSpell2.hero.setRotation(nonSpell2.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell2); + } + } + } + theta1 += 0.04 * PI * sin(temp); + temp += PI / 240.0; +} + +void Game::nonSpellCard3(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + enemyBulletSound.play(); + FO nonSpell3; + nonSpell3.speed = 6.0; + nonSpell3.width = 16; + nonSpell3.height = 16; + nonSpell3.hero.setTexture(allBullets1); + nonSpell3.hero.setTextureRect(sf::IntRect(80, 128, 16, 16)); + nonSpell3.hero.setOrigin(8, 8); + nonSpell3.hero.setScale(1.5, 1.5); + nonSpell3.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (cts % 2 == 0) + { + for (int i = 0; i < 10; i++) + { + nonSpell3.theta = theta1 + PI * 2 * i / 10.0; + nonSpell3.hero.setRotation(nonSpell3.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell3); + } + } + theta1 += 0.04 * PI * sin(temp); + temp += PI / 240.0; +} +//waiting for redoing +void Game::nonSpellCard4(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + enemyBulletSound.play(); + FO nonSpell4; + nonSpell4.speed = 6.0; + nonSpell4.width = 16; + nonSpell4.height = 16; + nonSpell4.hero.setTexture(allBullets1); + nonSpell4.hero.setTextureRect(sf::IntRect(80, 128, 16, 16)); + nonSpell4.hero.setOrigin(8, 8); + nonSpell4.hero.setScale(1.5, 1.5); + if (cts % 2 == 0) { - SharpFlower1.speed /= 2.0; - SharpFlower1.speed += 9.0 / (temp + 1.5); for (int i = 0; i < 3; i++) { - SharpFlower1.theta = theta2 + PI * 2 * i / 3.0 + temp; - SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); - enemyBullets.push_back(SharpFlower1); - SharpFlower1.theta = theta2 + PI * 2 * i / 3.0 - temp; - SharpFlower1.hero.setRotation(SharpFlower1.theta / PI * 180.0 + 90); - enemyBullets.push_back(SharpFlower1); + nonSpell4.theta = theta1 + PI * 2 * i / 3.0; + nonSpell4.hero.setRotation(nonSpell4.theta / PI * 180.0 + 90); + nonSpell4.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + enemyBullets.push_back(nonSpell4); + if (cts % 7 == 0) + { + nonSpell4.hero.setTextureRect(sf::IntRect(160, 128, 16, 16)); + nonSpell4.hero.setPosition(it->hero.getPosition().x + 200, it->hero.getPosition().y + it->height + 100); + enemyBullets.push_back(nonSpell4); + nonSpell4.hero.setPosition(it->hero.getPosition().x - 200, it->hero.getPosition().y + it->height + 100); + enemyBullets.push_back(nonSpell4); + } } - }*/ + } + theta1 += 0.04 * PI * sin(temp); + temp += PI / 240.0; +} +void Game::nonSpellCard5(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + + FO nonSpell5; + nonSpell5.speed = 4.0; + nonSpell5.width = 16; + nonSpell5.height = 16; + nonSpell5.hero.setTexture(allBullets1); + nonSpell5.hero.setTextureRect(sf::IntRect(80, 128, 16, 16)); + nonSpell5.hero.setOrigin(8, 8); + nonSpell5.hero.setScale(1.5, 1.5); + nonSpell5.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (cts % 360 <= 240) + { + if (cts % 8 == 0) + { + enemyBulletSound.play(); + nonSpell5.hero.setPosition(it->hero.getPosition().x + 100*sin(cts/20.0), it->hero.getPosition().y + it->height); + for (int i = 0; i < 36; i++) + { + nonSpell5.theta = theta1 + PI * 2 * i / 36.0; + nonSpell5.hero.setRotation(nonSpell5.theta / PI * 180.0 + 90); + + enemyBullets.push_back(nonSpell5); + } + } + } theta1 += 0.04 * PI * sin(temp); - temp += PI / 120.0; - /*if (sin(temp) < EPS) + temp += PI / 240.0; +} + +void Game::nonSpellCard6(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = -PI / 6.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) { - theta2 = theta1 + PI / 6.0; - }*/ + temp = 0.0; + } + + FO nonSpell6; + nonSpell6.speed = 4.0; + nonSpell6.width = 16; + nonSpell6.height = 16; + nonSpell6.hero.setTexture(allBullets1); + nonSpell6.hero.setTextureRect(sf::IntRect(32, 16, 16, 16)); + nonSpell6.hero.setOrigin(8, 8); + nonSpell6.hero.setScale(1.5, 1.5); + nonSpell6.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (cts % 48 == 0) + { + enemyBulletSound.play(); + for (int i = 0; i < 48; i++) + { + nonSpell6.theta = theta1 + PI * 2 * i / 48.0; + nonSpell6.hero.setRotation(nonSpell6.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell6); + } + } + if (cts % 2 == 0) + { + for (int i = 0; i < 5; i++) + { + nonSpell6.hero.setTextureRect(sf::IntRect(128, 16, 16, 16)); + nonSpell6.theta = theta2 + PI * 2 * i / 5.0; + nonSpell6.hero.setRotation(nonSpell6.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell6); + } + for (int i = 0; i < 5; i++) + { + nonSpell6.hero.setTextureRect(sf::IntRect(208, 16, 16, 16)); + nonSpell6.theta = theta1 + PI * 2 * i / 5.0; + nonSpell6.hero.setRotation(nonSpell6.theta / PI * 180.0 + 90); + enemyBullets.push_back(nonSpell6); + } + } + theta1 += 0.02 * PI; + theta2 -= 0.02 * PI; + temp += PI / 240.0; } void Game::spellCard1(list::iterator it) { static double range = 0, x1 = rand() % 200 + 250; static int ct = 0, temp = 0; - + FO Card1; Card1.speed = 8.0; Card1.width = 16; Card1.height = 16; Card1.hero.setTexture(allBullets1); - Card1.hero.setTextureRect(sf::IntRect(16, 7*16, 16, 16)); + Card1.hero.setTextureRect(sf::IntRect(16, 7 * 16, 16, 16)); Card1.hero.setOrigin(8, 8); Card1.hero.setScale(1.5, 1.5); Card1.theta = 1.5 * PI; Card1.type = 101; if (temp % 10 == 0) - { + { enemyBulletSound.play(); Card1.hero.setPosition(it->hero.getPosition().x + range, it->hero.getPosition().y + it->height); enemyBullets.push_back(Card1); @@ -2542,7 +2869,7 @@ void Game::spellCard1(list::iterator it) enemyBullets.push_back(Card1); } - (ct % 2) ? range-=16 : range+=16; + (ct % 2) ? range -= 16 : range += 16; temp++; if (range >= 350 || range <= 0) { @@ -2550,6 +2877,233 @@ void Game::spellCard1(list::iterator it) } } +void Game::spellCard2(list::iterator it) +{ + double speed = 4; + int type = 4, color = 0; + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + enemyBulletSound.play(); + FO Card2; + Card2.speed = speed; + Card2.width = 16; + Card2.height = 16; + Card2.hero.setTexture(allBullets1); + Card2.hero.setTextureRect(sf::IntRect(0, 64, 16, 16)); + Card2.hero.setOrigin(8, 8); + Card2.hero.setScale(1.5, 1.5); + Card2.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + + for (int i = 0; i < 3; i++) + { + Card2.theta = theta1 + PI * 2 * i / 3.0; + Card2.hero.setRotation(Card2.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card2); + } + + Card2.hero.setTextureRect(sf::IntRect(176, 64, 16, 16)); + Card2.hero.setOrigin(8, 8); + Card2.hero.setScale(1.5, 1.5); + Card2.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (temp >= 0 && temp <= PI) + { + Card2.speed /= 2.0; + Card2.speed += 9.0 / (temp + 1.5); + for (int i = 0; i < 3; i++) + { + Card2.theta = theta2 + PI * 2 * i / 3.0 + temp; + Card2.hero.setRotation(Card2.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card2); + Card2.theta = theta2 + PI * 2 * i / 3.0 - temp; + Card2.hero.setRotation(Card2.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card2); + } + } + + theta1 += 0.02 * PI; + temp += PI / 24.0; + if (sin(temp) < EPS) + { + theta2 = theta1 + PI / 6.0; + } +} + +void Game::spellCard3(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + + FO Card3; + Card3.speed = 2.0; + Card3.width = 16; + Card3.height = 16; + Card3.hero.setTexture(allBullets1); + Card3.hero.setTextureRect(sf::IntRect(80, 16, 16, 16)); + Card3.hero.setOrigin(8, 8); + Card3.hero.setScale(1.5, 1.5); + Card3.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + Card3.type = 103; + Card3.phase = 3; + if (cts % 360 == 1) + { + enemyBulletSound.play(); + for (int i = 0; i < 6; i++) + { + Card3.theta = theta1 + PI * 2 * i / 6.0; + Card3.hero.setRotation(Card3.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card3); + } + } + theta1 += 0.04 * PI * sin(temp); + temp += PI / 240.0; +} + +void Game::spellCard4(list::iterator it) +{ + enemyBulletSound.play(); + FO Card4; + Card4.speed = 4.0; + Card4.theta = rand() % 360; + Card4.width = 16; + Card4.height = 16; + Card4.hero.setTexture(allBullets1); + Card4.hero.setTextureRect(sf::IntRect(rand()%15 * 16, 4 * 16, 16, 16)); + Card4.hero.setOrigin(8, 8); + Card4.hero.setScale(1.5, 1.5); + Card4.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + Card4.hero.setRotation(Card4.theta / PI * 180.0 + 90); + Card4.type = 104; + enemyBullets.push_back(Card4); + Card4.theta = rand() % 360; + enemyBullets.push_back(Card4); +} + +void Game::spellCard5(list::iterator it) +{ + static double theta1 = PI / 2.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + + FO Card5; + Card5.speed = 4.0; + Card5.width = 16; + Card5.height = 16; + Card5.hero.setTexture(allBullets1); + Card5.hero.setTextureRect(sf::IntRect(32, 16, 16, 16)); + Card5.hero.setOrigin(8, 8); + Card5.hero.setScale(1.5, 1.5); + Card5.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + if (cts % 72 == 0) + { + enemyBulletSound.play(); + for (int i = 0; i < 72; i++) + { + Card5.theta = theta1 + PI * 2 * i / 72.0; + Card5.hero.setRotation(Card5.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card5); + } + } + if (cts % 8 == 0) + { + Card5.speed = 7.0; + for (int i = 0; i < 8; i++) + { + Card5.hero.setTextureRect(sf::IntRect(128, 16, 16, 16)); + Card5.theta = theta2 + PI * 2 * i / 8.0; + Card5.hero.setRotation(Card5.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card5); + } + for (int i = 0; i < 8; i++) + { + Card5.hero.setTextureRect(sf::IntRect(208, 16, 16, 16)); + Card5.theta = theta1 + PI * 2 * i / 8.0; + Card5.hero.setRotation(Card5.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card5); + } + } + theta1 += 0.003 * PI; + theta2 -= 0.003 * PI; + temp += PI / 240.0; +} + +void Game::spellCard6(list::iterator it) +{ + static double theta1 = PI / 6.0; + static double theta2 = PI / 2.0; + static double temp = 0.0; + static int cts = 0, cc = 40; + cts++; + if (fabs(temp - 2 * PI) < EPS) + { + temp = 0.0; + } + + FO Card6; + Card6.speed = 4.0; + Card6.width = 32; + Card6.height = 32; + Card6.hero.setTexture(allBullets2); + Card6.hero.setTextureRect(sf::IntRect(64, 96, 32, 32)); + Card6.hero.setOrigin(16, 16); + Card6.hero.setScale(1.5, 1.5); + Card6.hero.setPosition(it->hero.getPosition().x, it->hero.getPosition().y + it->height); + + if (cts % 60 == 0) + { + enemyBulletSound.play(); + for (int i = 0; i < 36; i++)//(rand() % 500)+ 100 + { + Card6.theta = theta1 + PI * 2 * i / 36.0; + Card6.hero.setRotation(Card6.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card6); + } + } + if ((cts % (2*cc)) < cc) + { + if (cts % 19 == 0) + { + Card6.hero.setTextureRect(sf::IntRect(224, 96, 32, 32)); + Card6.speed = 8.0; + enemyBulletSound.play(); + Card6.hero.setPosition(it->hero.getPosition().x+100, it->hero.getPosition().y + it->height); + Card6.theta = atan2(julgePoint.getPosition().y - Card6.hero.getPosition().y, julgePoint.getPosition().x - Card6.hero.getPosition().x); + Card6.hero.setRotation(Card6.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card6); + Card6.hero.setPosition(it->hero.getPosition().x-100, it->hero.getPosition().y + it->height); + Card6.theta = atan2(julgePoint.getPosition().y - Card6.hero.getPosition().y, julgePoint.getPosition().x - Card6.hero.getPosition().x); + Card6.hero.setRotation(Card6.theta / PI * 180.0 + 90); + enemyBullets.push_back(Card6); + if (cc <= 300) + { + cc++; + } + } + } + + theta1 += 0.04 * PI * sin(temp); + temp += PI / 240.0; +} + void Game::processTaps() { sf::Event event; @@ -2629,6 +3183,7 @@ void Game::mainProcessing() //player.theta = 0.0; player.hero.move(float(player.speed), 0.0); } + /*if ((mIsMovingDown || mIsMovingLeft || mIsMovingRight || mIsMovingUp) && !isOutOfBoard(player.hero)) { player.velocity.x = player.speed * cos(player.theta); @@ -2636,7 +3191,6 @@ void Game::mainProcessing() player.hero.move(player.velocity); }*/ - if (mIsFire) { if (playerBulletSound.getStatus() != playerBulletSound.Playing) @@ -2687,6 +3241,12 @@ bool Game::checkPlayerCollision() return false; } +void Game::GameOver() +{ + //ϣ򵥴ֱGameOverϷ飨 + exit(0); +} + /*DWORD WINAPI BGMPlay(LPVOID lpParameter) { Game* game = (Game*)lpParameter; diff --git a/practices/cpp/level1/p11_Fighters/Game.h b/practices/cpp/level1/p11_Fighters/Game.h index 25958bf0..952a3ba7 100644 --- a/practices/cpp/level1/p11_Fighters/Game.h +++ b/practices/cpp/level1/p11_Fighters/Game.h @@ -38,6 +38,7 @@ class Game int S1E13(); + int S1E14(); void enemiesPushToDraw(list::iterator it); void backEsPushToDraw(list::iterator it); void frameDisplay(); @@ -74,7 +75,17 @@ class Game void setSharpFlower1(list::iterator it, double speed, int type, int color); void nonSpellCard1(list::iterator it); + void nonSpellCard2(list::iterator it); + void nonSpellCard3(list::iterator it); + void nonSpellCard4(list::iterator it); + void nonSpellCard5(list::iterator it); + void nonSpellCard6(list::iterator it); void spellCard1(list::iterator it); + void spellCard2(list::iterator it); + void spellCard3(list::iterator it); + void spellCard4(list::iterator it); + void spellCard5(list::iterator it); + void spellCard6(list::iterator it); void processTaps(); void playerInput(sf::Keyboard::Key key, bool isPressed); @@ -83,6 +94,7 @@ class Game void mainProcessing(); bool checkCollision(sf::Sprite obj1, sf::Sprite obj2); bool checkPlayerCollision(); + void GameOver(); /*friend DWORD WINAPI BGMPlay(LPVOID lpParameter);*/ ~Game(); @@ -92,7 +104,7 @@ class Game sf::RenderWindow mWindow; sf::Font font; sf::Text text, tempScore; - sf::Texture loading, nowLoading, stageSelect, front00, julgePointArray, Title1, allBullets1, allBullets2, whiteSpark; + sf::Texture loading, nowLoading, stageSelect, front00, julgePointArray, Title1, Title2, allBullets1, allBullets2, whiteSpark; sf::Texture bullets, buffetsEff, deathCircle, bg1, bgEff1, bg2, bgEff2, bg3, bgEff3, Enemy1, Enemy2, Enemy3, lifePieces, magicSquare; sf::Sprite loadingUI, loadingUISub, back[6], backEff[6], front01, front02, front03, front04; sf::Sprite julgePoint, playerAmmo, AmmoEff, deathEff, lifeBoard; From 736465c1d4e71bcb6e323615fe352df90aa14c32 Mon Sep 17 00:00:00 2001 From: Kyrios0 <1120626222@qq.com> Date: Fri, 23 Jun 2017 21:48:19 +0800 Subject: [PATCH 10/10] 0623 --- .../level1/p12_warehouse/lvl1_12_warehouse.c | 2 +- practices/cpp/level1/p01_Queue/queue.cpp | 9 ++-- practices/cpp/level1/p02_Stack/main.cpp | 32 ++++++++++++ practices/cpp/level1/p02_Stack/stack.cpp | 47 ++++++++++++++++++ practices/cpp/level1/p02_Stack/stack.h | 14 ++++++ practices/cpp/level1/p02_Stack/stack.h.gch | Bin 0 -> 1155332 bytes .../level1/p08_EmployeeAndSales/employee.cpp | 27 ++++++++++ .../level1/p08_EmployeeAndSales/employee.h | 15 ++++++ .../cpp/level1/p08_EmployeeAndSales/main.cpp | 26 ++++++++++ .../cpp/level1/p08_EmployeeAndSales/sales.cpp | 17 +++++++ .../cpp/level1/p08_EmployeeAndSales/sales.h | 11 ++++ practices/cpp/level1/p09_Tree/main.cpp | 12 +++++ practices/cpp/level1/p09_Tree/tree.cpp | 27 ++++++++++ practices/cpp/level1/p09_Tree/tree.h | 17 +++++++ 14 files changed, 250 insertions(+), 6 deletions(-) create mode 100644 practices/cpp/level1/p02_Stack/main.cpp create mode 100644 practices/cpp/level1/p02_Stack/stack.cpp create mode 100644 practices/cpp/level1/p02_Stack/stack.h create mode 100644 practices/cpp/level1/p02_Stack/stack.h.gch create mode 100644 practices/cpp/level1/p08_EmployeeAndSales/employee.cpp create mode 100644 practices/cpp/level1/p08_EmployeeAndSales/employee.h create mode 100644 practices/cpp/level1/p08_EmployeeAndSales/main.cpp create mode 100644 practices/cpp/level1/p08_EmployeeAndSales/sales.cpp create mode 100644 practices/cpp/level1/p08_EmployeeAndSales/sales.h create mode 100644 practices/cpp/level1/p09_Tree/main.cpp create mode 100644 practices/cpp/level1/p09_Tree/tree.cpp create mode 100644 practices/cpp/level1/p09_Tree/tree.h diff --git a/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c b/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c index 71955b4c..bcce70e3 100644 --- a/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c +++ b/practices/c/level1/p12_warehouse/lvl1_12_warehouse.c @@ -6,7 +6,7 @@ * state: list unfinished//strlen * ' ' * pop unfinished//number */ -#include "stdafx.h" +//#include "stdafx.h" #include #include #include diff --git a/practices/cpp/level1/p01_Queue/queue.cpp b/practices/cpp/level1/p01_Queue/queue.cpp index 69ec2652..fa755391 100644 --- a/practices/cpp/level1/p01_Queue/queue.cpp +++ b/practices/cpp/level1/p01_Queue/queue.cpp @@ -29,21 +29,20 @@ int Queue::append(int x) puts("Error: List is full, appending failed."); return -1; } - data[tail] = x; - tail++; + data[tail++] = x; tail = tail % 100; return 0; } int Queue::pop() { + int ans = data[head]; if(isEmpty()) { puts("Error: List is empty, poping failed."); return -1; } - data[head] = 0; - head++; + data[head++] = 0; head = head % 100; - return 0; + return ans; } diff --git a/practices/cpp/level1/p02_Stack/main.cpp b/practices/cpp/level1/p02_Stack/main.cpp new file mode 100644 index 00000000..72c743de --- /dev/null +++ b/practices/cpp/level1/p02_Stack/main.cpp @@ -0,0 +1,32 @@ +/* + * Author: Kyrios0 + * Date: 2016.04 + * To-Do List: + * ~~isEmpty~~ + * ~~isFull~~ + * ~~append~~ + * ~~pop~~ + * ~~Optimization~~ + * and more? + * State: Completed + */ +#include +#include "stack.h" + +int main(int argc, char** argv) +{ + Stack stack; + + if(stack.isEmpty()) + { + puts("Status: Empty"); + } + if(stack.isFull()) + { + puts("Status: Full"); + } + stack.append(1); + stack.pop(); + + return 0; +} diff --git a/practices/cpp/level1/p02_Stack/stack.cpp b/practices/cpp/level1/p02_Stack/stack.cpp new file mode 100644 index 00000000..e558e435 --- /dev/null +++ b/practices/cpp/level1/p02_Stack/stack.cpp @@ -0,0 +1,47 @@ +#include + +#include "stack.h" + + + +bool Stack::isEmpty() +{ + if(tail == head) + { + return true; + } + return false; +} + +bool Stack::isFull() +{ + if((tail == 100) + { + return true; + } + return false; +} + +int Stack::append(int x) +{ + if(isFull()) + { + puts("Error: List is full, appending failed."); + return -1; + } + data[tail++] = x; + return 0; +} + +int Stack::pop() +{ + if(isEmpty()) + { + puts("Error: List is empty, poping failed."); + return -1; + } + int ans = data[--tail]; + data[tail] = 0; + return ans; +} + diff --git a/practices/cpp/level1/p02_Stack/stack.h b/practices/cpp/level1/p02_Stack/stack.h new file mode 100644 index 00000000..cf567830 --- /dev/null +++ b/practices/cpp/level1/p02_Stack/stack.h @@ -0,0 +1,14 @@ + +class Stack +{ + private: + int head = 0; + int tail = 0; + int data[100]; + public: + bool isEmpty(); + bool isFull(); + int append(int x); + int pop(); +}; + diff --git a/practices/cpp/level1/p02_Stack/stack.h.gch b/practices/cpp/level1/p02_Stack/stack.h.gch new file mode 100644 index 0000000000000000000000000000000000000000..377d041be124c6bcef1353805850ef124f8cf972 GIT binary patch literal 1155332 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

khU!sxBi}H5fwAwKkb~KOAv}H-c)y&x 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%0DH+8q9qa)@h)2lvC(`TflO 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 X +Employee::Employee(char *employeeName, int employeeLevel) +{ + strncpy(name, employeeName); + level = employeeLevel; +} + +virtual int Employee::getSalary() +{ + return level*1000; +} + +char* Employee::getName() +{ + return name; +} + +int Employee::getLevel() + { + return level; + } + +void setLevel(int employeeLevel) + { + level = employeeLevel; + } diff --git a/practices/cpp/level1/p08_EmployeeAndSales/employee.h b/practices/cpp/level1/p08_EmployeeAndSales/employee.h new file mode 100644 index 00000000..6e0b789f --- /dev/null +++ b/practices/cpp/level1/p08_EmployeeAndSales/employee.h @@ -0,0 +1,15 @@ +class Employee +{ + public: + Employee(){ }; + Employee(char *employeeName, int employeeLevel); + virtual ~Employee(); + virtual int getSalary(); + char* getName(); + int getLevel(); + void setLevel(int employeeLevel); + protected: + private: + char* name = new char[32]; + int level = 0; +}; diff --git a/practices/cpp/level1/p08_EmployeeAndSales/main.cpp b/practices/cpp/level1/p08_EmployeeAndSales/main.cpp new file mode 100644 index 00000000..ecc7d2e5 --- /dev/null +++ b/practices/cpp/level1/p08_EmployeeAndSales/main.cpp @@ -0,0 +1,26 @@ + +#include +#include "employee.h" +#include "sales.h" + +using namespace std; + +/* run this program using the console pauser or add your own getch, system("pause") or input loop */ + +int main(int argc, char** argv) { + + Employee woman("Alice", 1); + char* name = woman.getName(); + int salary = woman.gatSalary(); + cout << name << endl; + cout << salary << endl; + + Sales sale("Bob", 2); + name = sale.getName(); + sale.setSaleCount(2000); + salary = sale.calcSalary(); + cout << name << endl; + cout << salary << endl; + return 0; +} + diff --git a/practices/cpp/level1/p08_EmployeeAndSales/sales.cpp b/practices/cpp/level1/p08_EmployeeAndSales/sales.cpp new file mode 100644 index 00000000..4db871f5 --- /dev/null +++ b/practices/cpp/level1/p08_EmployeeAndSales/sales.cpp @@ -0,0 +1,17 @@ +#include "sales.h" +#include +Sales::Sales(char* salesName, int salesLevel) +{ + strncpy(name, salesName); + level = employeeLevel; +} + +void Sales::setSaleCount(int Count) +{ + saleCount = Count; +} + +virtual int Sales::getSalary() +{ + return level*1000 + saleCount/5; +} diff --git a/practices/cpp/level1/p08_EmployeeAndSales/sales.h b/practices/cpp/level1/p08_EmployeeAndSales/sales.h new file mode 100644 index 00000000..85253e33 --- /dev/null +++ b/practices/cpp/level1/p08_EmployeeAndSales/sales.h @@ -0,0 +1,11 @@ +#include "employee.h" +class Sales : public Employee { + public: + Sales(char* salesName, int salesLevel); + virtual ~Sales(); + void setSaleCount(int Count); + virtual int getSalary(); + protected: + private: + int saleCount; +}; diff --git a/practices/cpp/level1/p09_Tree/main.cpp b/practices/cpp/level1/p09_Tree/main.cpp new file mode 100644 index 00000000..e4baeb32 --- /dev/null +++ b/practices/cpp/level1/p09_Tree/main.cpp @@ -0,0 +1,12 @@ +#include +#include "tree.h" +/* run this program using the console pauser or add your own getch, system("pause") or input loop */ + +int main(int argc, char** argv) { + Node* root = new Node(1); + Node* leftChild = new Node(2); + Node* rightChild = new Node(3); + root->append(leftChild); + root->append(rightChild); + return 0; +} diff --git a/practices/cpp/level1/p09_Tree/tree.cpp b/practices/cpp/level1/p09_Tree/tree.cpp new file mode 100644 index 00000000..0485280f --- /dev/null +++ b/practices/cpp/level1/p09_Tree/tree.cpp @@ -0,0 +1,27 @@ +#include "tree.h" +Node::Node(int value) +{ + data = value; +} + +void Node::append(Node *node) +{ + node->parent = this; + childrenNodes.push_back(node); + childCount ++; +} + +int Node::count() +{ + return count; +} + +Node* Node::getParent() +{ + return parent; +} + +int Node::getValue() +{ + return data; +} diff --git a/practices/cpp/level1/p09_Tree/tree.h b/practices/cpp/level1/p09_Tree/tree.h new file mode 100644 index 00000000..ec1ae14a --- /dev/null +++ b/practices/cpp/level1/p09_Tree/tree.h @@ -0,0 +1,17 @@ +#include + +class Node { + public: + Node(int value); + virtual ~Node(); + void append(Node *node); + int count(); + Node* getParent(); + int getValue(); + protected: + private: + int data; + int childCount = 0; + std::vector childrenNodes; + Node *parent; +};