저번에올린 역사OX퀴즈의 소스이다.
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int x=0, px=40;
int y=0, py=3;
static int numbering=0;
static int score=0;
static int pn=0;
int answer=3;
int i,j;
char map[26][140]=
{
"2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
};
void MapDraw();
void Move();
void ProBlem();
void marking();
void gotoxy(int x, int y) //커서 생성 및 이동 함수 .
{
COORD pos = {x, y};
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
COORD getCursor(void)
{
COORD cur;
CONSOLE_SCREEN_BUFFER_INFO curInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&curInfo);
cur.X=curInfo.dwCursorPosition.X;
cur.Y=curInfo.dwCursorPosition.Y;
return cur;
}
void removeCursor(void) // 커서 깜빡임 제거
{
CONSOLE_CURSOR_INFO cur;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
cur.bVisible=0;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}
void main()
{
system("title 역사 OX퀴즈!!");
system("mode con cols=150 lines=40");
system("color f0");
removeCursor();//커서반짝임제거
MapDraw();//ox퀴즈맵형성
while(1){
if(pn==11){
break;
}
ProBlem();
Move();//커서이동
}
gotoxy(px,py);
printf("수고하셨습니다.");
gotoxy(px,py+1);
printf("총점수는 %d점입니다.", score);
gotoxy(px,py+2);
printf("");
}
void marking()
{
j=8;
if(pn==0&&answer==1){
system("color f0");
gotoxy(70,7);
printf("잠시후 게임이 시작됩니다.");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==0&&answer==0){
system("color f0");
gotoxy(70,7);
printf("잠시후 게임이 시작됩니다.");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==1&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==1&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==4&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==4&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==5&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==5&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==7&&answer==1){ //0,3,4,6,10
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==7&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==11&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==11&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==2&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==2&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==3&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==3&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==6&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==6&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==8&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==8&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==9&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==9&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
if(pn==10&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==10&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
}
void ProBlem()
{
gotoxy(px+15,py);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);
if(pn>=1)
printf("%d번 문제입니다.\n", numbering);
gotoxy(px,py+1);
if(pn==0){
printf("주의 사항 : 방향키는 한번만 누르시고 답을 신중하게 택하시오");
gotoxy(px+10,py+2);
printf("←키나 →키를 누르면 게임이 시작됩니다.");
}
if(pn==1){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0); //o
printf("남대문은 국보 제1호로 조선시대에 지어졋다");
}
if(pn==2){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0); //x
printf("법접스님은 해골물을 마시고 깨달음을 얻었다.");//원효대사
}
if(pn==3){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0); //x
printf("우리나라 최초의 국가는 부예이다.");//고조선
}
if(pn==4){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//o
printf("성덕대왕 신종은 에밀레종이라고도 불린다");
}
if(pn==5){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//o
printf("세종대왕님이 훈민정음을 공포한 해는 1446년이다");
}
if(pn==6){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//x
printf("해시계인 양부일구, 현주일구, 천병일구, 정남일구를 만든사람은 장영실이 아니다.");//장영실
}
if(pn==7){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//o
printf("동의보감의 저자는 허준이다.");
}
if(pn==8){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//x
printf("남쪽과 북쪽의 영토를 크게 넓혀 우리나라 역사상 가장 넓은 대제국을 세운 광개토대왕의 아버지는");//고국양왕
gotoxy(px,py+2);
printf("장수왕이다.");//고국양왕
}
if(pn==9){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//x
printf("한국 최초의 남녀공학의 '점진학교'를 설립한 위인은 김구이다."); //안창호
}
if(pn==10){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//x
printf("흥인지문은 서대문이다");
}
if(pn==11){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);//o
printf("최초의 아동문화운동단체인 색동회를 조직하였으며");
gotoxy(px,py+2);
printf("선린상업학교를 다녔던 인물은 소파 방정환선생이다.");
}
}
void MapDraw()
{
int i,j;
for(i=0;i<14;i++){
for(j=0;j<139;j++){
gotoxy(6+j,0+i);
if(i==0&&j<137)
printf("*");
if(j==0||j==137)
printf("**");
}
}
for(i=0;i<26;i++){
for(j=0;j<139;j++){
gotoxy(6+j,14+i);
if(map[i][j]=='0')
printf("\n");
else
printf("*");
}
}
gotoxy(70, 25);
printf("◀ O \tX ▶");
gotoxy(73, 27);
printf("Score : %d", score);
}
void Move() //이동 하는 함수
{
char a;
a=getch();
if(a==75) //← : o
{
for(i=0;i<24;i++){
gotoxy(89,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf9);
printf(" ");
}
for(i=0;i<24;i++){
gotoxy(8,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
Sleep(3000);
answer=1;//1==o;
}
else if(a==77) //→ : x
{
for(i=0;i<24;i++){
gotoxy(8,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf9);
printf(" ");
}
for(i=0;i<24;i++){
gotoxy(89,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
Sleep(3000);
answer=0;//0==x;
}
marking();
}
소스를 분석 및 응용과 보완점을 생각해보자
맵 지도를 2와 0으로구성하여 2에는*을 0에는 공백을입힌것이다\
위처럼 *과 공백으로 이루어진 map의 위치를 배열에 입력시킨다.
char map[26][140]=
{
"2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2200000000000000000000000000000000000000000000000000000000220000000000000000000002200000000000000000000000000000000000000000000000000000022",
"2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222"
};
맵 지도를 2와 0으로구성하여 2에는*을 0에는 공백을입힌것이다\
위처럼 *과 공백으로 이루어진 map의 위치를 배열에 입력시킨다.
그리고
void MapDraw()
{
int i,j;
{
int i,j;
for(i=0;i<14;i++){
for(j=0;j<139;j++){
gotoxy(6+j,0+i);
if(i==0&&j<137)
printf("*");
for(j=0;j<139;j++){
gotoxy(6+j,0+i);
if(i==0&&j<137)
printf("*");
if(j==0||j==137)
printf("**");
}
}
printf("**");
}
}
for(i=0;i<26;i++){
for(j=0;j<139;j++){
gotoxy(6+j,14+i);
for(j=0;j<139;j++){
gotoxy(6+j,14+i);
if(map[i][j]=='0')
printf("\n");
else
printf("*");
printf("\n");
else
printf("*");
}
}
MapDraw함수를 이용해
0과 2로된 배열을 0은 " " 으로 2는 "*"로 바꿔서 출력한다
printf("◀ O \tX ▶");
gotoxy(73, 27);
printf("Score : %d", score);
}
그리고 아래부분에 내용 출력이다.
gotoxy는 바로 아래에 설명이되어있다.
수정할 부분 1
이프문이 쓰이기도하엿는데 몇몇구간에는
벽을 두껍게한다는지 어디는 별을생성안한다는지 이런부분인데
그냥 간단하게
배열안에 2와0값을 원하는대로 잘그려두기만하면
그냥 위와같이 불필요한 if문이 필요없이
맵을 그릴수가 있다.
void gotoxy(int x, int y) //커서 생성 및 이동 함수 .
{
COORD pos = {x, y};
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
{
COORD pos = {x, y};
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
COORD getCursor(void)
{
COORD cur;
CONSOLE_SCREEN_BUFFER_INFO curInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&curInfo);
cur.X=curInfo.dwCursorPosition.X;
cur.Y=curInfo.dwCursorPosition.Y;
return cur;
}
{
COORD cur;
CONSOLE_SCREEN_BUFFER_INFO curInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&curInfo);
cur.X=curInfo.dwCursorPosition.X;
cur.Y=curInfo.dwCursorPosition.Y;
return cur;
}
주석그대로 커서 생성 및 이동 함수이다.
출력을 할때 커서위치에서부터 출력을 시작하게된다.
아래 사진으로 gotoxy가 이곳에서 어떻게 쓰이는지
알수있다.
이와같이 gotoxy를 쓰기위해선 windows.h 가필요하고
gotoxy함수 안의내용은 입력해준 x값과 y값을 사용하여
커서의 x값과 y값을 바꿔준다.
위와같이 gotoxy를 사용 한 후
출력을하면
위치가 바뀐다.
이번엔 removeCursor함수이다.
{
CONSOLE_CURSOR_INFO cur;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
cur.bVisible=0;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}
이 함수는 주석그대로이다
커서 깜빡임을 제거하는것이다.
main을 분석해보자.
void main()
{
{
system("title 역사 OX퀴즈!!");
system("mode con cols=150 lines=40");
system("color f0");
removeCursor();//커서반짝임제거
MapDraw();//ox퀴즈맵형성
while(1){
if(pn==11){
break;
}
ProBlem();
Move();//커서이동
}
gotoxy(px,py);
printf("수고하셨습니다.");
gotoxy(px,py+1);
printf("총점수는 %d점입니다.", score);
gotoxy(px,py+2);
printf("");
}
설명안한부분들을 살펴보겠다.
system("title 역사 OX퀴즈!!");
system("mode con cols=150 lines=40");
system("color f0");
먼저 이 부분을 살펴보자
system("title ");
이것은 콘솔의 타이틀 이름을 변경해주는 것이다.
system("color f0");
배경색을 바꿔주는 명령문이다.
while(1){
if(pn==11){
break;
}
ProBlem();
Move();//커서이동
}
이 반복문은 문제를 출력하는 반복문이다.
ox퀴즈면
맵을 그린후 ox퀴즈문제를내고
답을채점하고 다음문제로넘어가고
쭉 반복하다가
문제가 모두 제출되었으면
종료
이런식으로 갈것이다.
그러므로
반복문을돌려
ProBlem();<<문제 제출함수이다.
Move();는 주석에는 커서이동함수라되잇으나
그냥
오른쪽방향키를누르냐
왼쪽방향키를 누르냐
o를 선택할것인가
x를 선택할것인가
이것이다.
원래 처음엔 *하나를 가운데에 놓고
방향키로 *을 이동하여 O또는 X칸에
들어가는걸 만들엇으나 오히려 조작이 불편한 감이 있어서
오른쪽 왼쪽만 사용하게 만든 것이다.
그리고 if문에서
pn은 Problem Number로 문제번호이다. 문제번호가 11까지가면
반복문이종료된다.
(문제 개수에따라 바뀐다.)
먼저 이 부분을 살펴보자
system("title ");
이것은 콘솔의 타이틀 이름을 변경해주는 것이다.
위와같이 왼쪽에서 오른쪽 처럼 변경이 된다.
system("mode con cols=150 lines=40");
이 명령문은
콘솔창의 크기를 지정해주는 것이다.
system("color f0");
배경색을 바꿔주는 명령문이다.
while(1){
if(pn==11){
break;
}
ProBlem();
Move();//커서이동
}
이 반복문은 문제를 출력하는 반복문이다.
ox퀴즈면
맵을 그린후 ox퀴즈문제를내고
답을채점하고 다음문제로넘어가고
쭉 반복하다가
문제가 모두 제출되었으면
종료
이런식으로 갈것이다.
그러므로
반복문을돌려
ProBlem();<<문제 제출함수이다.
Move();는 주석에는 커서이동함수라되잇으나
그냥
오른쪽방향키를누르냐
왼쪽방향키를 누르냐
o를 선택할것인가
x를 선택할것인가
이것이다.
원래 처음엔 *하나를 가운데에 놓고
방향키로 *을 이동하여 O또는 X칸에
들어가는걸 만들엇으나 오히려 조작이 불편한 감이 있어서
오른쪽 왼쪽만 사용하게 만든 것이다.
그리고 if문에서
pn은 Problem Number로 문제번호이다. 문제번호가 11까지가면
반복문이종료된다.
(문제 개수에따라 바뀐다.)
gotoxy(px,py);
printf("수고하셨습니다.");
gotoxy(px,py+1);
printf("총점수는 %d점입니다.", score);
gotoxy(px,py+2);
printf("");
}
모든 문제를 풀었으면
gotoxy(px,py);를 이용하여
위쪽 중앙
빨간 부분에다가 수고하셧습니다를 출력한다
그리고 바로 그 아래줄에
총점수를 출력하고 끝낸다.
이렇게 main 부분은 끝낫다.
marking 함수를 보겠다.
이부분과 problem 부분이
보완할점이 제일 많은부분이다.
그러나 정말 귀찮아서 그냥 대충했기때문에
소스가 길고 지저분하여 제일위에꺼로 설명한다.
void marking()
{
j=8;
{
j=8;
if(pn==1&&answer==1){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==1&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
gotoxy(70,10);
printf("맞앗습니다.\n");
score++;
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
else if(pn==1&&answer==0){
system("color f0");
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
gotoxy(70,10);
printf("틀렸잖습니까 ㅡ.ㅡ\n");
pn++;
numbering++;
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
answer=3;
}
pn은 문제번호다.
pn이 0일땐
시작하기전 문구를 띄우고
1~11까지 1번부터 문제를 출력하는것이다.
pn이 1일때를 기준으로 분석해보자
j=8이라고 지정해둔이유는
오른쪽이나 왼쪽내모에 색을입히려고한다.
j=8이면
요기라고 표시되어잇는 부분의 내모의 x축이 7일때가 *이고 8일떄는 공백이다
그럼 그 공백에서부터 배경색을입히는것이다.
그래서 x축은 8일때로유지하고
for(i=1;i<14;i++){
gotoxy(j,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
이용하여
공백의 개수를 조절하여 공백을 넣은후 그 공백의 배경색을 조정한 명령어이다.
SetConsoleTextAttribute 텍스트의 배경색을 조정하는 명령어고
포문을 돌린이유는 y축 기준으로 14칸이기 때문이다.
그래서 답이 정답일때는 초록
틀릴때는 빨강을 출력하고
맞으면 스코어를 올린다.
Sleep(3000);
system("cls");
system("color f0");
MapDraw();
슬립함수로 약3초동안 대기후
화면을지우고 배경색을 모두 흰색으로바꾼후
다시지도를 그린다.
이렇게 마지막 pn까지 반복한다.
수정할 부분 2
정말 보완할 부분이많다.
일단 문제를 랜덤 순서로 출력을시키고
답채점방식을 이따구로하는게아닌
배열을 이용해서 답을 입력해놓고
각각 문제의 답과 비교하여
맞으면 초록
틀리면 빨강
이 출력되도록
소스를 단축시킬 수 있다.
정말 귀찮아서 걍 복사붙여넣기를 하고
조금씩 값만 바꿧다.
정말 형편없는 부분이다.
void ProBlem()
{
{
gotoxy(px+15,py);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);
if(pn>=1)
printf("%d번 문제입니다.\n", numbering);
gotoxy(px,py+1);
if(pn==0){
printf("주의 사항 : 방향키는 한번만 누르시고 답을 신중하게 택하시오");
gotoxy(px+10,py+2);
printf("←키나 →키를 누르면 게임이 시작됩니다.");
}
다음은 문제제출 함수이다.
이것도 단순 복사햇기때문에 윗부분만 가져왓다.
if(pn>=1)
printf("%d번 문제입니다.\n", numbering);
일단 gotoxy로 몇번문제를 알려주는 부분을출력한다.
gotoxy(px,py+1);
if(pn==0){
printf("주의 사항 : 방향키는 한번만 누르시고 답을 신중하게 택하시오");
gotoxy(px+10,py+2);
printf("←키나 →키를 누르면 게임이 시작됩니다.");
}
그리고 pn에 따라 몇번문제입니다<<이부분의 아랫줄에
문제를 출력한다.
마지막 부분인 move함수다.
char a;
if(a==75) //← : o
{
for(i=0;i<24;i++){
gotoxy(89,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf9);
printf(" ");
}
move 함수는 그냥 오른쪽 왼쪽키의 입력에따른
명령문이다.
왼쪽키를누르면 앤서값을 1로바꾸어 답을 O로체크햇음을두고
왼쪽란에 초록색을입힌다. 그리고 3초후 marking함수로 채점을한다.
오른쪽은 x로 앤서값을넣고
오른쪽란에 빨간색을입히고 마킹하는것이다.
이렇게 소스분석이 끝낫다.
-------------------------------
급하게 시간을 두고 짠소스를
다시분석해보고 잘살펴보니
고칠점도 너무많이나오고 미숙한부분이너무많다.
다음엔 이 소스를 더보완해서
원래소스와 보완한소스를
비교해서 어떻게 짜는것이 더 좋은지를 살펴보자
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf0);
if(pn>=1)
printf("%d번 문제입니다.\n", numbering);
gotoxy(px,py+1);
if(pn==0){
printf("주의 사항 : 방향키는 한번만 누르시고 답을 신중하게 택하시오");
gotoxy(px+10,py+2);
printf("←키나 →키를 누르면 게임이 시작됩니다.");
}
다음은 문제제출 함수이다.
이것도 단순 복사햇기때문에 윗부분만 가져왓다.
if(pn>=1)
printf("%d번 문제입니다.\n", numbering);
일단 gotoxy로 몇번문제를 알려주는 부분을출력한다.
위 그림의 몇번문제입니다 이부분이다.
if(pn==0){
printf("주의 사항 : 방향키는 한번만 누르시고 답을 신중하게 택하시오");
gotoxy(px+10,py+2);
printf("←키나 →키를 누르면 게임이 시작됩니다.");
}
그리고 pn에 따라 몇번문제입니다<<이부분의 아랫줄에
문제를 출력한다.
마지막 부분인 move함수다.
void Move() //이동 하는 함수
{
char a;
a=getch();
if(a==75) //← : o
{
for(i=0;i<24;i++){
gotoxy(89,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf9);
printf(" ");
}
for(i=0;i<24;i++){
gotoxy(8,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
Sleep(3000);
answer=1;//1==o;
}
gotoxy(8,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xa9);
printf(" ");
}
Sleep(3000);
answer=1;//1==o;
}
else if(a==77) //→ : x
{
{
for(i=0;i<24;i++){
gotoxy(8,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf9);
printf(" ");
}
gotoxy(8,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xf9);
printf(" ");
}
for(i=0;i<24;i++){
gotoxy(89,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
Sleep(3000);
answer=0;//0==x;
gotoxy(89,15+i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0xc9);
printf(" ");
}
Sleep(3000);
answer=0;//0==x;
}
marking();
}
marking();
}
move 함수는 그냥 오른쪽 왼쪽키의 입력에따른
명령문이다.
왼쪽키를누르면 앤서값을 1로바꾸어 답을 O로체크햇음을두고
왼쪽란에 초록색을입힌다. 그리고 3초후 marking함수로 채점을한다.
오른쪽은 x로 앤서값을넣고
오른쪽란에 빨간색을입히고 마킹하는것이다.
이렇게 소스분석이 끝낫다.
위 영상은
실행 동영상이다.-------------------------------
급하게 시간을 두고 짠소스를
다시분석해보고 잘살펴보니
고칠점도 너무많이나오고 미숙한부분이너무많다.
다음엔 이 소스를 더보완해서
원래소스와 보완한소스를
비교해서 어떻게 짜는것이 더 좋은지를 살펴보자
댓글 없음:
댓글 쓰기