현재 위치 - 인적 자원 플랫폼망 - 미니프로그램 자료 - C로 작은 게임 프로그램을 디자인하세요. 긴급!
C로 작은 게임 프로그램을 디자인하세요. 긴급!
게임 "스네이크"의 C++ 구현을 위한 소스 코드입니다.

// greedsnake.cpp

# include & ltbios.h & gt

# include & ltconio.h & gt

# include & ltdos.h & gt

# include & ltgraphics. .h & gt

# include & ltstdlib.h & gt

# include & lttime.h & gt

# include "conf.h"

typedef struct node

{<

int x, y;

구조체 노드 * 다음

} 노드;

typedef 구조체

{

노드 * 머리, * 꼬리;

int 길이;

} 스네이크;

typedef 구조체

{

int 왼쪽, 위, 오른쪽, 아래

}프레임;

typedefinenum//four directions

{

상단, 아래, 왼쪽, 오른쪽

}방향;

typedef 열거

{

false , true

} bool//*/

void InitGraphMode(); //그래픽 드라이버 초기화

void CloseGraphMode();

void Foot(int, int);

void Head(int. int);

void create frame();// 전체 게임 프레임 그리기를 끝냅니다.

void create snake(); // 뱀의 각 세그먼트가 큐의 노드인 두 개의 노드가 있는 뱀을 생성합니다.

bool play game(); // 게임의 주요 함수

int Hit(int, int); // 선을 넘을지 아니면 스스로 부딪힐지 결정합니다. 두 개의 파라미터는 새로운 헤드 컨택의 X와 Y 좌표입니다.

bool game over(); // 게임이 끝날 때 팝업되는 대화 상자를 그립니다.

void in queue(node); //인 대기열 함수

node out(); //아웃 대기열 함수

void ClearKeyBuf(); //키보드 버퍼를 지웁니다. 이 함수는 유효하지 않은 키를 계속 누르는 효과를 제거합니다.

Snake;

프레임 프레임;

void main()

{

InitGraphMode();

do

{

create frame();

} while(PlayGame( ));

CloseGraphMode();

}

void InitGraphMode()

{

int gdriver=DETECT, gmode

init graph(& amp; g driver &. amp; gmode, "... /bgi/";

clear device();

}

void CloseGraphMode()

{

clear device();

closegraph();

}

void CreateFrame()

{

setbkcolor(cyan);

// 다음 네 줄의 코드는 메인 프레임의 왼쪽 상단과 오른쪽 하단 모서리의 좌표를 계산하는 데 사용됩니다.

frame . left =(get maxx()+1-블록 너비 * RowOfFrame)/2;

frame . top = (get maxy()+1-블록 높이 * 열 오프 프레임)/2;

frame . right = frame . 왼쪽 + 블록 너비 * 행오브프레임;

frame . bottom = frame . top + 블록 높이 * 열 오프 프레임;

head(frame.left+100, frame . top-20);

setfillstyle(SOLID_FILL, light grey);

bar(frame.left, frame.top, frame.right, frame . bottom);

setlinestyle(SOLID_LINE, 1, 1);

setcolor(짙은 회색);

line(frame.left, frame.top, frame.right, frame . top);

line(frame.left, frame.top, frame.left, frame . bottom);

setlinestyle(SOLID_LINE, 1, 1);

setcolor(white);

line(frame.left, frame.bottom, frame.right, frame . 하단);

line(frame.right, frame.top, frame.right, frame . bottom);

setlinestyle(DOTTED_LINE, 1, 1);

setcolor(blue);

for(int row = 1; row & ltRowOfFramerow++)

line(frame.left+. 행*블록폭, 프레임.상단, 프레임.왼쪽+행*블록폭, 프레임 . bottom);

for(int column = 1; column & ltcolumn off frame; column++)

line(frame.left, frame.top + column * BlockHeight, frame.right, frame . top+column * 블록 높이);

foot(frame.left, frame . bottom+20);

}

void CreateSnake()

{

노드 * 노드1 = 새 노드;

노드 * 노드2 = 새 노드;

node 1->; x = frame . 왼쪽 + 블록 너비;

node 1->; y = frame.top

node 1->; next = NULL

snake . tail = node 1;

node 2->x = frame.left

node 2->y = frame.top

node 2->next = snake.tail

snake.head = node2

snake . length = 2;

setfillstyle(SOLID_FILL, blue);

bar(snake . head-& gt; x+1, snake . HEAD-& GT; Y+1, SNAKE . head-& gt; x+BlockWidth-1, snake . head-& gt; y+블록높이-1);

bar(snake . tail-& gt; x+1, snake . tail-& gt; y+1, snake . tail-& gt; x+BlockWidth-1, snake . tail-& gt; y+블록 높이-1);

}

{

int speed = 300, key

Direction CurrentDirection = right

Node randomNode

Node newNode, outNode

bool neednode = true

bool overlap = false

int randx, randy

create snake();

while(true)< /p>

{

if(neednode==true)

{

randomize();

do

{

randx = frame . left+rand()% RowOfFrame * 블록 너비;

Randy = frame . top+rand()% 열 오프 프레임 * 블록 높이;

for(Node * p = snake . head; p!= NULLp = p-& gt; next)//hit itself

if(randx = = p-& gt; x & amp& amp Randy = = = p-& gt; y)

{ overlap = true break; }

}

while(overlap = = =. true);

randomNode.x = randx

randomNode.y = randy

randomNode.next = NULL

setfillstyle(SOLID_FILL, red);

bar( randomNode.x+1, randomNode.y+1, random 노드 . x+블록 너비-1, 랜덤 노드 . y+블록 높이-1);

neednode = false

}

if((key=bioskey(1))! = 0)

{

스위치 (키)

{

케이스 ESC: 반환 거짓

케이스 위로:

if(현재 방향! = 아래로)

CurrentDirection = 위로

ClearKeyBuf();

Break;

케이스 아래로:

if(CurrentDirection! = 위로)

CurrentDirection = 아래로;

ClearKeyBuf();

break;

대소문자 왼쪽:

if(CurrentDirection! = 오른쪽)

CurrentDirection = 왼쪽;

ClearKeyBuf();

break;

대문자 오른쪽:

if(CurrentDirection! = 왼쪽)

CurrentDirection = 오른쪽;

ClearKeyBuf();

Break;

케이스 페이지 위로:속도 = 속도-100;

if(speed & lt100)

속도 = 100;

< p>ClearKeyBuf();

break;

케이스 페이지다운:속도 = 속도+100;

if (속도 & gt500)

속도 = 500;

ClearKeyBuf();

break;

default. break

}

}

int headx = snake . tail-& gt; x;

int heady = snake . tail-& gt; y;

스위치(현재 방향)

{

case up:heady-= 블록 높이; break;

case down:heady+= 블록 높이; break;

case left:headx-. = 블록 너비; break;

case right:headx+= 블록 너비; break;

}

if(Hit(headx, heady))//뱀이 벽에 부딪히는지 아니면 스스로 부딪히는지

returns to game over();

기타

다른

{//먹다

if(headx == 랜덤 노드 . x & amp; & ampheady==randomNode.y)

{

enqueue(random node);

setfillstyle(SOLID_FILL, blue);

bar(randomNode.x+1. randomNode.y+1, 무작위 노드 . x-1+블록 너비, 무작위 노드 . y-1+블록 높이);

neednode = true

}

otherwise//not eat

{

newNode.x = headx

newNode.y = heady

newNode.next =. NULL

in queue(new node);

out node = Dequeue();

setfillstyle(SOLID_FILL, light grey);

bar(outNode.x+1, outNode.y+1, outNode.x+. 블록 너비-1, 아웃 노드 . y+블록 높이-1);

setfillstyle(SOLID_FILL, 파란색);

bar(newNode.x+1, newNode.y+1, newNode.x-1+BlockWidth, new node . y-1+블록 높이);

}

}

Delay(speed);

}

void ClearKeyBuf()

{

does

BIOS key(0);

while(BIOS key(1));

}

emptyfoot(int x, int y)

{

setcolor(blue);

outtextxy(x, y," writer:[T]RealXL mailbox:real general @. hotmail . com");

}

Hollowhead(int x, int y)

{

setcolor(red);

outtextxy(x, y, "Gluttony");

}

잘못된 항목 (노드 inNode)

{

노드 * p = 새 노드;

p->; x = inNode.x

p->; y = inNode.y

p->; next = inNode.next

snake . tail-& gt; next = p;

snake . tail = p;

snake . length++;

}

node out ()

{

Node * p = snake.head

node out node = * p;

snake . head = p-& gt; next;

snake . length-;

delete p;

return outNode

}

int Hit(int x, int y)

{

if(x & lt; frame.left | | x & gt= frame.right | | y & ltframe. top | | y & gt= frame . bottom) // 벽에 부딪히다

return 1;

node * p = snake . head-& gt; next;

for(int I = snake . length-1; i & gt3; i -, p = p-& gt; next)//hit itself

if(x = = p-& gt; x & amp& ampy = = = p-& gt; y)

returns 1;

return 0;

}

Boolean Game Over()

{

int x = get maxx()/2-50;

int y = get maxy()/2-20;

setfillstyle(SOLID_FILL, 짙은 회색);

bar(x+3, y+3, x+103, y+43);

setfillstyle(SOLID_FILL, 자홍색);

bar(x, y, x+100, y+40);

setlinestyle(0, 3, 1);

setcolor(red);

rectangle(x, y, x+100, y+40);< /p>

outtextxy(x+20, y+10, "미터 끝!") )

char c;

While(true) //프로그램을 종료하려면 Q 또는 Q를, 게임을 다시 시작하려면 R 또는 R을 누릅니다.

{

c = getch();

if(c=='q'||c=='Q ')

return false

else if(c=='r'||c=='R ')

return true

}

}

C++ 주사위 놀이 소스 프로그램:

#포함

#포함

#배경색 시안색 정의

#기본색 검정색 정의

#선색 마젠타색 정의

# 플레이어 1 _ 빨간색 정의

#플레이어 2 _ the 색상 흰색

# 정의 오류 _ 빨강

# 정의 승자 _ 빨강

const int left = 40

const int top = 390

const int d = 30

const int line _ num = 9;

const int turn = 0;

const int r = d/3;

const int j = 10;

int x, y, k = 1, step = (line _ num+1)*(line _ num+1);

union REGS regs1. regs2

class player 1;

class player2

팬키 레벨

public:

팬키();

~팬키(){ };

void init _Panky();

friends invalid drop( player 1 & amp; num1, player2 & ampnum2, Panch & ampnum);

친구 유효하지 않은 입력 (player 1 & amp; num1, player2 & ampnum2, Panch & ampnum);

private:

int point[ line _ num+1][line _ num+1];

};

플레이어 레벨 1{

공개:

플레이어 1();

~ 플레이어 1(){ };

친구 널 드롭(플레이어 1 & amp;num1, player2 & ampnum2, Panky & ampnum);

친구 무효 입력 (player 1 & amp; num1, player2 & ampnum 2);

친구 int Judge_Winner (player 1 & amp; num1, player2 & ampnum 2);

Private:

int point 1[line _ num+1][line _ num+1];

};

class player 2{

Public:

player 2();

~ player 2(){ };

friends invalid drop (player 1 & amp; num1, player2 & ampnum2, Panky & ampnum);

Friends Invalid Input (player 1 & amp; num1, player2 & ampnum2, Panky & ampnum);

Friends INT Judge_Winning (player 1 & amp; num1, player2 & ampnum 2);

비공개:

int point 2[line _ num+1][line _ num+1];

};

잘못된 입력 (player 1 & amp; num1, player2 & ampnum 2 );

void fall (player 1 & amp; num1, player2 & ampnum2, Panky & ampnum);

international_judge_winner (Panky & amp1 & amp; num1, player2 & ampnum 2);

void input terror( );

void display _ winner(int);

void main()

{

int driver=DETECT, mode

init graph(& amp; driver & ampmode, " e:\ tc30 \. bgi");

Panky num

플레이어 1 num 1;

플레이어 2 num 2

when (step-)

{

init (num1, num2, num);

fall(num1, num2, num);

fall(num1, num2, num);

if(judge_winner(num1, num2))

{

display _ winner(k);

}

}

p>//getchar();

}

Panchy::Panchy(null)

< p>{ int j, I;

char ch[2]= " 0 ";

setbkcolor(back color);

set color(line color);

for(I = 0; I& lt= line _ numi++)

{

line(left, top-i*d, left+line _ num * d, top-I * d);

}

for(I = 0; I & lt= line _ numi++)

{

line(left+i*d, top, left+i*d. top-line _ num * d);

}

for(I = 0; I& lt= line _ numi++)

{ if(* ch = = = ' 9 '+1)* ch = ' a ';

settextstyle(DEFAULT_FONT, HORIZ_DIR, 1 );

outtextxy(left+i*d-2, top+r+3, ch);

(* ch)=(* ch)+1;

}

* ch = "0";

for(I = 0; I& lt=. line _ numi++)

{ if(* ch = = ' 9 '+1)* ch = ' a ';

settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);

outtextxy(left-r-10, top-d*i-3, ch);< /p>

(* ch)=(* ch)+1;

}

set color(default color);

for(i = 0; i & lt= line _ numi++)

{

for(j = 0; j & lt= line _ numj++)

dot[I][j] = 0;

}

}

Voidfall(player 1 & amp; num1, player2 & ampnum2, Panch & amp number)

{

int flag = k % 2;

if(flag)

{ set colour(player 2 _ color);

num 2 . point 2[x][y]= 1;

num point[x][y]= 2;

circle(left+d*x, top-d*y, r);

setfillstyle(1, player 2 _ colour);

floodfill(left+d*x. , top-d*y, player 2 _ color);

}

기타

{ num 1 . point 1[x][y]= 1;

number point[x][y]= 1;

set color(player 1 _ colour);

circle(left+d*x, top-d*y, r);

setfillstyle(1, player 1 _. color);

floodfill(left+d*x, top-d*y, player 1 _ color);

}

set color(default color);

}

invalid input(player 1 & amp; num1 , 플레이어2 & 앰프넘2, 팬치 & 앰프넘버)

{ char xx, YY;

k++;

while(1)

{

regs 1 . h . ah = 0;

xx=int86(22, ?s1, ?s 1)-"0";

if(xx==('q'-'0')||xx==('Q'-'0 '))

{ step = 0;

return;

< p>}

regs 1 . h . ah = 0;

yy=int86(22, ?s1, ?s 1)-"0";

if(yy==('q'-'0')||yy==('Q'-'0 '))

{

step = 0;

returns;

}

If (xx & lt0 | | xx & gt 줄 번호)

{ input terror();

continue;

}

If (yy & lt0 | | yy & gt 줄 번호)

{ input terror();

p >continue;

}

if(num.point[xx][yy]==0)

{

Break;

}

Other

{

input terror();

Continue;

}

p>}

x = (int)xx;

y = (int)YY;

set colour(back color);

settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);

outtextxy( LEFT+D*LINE_NUM/3, TOP+D*2, "입력 오류");

set color(default color);

}

플레이어1::PLAYER1()

{< /p>

int i, j;

for(I = 0; I & lt= line _ numi++)

{

for(j = 0; j & lt= line _ numj++)

point 1[I][j]= 0;

}

}

>

Player2::Player2()

{ int i, j;

for(I = 0; I & lt= line _ numi++)

{

for(j = 0; j & lt= line _ numj++)

point 2[I][j]= 0;

}< /p>

}

void input terror(void)

{ set color(error _ color);

settextstyle(default_font, horiz_dir, 1);

outtextxy(left+d*. LINE_NUM/3, TOP+D*2, "입력 오류");

set color(default color);

}

int judge_winner(player 1 & amp;num1. player2 & ampnum2)

{

int count=0, m=0, n=0, a=0, b=0, xx0, yy0

int flag = k % 2;

xx0 = x; yy0 = y;

if (! flag)

{//left & lt; -& gt; correct

while(xx0 & gt; = 1. & ampm & lt4){ xx0-; m++; }

while(n & lt; 9 & amp & ampxx0 & lt = 줄 번호)

{

if( num 1 . point 1[xx0][y] = = 1)

{

count++;

if(count==5) return 1;

}

기타

{

count = 0;

}

n++;

xx0++;

}

//up & lt; -& gt; down

count = 0; xx0 = x; m = 0; n = 0;

while(yy0 & gt; = 1. & ampm & lt4){ yy0-; m++; }

while(n & lt; 9 &. amp& ampyy0 & lt=줄 번호)

{

if(num 1 . point 1[x][yy0] = = 1)

{

count++;

if(count==5)

returns 1;

}

Other

{

count = 0;

}

n++

;

yy0++;

}

//top-left-bottom-right

xx0 = x;

yy0 = y;

m = 0;

n = 0;

count = 0;

while(xx0 & gt; = 1. & ampm & lt4) { xx0-; a++; m++; } m = 0;

while(yy0 & lt; = 라인 번호 & amp& ampm & lt4){ yy0++; b++; m++; }

if (a & lt=b)

{

xx0 = x-a; yy0 = y+a;

}

기타

{

xx0 = x-b; yy0 = y+b;

}

while(xx0 & lt; = 줄 번호 & amp& ampyy0 & gt= 0 & amp& ampn & lt9)

{

if(num 1 . point 1[xx0][yy0] = = 1)

{

count++;

if(count==5)

returns 1;

}

Other

{

count = 0;

}

xx0++;

yyy0-;

n++;

}

//오른쪽 위로 & lt-& gt; 왼쪽 아래로

count = 0;

a = 0;

b = 0;

n = 0;

m = 0;

xx0 = x;

yy0 = y;

while(xx 0 while(yy0if(a & lt;=b)

{

xx0 = x+a;

yy0 = y+a;

}

Other

{

xx0 = x+b;< /p>

yy0 = y+b;

}

while(xx0 & gt; = 0 & amp& ampy0 & gt= 0 & amp& ampn & lt9)

{

if(num 1 . point 1[xx0][yy0] = = 1)

{

count++;

if(count==5)

returns 1;

}

기타

count = 0;

xx0-;

yy0-;<

n++;

}

//승자 없음

리턴값 0;

}

기타

{

//left & lt; -& gt; correct

while(xx0 & gt; = 1. & ampm & lt4){ xx0-; m++; }

while(n & lt; 9 & amp& ampxx0 & lt=줄 번호)

{

if(num 1 . point 1[xx0][y] = = 1)

{

count++;

if(count==5) return 1;

}

기타

{

count = 0;

}

n++;

xx0++;

}

//up & lt; -& gt; down

count = 0; xx0 = x; m = 0; n = 0;

while(yy0 & gt; = 1. & ampm & lt4){ yy0-; m++; }

while(n & lt; 9 &. amp& ampyy0 & lt=줄 번호)

{

if(num 2 . point 2[x][yy0] = = 1)

{

count++;

if(count==5)

returns 1;

}

Other

{

count = 0;

}

n++

;

yy0++;

}

//top-left-bottom-right

xx0 = x;

yy0 = y;

m = 0;

n = 0;

count = 0;

while(xx0 & gt; = 1. & ampm & lt4) { xx0-; a++; m++; } m = 0;

while(yy0 & lt; = 라인 번호 & amp& ampm & lt4){ yy0++; b++; m++; }

if (a & lt=b)

{

xx0 = x-a; yy0 = y+a;

}

기타

{

xx0 = x-b; yy0 = y+b;

}

while(xx0 & lt; = 줄 번호 & amp& ampy0 & gt= 0 & amp& ampn & lt9)

{

if(num 2 . point 2[xx0][yy0] = = 1)

{

count++;

if(count==5)

returns 1;

}

Other

{

count = 0;

}

xx0++;

yyy0-;

n++;

}

//오른쪽 위로 & lt-& gt; 왼쪽 아래로

count = 0;

a = 0;

b = 0;

n = 0;

m = 0;

xx0 = x;

yy0 = y;

while(xx 0 while(yy0if(a & lt;=b)

{

xx0 = x+a;

yy0 = y+a;

}

Other

{

xx0 = x+b;< /p>

yy0 = y+b;

}

while(xx0 & gt; = 0 & amp& ampy0 & gt= 0 & amp& ampn & lt9)

{

if(num 2 . point 2[xx0][yy0] = = 1)

{

count++;

if(count==5)

returns 1;

}

기타

count = 0;

xx0-;

yy0-;< /p>

n++;

}

// no winner

returns 0;

}

void display_winner(int k)

{

int flag = k % 2;

if (! flag)

{ set colour(winner _ color);

settextstyle(default_font, horiz_dir, 2);

outtextxy(left + d*2, top + 40, "빨간색이 승자입니다!");

"빨간색이 승자입니다! ");

set color(default color);

step= 0;

getchar();

}

p>

기타

{ set color(winner _ color);

setextstyle(default_font, horiz_dir, 2);

outtextxy(left + 2*d, top + 40, "white is the winner");

set colour(default colour);

STEP= 0;

}

}