programming/c , c++

    [테트리스개발] 프로그램 실행중 콘솔화면 멈춤현상 발생

    *이슈 원인 파악중 이제 다 완성했다고 생각했는데.. 아래의 영상과 같이 잘움직이다가 중간에 멈춰버렸다. 어디에서 꼬인건지 생각해봐야겠다. 생각하다 도저히안되면 그때 고수들에게 도움을 청하자 *원인은 찾음 오른쪽방향키를 누르지 않으니까 멈추지않고 while(1)문이 계속 실행되었다. moveRight()함수가 문제인거같다 좌우로 움직일때 고정된 블럭들도 뚫고 들어가서 그거에대해 수정 하였는데 뭔가 잘못됬나보다 해결하고 다시 이어씀

    [테트리스개발] 방향키클릭시 이동 느림 이슈 관련

    해결 while (test < 10) { int i; for (i = 0; i < 5; i++) { if (_kbhit()) { key = _getch(); if (key == -32) { key = _getch(); switch (key) { case LEFT: moveLeft(t); drawBoard(); //지금은 전체 다시 다그려주는건데 나중에 바꾸자 break; /*case RIGHT: moveRight(); drawBoard(); break; case UP: rotBlock(); drawBoard(); break; case DOWN: break;*/ } } } } test++; dropBlock(t); drawBoard(); Sleep(1000); } } moveLeft함수후 바로 drawBl..

    [테트리스개발]에러:위치를 읽는 동안 액세스 위반이 발생했습니다.

    위 내용은 tetris.h 의 함수들을 정의해 놓은 tetris.c 파일 내부에서 액변세스 위반이 발생하였다 액세스위반이 발생한 이유는 t.curblock이 초기화되지않아서이다. 나는 dropBlock()함수 위의 createBlock()함수에서 t.curblock을 초기화 시켜줬기 때문에 그리고 구조체 t의 선언을 전역범위에서 해줬기때문에 매개변수로 t를 받으면 현제 만들어진 구조체 t에 접근해서 값을 가져오고 저장하고 하는건줄알았는데 아니었다. 전역변수를 매개변수로 받아도 내가 선언해놓은 구조체에는 접근이안된다. 무조건 Tetris * t의 포인터로써 매개변수를 받아야된다 void dropBlock(Teris * t){} 이런식으로 포인터로 받아주니까 해결되었다.

    [테트리스개발] 콘솔창의 종료문구가 게임보드 중간에 낀 현상

    위 그림처럼 setCursor()함수를 써주고 사각형을 출력하면 종류문구가 그림을 통과하면서 그림이 깨진다 "저렇게 되는 이유는 마지막 커서가 끝나는 부분에서 저 종료문구가 나오기때문이다" 해결방법은 두가지이고 첫번째는 main함수가 끝나는 부분에 커서를 더 아래로 옮기거나 두번째는 main함수 마지막에 getchar();함수를 넣는것이다. getchar() 함수는 엔터(\n)가 들어올때까지 입력을 입력버퍼에 담아두었다가 엔터가 들어오는 순간 입력을 멈추고 버퍼에 입력된 값들중 제일 첫글자를 리턴해준다 비슷한 함수들이 있는데 getchar(), getche ,getch 이렇게 3가지 일단 getchar()함수와 getch, getche의 차이점은 위에서 설명 했듯이 getchar()는 입력버퍼에 값을 넣..

    [테트리스개발]c언어 난수생성

    무작위로 블록이 나와야하기때문에 난수가 필요하다. 블록모양이 총 7개니까 배열을 만들어서 모양을 저장해놓구 그중에 하나를 무작위로 선택되어야 한다 그러므로 0~6까지의 7가지 숫자가 나오면되고 rand()함수를 사용해서 만들어줍니다 rand()함수를 사용하면 0~32767범위의 숫자를 반환해준다 int random; random = rand(); 이런식으로 사용하면되고, 나머지 연산을 활용해서 내가필요한 숫자만 나오게해준다 random = rand()%7 이렇게 쓰면 rand()에서 반환된 숫자를 7로나눈 나머지이다. 그러므로 0~6까지의 숫자를 얻을수있다. 이렇게하면 프로그램 실행시 마다 매번 똑같이 반복되는 수를 얻게되므로 난수라고 할수없다 그 이유는 rand()함수의 시드값이 일정하기 때문에다 ra..

    [테트리스개발]BOOL WINAPI 반환타입

    테트리스를 개발하다가 콘솔창에서 커서위치를 지정해주기 위해를 포함시켜야되서 저런 복잡한 헤더파일들은 어떻게 되어있나 궁금해서 파일을 열어보았다. 찾아찾아가면 라는 파일에 아래와 같이 선언되어있는데 보면 SetConsoleCursorPosition() 함수앞에 기본 반환타입(int, char double 등등)말고 처음보는 것 들이 많이있다 데이터타입말고도 여러개를 쓸수있다는것도 신기했고 저 과로안에 있는 매개변수들도 데이터 타입앞에 _in_ 이런것들도있고 이게 뭐지 구글링을 통해 알아보니 일단 WINBASEAPI는 에 #define WINBASEAPI DECLSPEC_IMPORT 이런식으로 치환되고 DECLSPEC_IMPORT이거는 또 에서 #define DECLSPEC_IMPORT __declspec(..

    [테트리스개발] 테두리 그리기

    [테트리스개발] 에서는 테트리스 개발하면서 배워간것들을 기록하는 테그입니다 ※유의 사항 콘솔창에 테두리를 그리기위해서 사용한 '┌', '─', '┐' 이러한 문자들의 칸수가 원하는 갯수가 안나온다 처음 ┌ 에 "─" 이것을 넣을 때는 추가되지만 마지막"┐"을 넣으면 겹쳐진다. 예를들어 마우스 커서로 선택했을때 5칸의 가로선을 하고싶다면 ┌ =1개, ─ =4개 , ┐=1개 이런식으로 6개의 문자가 필요하다. #include #include void setCursor(int x, int y) { COORD pos = { x,y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } int main(void) { int x= 0; int y ..

    (c언어) 변수에 대하여 알아야할것

    1.지역변수2.전역변수3.정적변수4.외부변수5.레지스트 변수 1.지역변수는 중괄호(함수등) 내에서 선언된 변수들int number(){  int a = 3;  return a;}   int main(viod){  int a =1;  int b = number();  return 0;} -이런식으로 코드가 있을때 변수 a는 서로 다른 함수에 선언되었기 때문에 변수 명이 같아도 영향을 미치지 않는다.-지역변수는 초기화( 값을 넣어주는것)을 하지않으면 쓰레기값이 들어가게된다-중괄호내에서 생성된 지역변수의 메모리는 중괄호를 나오면서 소멸된다. 2.전역변수는 중괄호 바깥에서 선언된 변수(함수 바깥에 있는것)int a;    //전역변수 선언, 초기화하지않아도 쓰레기 값이 들어가지않고 알아서 0이 들어간다. int..