用C语言编写贪吃蛇游戏的程序
回答:Mr.emily
大师
6月3日 16:45 #define N 200
#includegraphics.h
#includestdlib.h
#includedos.h
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define Esc 0x011b
int i,key;
int score=0;
int gamespeed=50000;
struct Food
{int x;
int y;
int yes;
}food;
struct Snake
{int x[N];
int y[N];
int node;
int direction;
int life;
}snake;
void Init();
void Close();
void DrawK();
void GamePlay();
void GameOver();
void PrScore();
void main()
{ Init();
DrawK();
GamePlay();
Close();
}
void Init()
{int gd=DETECT,gm;
initgraph(gd,gm,"F:\\tuoboc2");/*此处为turboc的路径,读者可以根据自己的电脑而改*/
cleardevice();
}
void DrawK()
{setbkcolor(LIGHTGREEN);
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
for(i=50;i=600;i+=10)
{rectangle(i,40,i+10,49);
rectangle(i,451,i+10,460);
}
for(i=40;i=450;i+=10)
{rectangle(50,i,59,i+10);
rectangle(601,i,610,i+10);
}
}
void GamePlay()
{randomize();
food.yes=1;
snake.life=0;
snake.direction=1;
snake.x[0]=100;snake.y[0]=100;
snake.x[1]=110;snake.y[1]=100 ;
snake.node=2;
PrScore();
while(1)
{while(!kbhit())
{ if(food.yes==1)
{food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;
}
if(food.yes==0)
{setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i0;i--)
{snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{case 1:
snake.x[0]+=10;break;
case 2:
snake.x[0]-=10;break;
case 3:
snake.y[0]-=10;break;
case 4:
snake.y[0]+=10;break;
}
for(i=3;isnake.node;i++)
{
if(snake.x[i]==snake.x[0]snake.y[i]==snake.y[0])
{ GameOver();
snake.life=1;
break;
}
}
if(snake.x[0]55||snake.x[0]595||snake.y[0]55||snake.y[0]455)
{GameOver();
snake.life=1;
}
if(snake.life==1)
break;
if(snake.x[0]==food.xsnake.y[0]==food.y)
{setcolor(0);
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;
snake.y[snake.node]=-20;
snake.node++;
food.yes=1;
score+=10;
PrScore();
}
setcolor(4);
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
delay(gamespeed);
setcolor(0);
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
}
if(snake.life==1)
break;
key=bioskey(0);
if(key==Esc)
break;
else if(key==UPsnake.direction!=4)
snake.direction=3;
else if(key==RIGHTsnake.direction!=2)
snake.direction=1;
else if(key==LEFTsnake.direction!=1)
snake.direction=2;
else if(key==DOWNsnake.direction!=3)
snake.direction=4;
}
}
void GameOver()
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(3,0,4);
outtextxy(100,100,"Mengmeng,i love you!");
getch();
}
void PrScore()
{char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
void Close()
{ getch();
closegraph();
}
Mr.emily
如何用C语言写贪吃蛇
#includeconio.h #includegraphics.h #includetime.h #includestring.h #includemalloc.h #includestdio.h int grade=5,point=0,life=3; void set(),menu(),move_head(),move_body(),move(),init_insect(),left(),upon(),right(),down(),init_graph(),food_f(),ahead(),crate(); struct bug { int x; int y; struct bug *last; struct bug *next; }; struct fd { int x; int y; int judge; }food={0,0,0}; struct bug *head_f=NULL,*head_l,*p1=NULL,*p2=NULL; void main() { char ch; initgraph(800,600); set(); init_insect(); while(1) { food_f(); Sleep(grade*10); setcolor(BLACK); circle(head_l-x,head_l-y,2); setcolor(WHITE); move_body(); if(kbhit()) { ch=getch(); if(ch==27) { ahead(); set(); } else if(ch==-32) { switch(getch()) { case 72:upon();break; case 80:down();break; case 75:left();break; case 77:right();break; } } else ahead(); } else { ahead(); } if(head_f-x==food.xhead_f-y==food.y) { Sleep(100); crate(); food.judge=0; point=point+(6-grade)*10; if(food.x30||food.y30||food.x570||food.y570) life++; menu(); } if(head_f-x5||head_f-x595||head_f-y5||head_f-y595) { Sleep(1000); life--; food.judge=0; init_graph(); init_insect(); menu(); } for(p1=head_f-next;p1!=NULL;p1=p1-next) { if(head_f-x==p1-xhead_f-y==p1-y) { Sleep(1000); life--; food.judge=0; init_graph(); init_insect(); menu(); break; } } if(life==0) { outtextxy(280,300,"游戏结束!"); getch(); return; } move(); }; } void init_graph() { clearviewport(); setlinestyle(PS_SOLID,1,5); rectangle(2,2,600,598); setlinestyle(PS_SOLID,1,1); } void set() { init_graph(); outtextxy(640,50,"1、开始 / 返回"); outtextxy(640,70,"2、退出"); outtextxy(640,90,"3、难度"); outtextxy(640,110,"4、重新开始"); switch(getch()) { case '1': menu();setcolor(GREEN);circle(food.x,food.y,2);setcolor(WHITE);return; case '2': exit(0);break; case '3': outtextxy(700,90,":1 2 3 4 5");grade=getch()-48;set();break; case '4': food.judge=0,grade=5;point=0;life=3;init_insect();menu();break; default: outtextxy(250,300,"输入错误!"); set();break; } } void menu() { char str[20],str1[]={"分数:"},str2[]={"难度:"},str3[]={"生命值:"}; init_graph(); sprintf(str,"%d",point); strcat(str1,str); outtextxy(640,50,str1); sprintf(str,"%d",grade); strcat(str2,str); outtextxy(640,70,str2); sprintf(str,"%d",life); strcat(str3,str); outtextxy(640,90,str3); outtextxy(640,110,"设置:ESC"); } void init_insect() { head_f=(struct bug *)malloc(sizeof(struct bug)); head_f-last=NULL; head_f-x=300; head_f-y=300; p2=head_f-next=p1=(struct bug *)malloc(sizeof(struct bug)); p1-last=head_f; p1-x=295; p1-y=300; p1=p1-next=(struct bug *)malloc(sizeof(struct bug)); p1-next=NULL; p1-x=290; p1-y=300; p1-last=p2; head_l=p1; } void move() { for(p1=head_f;p1!=NULL;p1=p1-next) { circle(p1-x,p1-y,2); } } void move_head() { } void move_body() { for(p1=head_l,p2=p1-last;p2!=NULL;p1=p2,p2=p2-last) { p1-x=p2-x; p1-y=p2-y; } } void ahead() { p1=head_f; p2=p1-next; p2=p2-next; if(p1-x==p2-x) { if(p1-yp2-y) head_f-y+=5; else head_f-y-=5; } else { if(p1-xp2-x) { head_f-x+=5; } else head_f-x-=5; } } void upon() { p1=head_f-next; p1=p1-next; head_f-y-=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-y+=5; ahead(); } } void down() { p1=head_f-next; p1=p1-next; head_f-y+=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-y-=5; ahead(); } } void left() { p1=head_f-next; p1=p1-next; head_f-x-=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-x+=5; ahead(); } } void right() { p1=head_f-next; p1=p1-next; head_f-x+=5; if(p1-x==head_f-xp1-y==head_f-y) { head_f-x-=5; ahead(); } } void food_f() { if(!food.judge) { food.x=(rand()%117+1)*5; food.y=(rand()%117+1)*5; food.judge=1; if(food.x30||food.y30||food.x570||food.y570) { setcolor(RED); circle(f
用c语言设计贪吃蛇游戏
// Copyright liaoqb
#include windows.h
#include stdlib.h
#include time.h
const int LENGTH = 40;
const int WIDTH = 10;
const int RANGE = 50;
const int BeginLength = 5;
const int speed = 300;
#define SNAKE_COLOR RGB(176, 196, 222)
#define BACKGROUND_COLOR RGB(255, 255, 0)
#define DRAW_SNAKE(x) (x) * WIDTH
enum IsSnake {isSnake, isNotSnake, isFood};
IsSnake map[LENGTH][LENGTH];
struct snake {
int x;
int y;
snake* next;
snake(int x, int y, snake* n = NULL) {
this - x = x;
this - y = y;
next = n;
}
}; // snake
typedef struct snake Snake;
Snake* head = NULL; // queue
Snake* tail = NULL; // queue
int direct = 0; // direction
RECT playground; // district
TCHAR szAppName[] = TEXT("-*- snake game -* "); // The project name
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // message function
void Initializer();
void Controller(Snake*,LPVOID); // control the snake
void Move(HWND);
void PutFood();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) {
MSG msg;
HWND hwnd;
WNDCLASS wndclass;
while (TRUE) {
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
if (!RegisterClass(wndclass)) {
MessageBox(NULL, TEXT("Please try again!!!"), szAppName, MB_ICONERROR);
return 0;
}
break;
}
hwnd = CreateWindow(szAppName, TEXT("^_^ Snake Game ^_^"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, SW_NORMAL);
UpdateWindow(hwnd);
while (TRUE) {
if (PeekMessage(msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT)
break;
TranslateMessage(msg);
DispatchMessage(msg);
} else {
Move(hwnd);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;
switch (message) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
Initializer();
MoveWindow(hwnd, RANGE, RANGE, WIDTH * LENGTH + RANGE * 3, WIDTH * LENGTH + RANGE * 3, TRUE);
return 0;
case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT:
if (direct != VK_RIGHT)
direct = VK_LEFT;
break;
case VK_RIGHT:
if (direct != VK_LEFT)
direct = VK_RIGHT;
break;
case VK_UP:
if (direct != VK_DOWN)
direct = VK_UP;
break;
case VK_DOWN:
if (direct != VK_UP)
direct = VK_DOWN;
break;
default:
break;
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, ps);
SetViewportOrgEx(hdc, RANGE, RANGE, NULL);
hBrush = CreateSolidBrush(BACKGROUND_COLOR);
SelectObject(hdc, hBrush);
Rectangle(hdc,playground.left, playground.top, playground.right, playground.bottom);
DeleteObject(hBrush);
hBrush = CreateSolidBrush(SNAKE_COLOR);
SelectObject(hdc,hBrush);
for (int i = 0; i LENGTH; ++i) {
for (int j = 0; j LENGTH; ++j) {
if (map[i][j] == isSnake || map[i][j] == isFood) {
Rectangle(hdc, DRAW_SNAKE(i), DRAW_SNAKE(j), DRAW_SNAKE(i + 1), DRAW_SNAKE(j + 1));
}
}
}
DeleteObject(hBrush);
EndPaint(hwnd, ps);
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
void Initializer() {
for (int i = 0; i LENGTH; ++i) {
for (int j = 0; j LENGTH; ++j) {
map[i][j] = isNotSnake;
}
}
for (i = 0; i BeginLength; ++i) {
if (i == 0) {
head = tail = new snake(i, 0);
} else {
snake* temp = new snake(i, 0);
tail - next = temp;
tail = temp;
}
map[i][0] = isSnake;
}
playground.left = playground.top = 0;
playground.right = playground.bottom = WIDTH * LENGTH;
direct = VK_RIGHT;
PutFood();
}
void PutFood() {
srand(static_castunsigned(time(NULL)));
int x, y;
do {
x = rand() % LENGTH;
y = rand() % LENGTH;
} while (map[x][y] == isSnake);
map[x][y] = isFood;
} // put food
void Move(HWND hwnd) {
snake* temp;
switch (direct) {
case VK_LEFT:
temp = new snake(tail - x - 1, tail - y);
break;
case VK_RIGHT:
temp = new snake(tail - x + 1, tail - y);
break;
case VK_UP:
temp = new snake(tail - x, tail - y - 1);
break;
case VK_DOWN:
temp = new snake(tail - x, tail - y + 1);
break;
}
Controller(temp,hwnd);
//InvalidateRect(hwnd,NULL,FALSE);
Sleep(speed); // control speed
} // snake moving
void Controller(Snake* temp,LPVOID lParam) {
HWND hwnd;
hwnd=(HWND)lParam;
if (temp - x 0 || temp - x = LENGTH || temp - y 0 || temp - y = LENGTH
|| map[temp - x][temp - y] == isSnake) { // the snake is died
MessageBox(NULL,TEXT("Copyright liaoqb Sorry !!! Game Over !!! Copyright liaoqb"),szAppName,0);
delete temp;
while (head != NULL) {
Snake* ptr = head;
head = head - next;
delete ptr;
}
head = tail = temp = NULL;
Initializer();
return;
} else if (map[temp - x][temp - y] == isNotSnake) { // move
map[temp - x][temp - y] = isSnake;
map[head - x][head - y] = isNotSnake;
snake* ptr = head;
head = head - next;
delete ptr;
tail - next = temp;
tail = temp;
InvalidateRect(hwnd,NULL,FALSE);
} else { // if eat food
map[temp - x][temp - y] = isSnake;
tail - next = temp;
tail = temp;
PutFood();
//InvalidateRect(hwnd,NULL,FALSE);
}
}