// 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()
{ p>
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); p>
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;
} p>
기타
{
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;
} p>
기타
{
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); p>
STEP= 0;
}
}