본문으로 건너뛰기

23.05.09.

Today I learned

  • 컴공실

컴공실

tetris project Second week

함수 4개 구현하기.. segmantation fault가 떠서 어디서 에러가 떴는지 모르겠다.
맞게 한건지도 모르겠다.
내일 완성시켜야지...
ps. 왜 내꺼는 tab간격이 4칸이야?

void createRankList() {
// 목적: Input파일인 "rank.txt"에서 랭킹 정보를 읽어들임, 읽어들인 정보로 랭킹 목록 생성
// 1. "rank.txt"열기
// 2. 파일에서 랭킹정보 읽어오기
// 3. LinkedList로 저장
// 4. 파일 닫기
FILE* fp;
int i;
Node* curr = head;
//1. 파일 열기
fp = fopen("rnak.txt", "r");

// 2. 정보읽어오기
/* int fscanf(FILE* stream, const char* format, ...);
stream:데이터를 읽어올 스트림의 FILE 객체를 가리키는 파일포인터
format: 형식지정자 등등
변수의 주소: 포인터
return: 성공할 경우, fscanf 함수는 읽어들인 데이터의 수를 리턴, 실패하면 EOF리턴 */
// EOF(End Of File): 실제로 이 값은 -1을 나타냄, EOF가 나타날때까지 입력받아오는 if문
while (1) {
//빈파일이면 break
if (fscanf(fp, "%d", &score_number) != EOF) {
//score_number만큼 실행
for (i = 0; i < score_number; i++) {
Node* node = (Node*)malloc(sizeof(Node));
fscanf(fp, "%s%d", node->name, &(node->score));
node->next = NULL;
//empty check
if (head == NULL) {
head = node;
curr = head;
}
else {
curr->next = node;
curr = node;
}
}
}
else {
break;
}
}
// 4. 파일닫기
fclose(fp);
return;
}

void rank() {
//목적: rank 메뉴를 출력하고 점수 순으로 X부터~Y까지 출력함
//1. 문자열 초기화
int X = 1, Y = score_number, ch, i, j;
clear();

//2. printw()로 3개의 메뉴출력
printw("1. list ranks from X to Y\n ");
printw("2. list ranks by a specific name\n");
printw("3. delete a specific rank\n");

//3. wgetch()를 사용하여 변수 ch에 입력받은 메뉴번호 저장
ch = wgetch(stdscr);


//4. 각 메뉴에 따라 입력받을 값을 변수에 저장
//4-1. 메뉴1: X, Y를 입력받고 적절한 input인지 확인 후(X<=Y), X와 Y사이의 rank 출력
if (ch == '1') {
printw("X: ");
scanw("%d", &X);
printw("Y: ");
scanw("%d", &Y);
if (X > Y) {
printw("search failure: no rank in the list");
return;
}
count = 1;
Node* curr = head;
printw(" name | score\n");
printw("--------------------------------------\n");
for (i = count; i <= Y; i++) {
if (X <= i && i <= Y) {
printw(" %-18s| %-12d\n", curr->name, curr->score);
}
curr = curr->next;
if (curr == NULL) break;
}
}

//4-2. 메뉴2: 문자열을 받아 저장된 이름과 비교하고 이름에 해당하는 리스트를 출력
else if (ch == '2') {
char str[NAMELEN + 1];
int check = 0;


}

//4-3. 메뉴3: rank번호를 입력받아 리스트에서 삭제
else if (ch == '3') {
int num;

}
getch();

}

void writeRankFile() {
// 목적: 추가된 랭킹 정보가 있으면 새로운 정보를 "rank.txt"에 쓰고 없으면 종료
int sn, i;
Node* curr = head;
//1. "rank.txt" 연다
FILE* fp = fopen("rank.txt", "r");
fscanf(fp, "%d", &sn);
if (sn == score_number) return;
//2. 랭킹 정보들의 수를 "rank.txt"에 기록
fp = fopen("rank.txt", "w");
fprintf(fp, "%d\n", score_number);
//3. 탐색할 노드가 더 있는지 체크하고 있으면 다음 노드로 이동, 없으면 종료
while (curr) {
fprintf(fp, "%s %d\n", curr->name, curr->score);
curr = curr->next;
}
fclose(fp);
}

void newRank(int score) {
// 목적: GameOver시 호출되어 사용자 이름을 입력받고 score와 함께 리스트의 적절한 위치에 저장
char str[NAMELEN + 1];
int i, j;
Node* node = (Node*)malloc(sizeof(Node));
Node* curr = head;
clear();
//1. 사용자 이름을 입력받음
move(0, 0);
printw("your name: ");
getstr(str);
strcpy(node->name, str);
//2. 새로운 노드를 생성해 이름과 점수를 저장, score_number가
score_number++;
node->score = score;
node->next = NULL;
if (head==NULL) {
head = node;
}
else if(curr->score<score){
node->next = curr;
curr = node;
head = curr;
}
else {
while (curr->next != NULL) {
if (curr->next->score > score) {
curr = curr->next;
}
else {
break;
}
}
node->next = curr->next;
curr->next = node;
}
writeRankFile();
}