C 언어 코드 체인 테이블 탐식 뱀 게임 실현
탐식 사 디자인 사고:
화면 좌표:
확장 기능:
1.F1,F2 가속 감속 제어 스페이스 바 일시 정지 게임 Esc 탈퇴
2.모든 음식 을 가속 화하 여 더 높 은 점 수 를 얻는다.
먼저 게임 인터페이스 를 출력 하고 뱀 을 초기 화 합 니 다.뱀의 노드 는 문자열★로 표시 합 니 다.게임 배경 은■로 표시 합 니 다.이 문자열 들 은 두 바이트 의 폭 을 차지 하기 때문에 매번 x,y 좌표 의 대응 관 계 는 x=y*2 입 니 다.해당 위치 에서 뱀 을 출력 하고 뱀 을 다섯 개의 노드 로 초기 화 합 니 다.
뱀 머리의 이동 방향 을 오른쪽으로 초기 화하 고 버튼 에 따라 뱀의 이동 상 태 를 확인 한 후 음식 을 먹 으 면 뱀 머리 로 만들어 무 작위 로 음식 을 생 성 한다.
중점 모듈:
뱀 이동 의 실현:
구조 체 를 정의 하고 그 안에 노드 좌표 와 next 지침 을 넣 습 니 다.
뱀 이 이동 할 때마다 사용자 버튼 방향 을 통 해 다음 뱀 머리 노드 의 x,y 좌 표를 확인 하고 새로운 노드 를 다음 좌표 에 부여 한다.이 좌표 에서 뱀의 아이콘 을 치고 꼬리 노드 를 찾 아 꼬리 노드 를 배경 아이콘 으로 인쇄 한 다음 에 노드 를 방출 한다.그러면 뱀 이 한 번 움 직 이 고 이 를 반복 하면 뱀 이 동태 적 으로 이동 할 수 있다.
음식의 실현:
하나의 음식 노드 를 정의 하 는 것 도 뱀 과 유사 한 구조 체 지침 으로 무 작위 수 를 통 해 좌 표를 생 성하 고 벽 과 뱀 에 게 있 으 면 안 된다.
사용자 버튼 의 검 측:wasd 문 자 를 사용 하여 방향 을 정할 수 있 습 니 다.그러나 여기 서 우 리 는 빈 칸,ESC 키,상하 좌우 키 를 사용 해 야 하기 때문에 직접적 으로 GetAsyncKeyState()함 수 를 통 해 사용자 가 입력 한 버튼 을 검 측 할 수 있 습 니 다.헤더 파일 conio.h 를 참조 해 야 합 니 다.getch()함 수 는 현재 버튼 입력 이 있 는 지 확인 하 는 데 사용 되 며,있 으 면 0 이 아 닌 수 를 되 돌려 줍 니 다.
뱀의 변속:아니면 GetAsyncKeyState()함 수 를 통 해 F1,F2,키 를 검 측 하여 뱀 이 Sleep()함수 중의 밀리초 수 를 한 번 이동 하 는 지 확인 하면 뱀의 가속 감속 을 실현 할 수 있 습 니 다.또한 뱀 은 한 번 이동 할 때마다 system("cls")을 사용 하지 않 아 도 되 며,순환 중 snakemove()를 통 해 한 번,Sleep()함수 가 한 번 실행 되면 동적 이동 이 가능 합 니 다.
구현 효과:
전체 코드:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h> //
#define U 1
#define D 2
#define L 3
#define R 4 // ,U: ;D: ;L: R:
/******* *******/
typedef struct snake //
{
int x;
int y;
struct snake *next;
}snake;
int score=0,add=10; //
int status,sleeptime=200; // ,
snake *head, *food; // ,
snake *q; //
int endgamestatus=0; // ,1: ;2: ;3: 。
HANDLE hOut; //
/******* *******/
void gotoxy(int x,int y); //
int color(int c); //
void welcometogame(); //
void createMap(); //
void scoreandtips(); //
void initsnake(); // ,
void createfood(); //
int biteself(); //
void cantcrosswall(); //
void speedup(); //
void speeddown(); //
void snakemove(); //
void keyboardControl(); //
void Lostdraw(); //
void endgame(); //
void choose(); //
void explation(); //
/**
*
*/
void gotoxy(int x,int y)
{
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
/**
*
*/
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //
return 0;
}
//
void welcometogame()
{
int n;
gotoxy(43,10);
color(11);
printf(" ");
color(12);
gotoxy(25, 22);
printf("1. ");
gotoxy(45, 22);
printf("2. ");
gotoxy(65, 22);
printf("3. ");
gotoxy(40,27);
color(3);
printf(" 1 2 3:");
color(14);
scanf("%d", &n); //
switch (n)
{
case 1:
system("cls");
createMap(); //
initsnake(); //
createfood(); //
keyboardControl(); //
break;
case 2:
explation(); //
break;
case 3:
exit(0); //
break;
default:
color(12);
gotoxy(40,28);
printf(" 1―3 !");
_getch(); //
system("cls"); //
welcometogame();
}
}
//
void createMap()
{
int i,j;
for(i=0;i<58;i+=2) //
{
gotoxy(i,0);
color(5);
printf("□");
gotoxy(i,26);
printf("□");
}
for(i=1;i<26;i++) //
{
gotoxy(0,i);
printf("□");
gotoxy(56,i);
printf("□");
}
for(i = 2;i<56;i+=2) //
{
for(j = 1;j<26;j++)
{
gotoxy(i,j);
color(3);
printf("■");
}
}
}
//
void scoreandtips()
{
gotoxy(64,8);
color(14);
printf(" :%d ",score);
gotoxy(64,14);
printf(" :%d ",add);
gotoxy(64,16);
printf(" , ");
gotoxy(64,18);
printf(" ↑ ↓ ← → ");
gotoxy(64,20);
printf("F1 ,F2 ");
gotoxy(64,22);
printf("space: ");
gotoxy(64,24);
printf("ESC : ");
}
// ,
void initsnake()
{
snake *tail;
int i;
tail=(snake*)malloc(sizeof(snake));// , , x,y
tail->x=24; // (24,5)
tail->y=5;
tail->next=NULL;
for(i=1;i<=4;i++) // , 5
{
head=(snake*)malloc(sizeof(snake)); //
head->next=tail; //
head->x=24+2*i; //
head->y=5;
tail=head; // ,
}
while(tail!=NULL) // ,
{
gotoxy(tail->x,tail->y);
color(14);
printf("★"); // , ★
tail=tail->next; // , ,
}
}
/**
*
*/
void createfood()
{
snake *food_1;
srand((unsigned)time(NULL)); //
food_1=(snake*)malloc(sizeof(snake)); // food_1
while((food_1->x%2)!=0) // , ,
{
food_1->x=rand()%52+2; //
}
food_1->y=rand()%24+1;
q=head;
while(q->next==NULL)
{
if(q->x==food_1->x && q->y==food_1->y) //
{
free(food_1); // ,
createfood(); //
}
q=q->next;
}
gotoxy(food_1->x,food_1->y);
food=food_1;
color(12);
printf("●"); //
}
/**
*
*/
int biteself()
{
snake *self; // self
self=head->next; //self
while(self!=NULL)
{
if(self->x==head->x && self->y==head->y) // self
{
return 1; // 1
}
self=self->next;
}
return 0;
}
/**
*
*/
void cantcrosswall()
{
if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) //
{
endgamestatus=1; //
endgame(); //
}
}
/**
* , , F1
*/
void speedup()
{
if(sleeptime>=50)
{
sleeptime=sleeptime-10;
add=add+2;
}
}
/**
* , F2
*/
void speeddown()
{
if(sleeptime<350) // 350
{
sleeptime=sleeptime+30; // 30
add=add-2; // 2
}
}
/**
* : status,
*/
void snakemove() // , U, D, L, R
{
snake * nexthead;
cantcrosswall();
nexthead=(snake*)malloc(sizeof(snake)); //
if(status==U)
{
nexthead->x=head->x; // ,x ,y -1
nexthead->y=head->y-1;
nexthead->next=head;
head=nexthead;
q=head; // q
if(nexthead->x==food->x && nexthead->y==food->y) //
{
while(q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★"); // , ● ★
q=q->next; // q
}
score=score+add; // ,
speedup();
createfood(); //
}
else
{
while(q->next->next!=NULL) //
{
gotoxy(q->x,q->y);
color(14);
printf("★"); // ,
q=q->next; //
}
gotoxy(q->next->x,q->next->y); // ,q , ,
color(3);
printf("■");
free(q->next); // ■ ,
q->next=NULL; //
}
}
if(status==D)
{
nexthead->x=head->x; // ,x ,y +1
nexthead->y=head->y+1;
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y) //
{
while(q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score=score+add;
speedup();
createfood();
}
else //
{
while(q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
if(status==L)
{
nexthead->x=head->x-2; // ,x -2,y
nexthead->y=head->y;
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y)//
{
while(q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score=score+add;
speedup();
createfood();
}
else //
{
while(q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
if(status==R)
{
nexthead->x=head->x+2; // ,x +2,y
nexthead->y=head->y;
nexthead->next=head;
head=nexthead;
q=head;
if(nexthead->x==food->x && nexthead->y==food->y)//
{
while(q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
score=score+add;
speedup();
createfood();
}
else //
{
while(q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("★");
q=q->next;
}
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next);
q->next=NULL;
}
}
if(biteself()==1) //
{
endgamestatus=2;
endgame();
}
}
/**
*
*/
void keyboardControl()
{
status=R; //
while(1)
{
scoreandtips();
if(GetAsyncKeyState(VK_UP) && status!=D) //GetAsyncKeyState
{
status=U; // , ,
}
else if(GetAsyncKeyState(VK_DOWN) && status!=U) // , ,
{
status=D;
}
else if(GetAsyncKeyState(VK_LEFT)&& status!=R) // , ,
{
status=L;
}
else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) // , ,
{
status=R;
}
if(GetAsyncKeyState(VK_SPACE)) // , pause
{
while(1)
{
Sleep(300); //sleep() , #include <unistd.h> , 。
if(GetAsyncKeyState(VK_SPACE)) //
{
break;
}
}
}
else if(GetAsyncKeyState(VK_ESCAPE))
{
endgamestatus=3; // esc ,
break;
}
else if(GetAsyncKeyState(VK_F1)) // F1 ,
{
speedup();
}
else if(GetAsyncKeyState(VK_F2)) // F2 ,
{
speeddown();
}
Sleep(sleeptime);
snakemove();
}
}
/*
*
*/
void explation()
{
//int i,j = 1;
system("cls");
// color(13);
// gotoxy(44,3);
// printf(" ");
// color(2);
// for (i = 6; i <= 22; i++) // ===
//{
// for (j = 20; j <= 75; j++) // ||
// {
// gotoxy(j, i);
// if (i == 6 || i == 22) printf("=");
// else if (j == 20 || j == 75) printf("||");
// }
//}
color(3);
gotoxy(30,8);
printf("1. , ");
color(10);
gotoxy(30,11);
printf("2. ↑.↓.←.→ ");
color(14);
gotoxy(30,14);
printf("3. F1 ,F2 ");
color(11);
gotoxy(30,17);
printf("4. , ");
color(4);
gotoxy(30,20);
printf("5. ESC : .space: ");
_getch(); //
system("cls");
welcometogame();
}
/**
*
*/
void endgame()
{
system("cls");
if(endgamestatus==1)
{
//Lostdraw();
gotoxy(43,9);
color(12);
printf("GAME OVER !");
}
else if(endgamestatus==2)
{
//Lostdraw();
gotoxy(43,9);
color(12);
printf("GAME OVER !");
}
else if(endgamestatus==3)
{
//Lostdraw();
gotoxy(40,9);
color(12);
printf(" 。");
}
gotoxy(43,12);
color(13);
printf(" %d",score);
choose();
}
/**
*
*/
void choose()
{
int n;
gotoxy(25,23);
color(12);
printf("Continue ------ 1");
gotoxy(52,23);
printf("Exit ------ 2");
gotoxy(45,25);
color(11);
printf(" : ");
scanf("%d", &n);
switch (n)
{
case 1:
system("cls"); //
score=0; //
sleeptime=200; //
add = 10; // add , 10,
welcometogame();
break;
case 2:
exit(0); //
break;
default:
gotoxy(35,27);
color(12);
printf(" !");
system("pause >nul");
endgame();
choose();
break;
}
}
/**
*
*/
void Lostdraw()
{
system("cls");
int i;
gotoxy(45,2);
color(6);
printf("\\\\\\|///");
gotoxy(43,3);
printf("\\\\");
gotoxy(47,3);
color(15);
printf(".-.-");
gotoxy(54,3);
color(6);
printf("//");
gotoxy(44,4);
color(14);
printf("(");
gotoxy(47,4);
color(15);
printf(".@.@");
gotoxy(54,4);
color(14);
printf(")");
gotoxy(17,5);
color(11);
printf("+------------------------");
gotoxy(35,5);
color(14);
printf("oOOo");
gotoxy(39,5);
color(11);
printf("----------");
gotoxy(48,5);
color(14);
printf("(_)");
gotoxy(51,5);
color(11);
printf("----------");
gotoxy(61,5);
color(14);
printf("oOOo");
gotoxy(65,5);
color(11);
printf("-----------------+");
for(i = 6;i<=19;i++) //
{
gotoxy(17,i);
printf("|");
gotoxy(82,i);
printf("|");
}
gotoxy(17,20);
printf("+---------------------------------");
gotoxy(52,20);
color(14);
printf("☆☆☆〃");
gotoxy(60,20);
color(11);
printf("----------------------+");
}
/**
*
*/
int main()
{
system("mode con cols=100 lines=30"); //
//printsnake();
welcometogame();
keyboardControl();
endgame();
return 0;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.