案例一
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#define FrameX 4
#define FrameY 4
#define Frame_height 20
#define Frame_width 20
char reg_name[30]="",reg_pwd[10]="";
char on_name[30],on_pwd[10];
int i,j;
int a[2];
struct Snake {
int x[100];
int y[100];
int count;
int length;
int speed;
};
struct Food {
int x;
int y;
};
void gotoxy(HANDLE hOut, int x, int y) {
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(hOut, pos);
}
void Set_TextColor_Green (void) {
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void make_frame() {
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);
printf("Esc 退出游戏");
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
printf("长按方向键:加速");
gotoxy(hOut,FrameX,FrameY);
printf("╔");
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
printf("╗");
gotoxy(hOut,FrameX,FrameY+Frame_height);
printf("╚");
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
printf("╝");
for(i=2; i<2*Frame_width-2; i+=2) {
gotoxy(hOut,FrameX+i,FrameY);
printf("═");
}
for(i=2; i<2*Frame_width-2; i+=2) {
gotoxy(hOut,FrameX+i,FrameY+Frame_height);
printf("═");
}
for(i=1; i<Frame_height; i++) {
gotoxy(hOut,FrameX,FrameY+i);
printf("║");
}
for(i=1; i<Frame_height; i++) {
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
printf("║");
}
gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);
Set_TextColor_Green ();
printf("贪吃蛇游戏");
}
over_game() {
system("cls");
printf("\n\n\n\n\n\n\n\n\t\t\t\t游戏结束\n\n\n");
Sleep(2000);
return 0;
}
print_information(HANDLE hOut,struct Snake *snake,struct Food *food) {
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
printf("level : %d",snake->count/5+1);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
printf("score : %d",10*snake->count);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
printf("eat food : %d",snake->count);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);
printf("speed : %dms",snake->speed);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9);
printf("foodX : %d",food->x);
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11);
printf("foodY : %d",food->y);
}
void init_snake(struct Snake *snake) {
snake->x[0]=FrameX+2;
snake->y[0]=FrameY+Frame_height/2;
snake->speed=300;
snake->length=3;
snake->count=0;
for(i=1; i<snake->length; i++)
{
snake->x[i]=snake->x[i-1]+2;
snake->y[i]=snake->y[i-1];
}
}
void move_snake(HANDLE hOut,struct Snake *snake) {
gotoxy(hOut,snake->x[0],snake->y[0]);
printf(" ");
for(i=1; i<snake->length; i++) {
snake->x[i-1]=snake->x[i];
snake->y[i-1]=snake->y[i];
}
}
void print_snake(HANDLE hOut,struct Snake *snake)
{
for(i=0; i<snake->length; i++)
{
gotoxy(hOut,snake->x[i],snake->y[i]);
if(i==0)
{
printf("○");
}
else if(i==snake->length-1)
{
printf("¤");
}
else
{
printf("⊙");
}
}
}
void get_food(HANDLE hOut,struct Snake *snake,struct Food *food) {
srand((unsigned)time(NULL));
while(1) {
food->x = rand() % (Frame_width-1);
food->y = rand() % Frame_height;
if( food->x==0 || food->y==0 ) {
continue;
}
food->x = 2*food->x + FrameX;
food->y+=FrameY;
for(i=0; i<snake->length; i++)
{
if( food->x==snake->x[i] && food->y==snake->y[i] )
{
break;
}
}
if(i==snake->length)
{
gotoxy(hOut,food->x,food->y);
printf("⊙");
break;
}
}
}
void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food)
{
if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y )
{
snake->length++;
for(i=snake->length-1; i>=1; i--)
{
snake->x[i]=snake->x[i-1];
snake->y[i]=snake->y[i-1];
}
snake->x[0]=a[0];
snake->y[0]=a[1];
get_food(hOut,snake,food);
snake->count++;
if( snake->count%5==0 )
{
snake->speed-=50;
}
}
}
int if_die(struct Snake *snake)
{
for(i=0; i<snake->length-1; i++)
{
if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] )
{
return 0;
}
}
return 1;
}
void regist() {
system("pause");
system("cls");
printf("\n\n\t\t\t欢迎使用贪吃蛇注册系统!\n\n");
while(1)
{
printf("\t\t请输入用户名[不能大于10个字符]:");
scanf("%s",reg_name);
if(strlen(reg_name)<=10)
{
while(1)
{
printf("\n\t\t请输入密码[密码长度为八位]:");
scanf("%s",reg_pwd);
if(strlen(reg_pwd)==8)
{
printf("\n\n\t\t注册成功,您的用户名是%s,密码是%s\n\n",reg_name,reg_pwd);
break;
}
else
{
printf("\n\t\t密码的长度为%d,请重新输入\n",strlen(reg_pwd));
}
}
break;
} else
{
printf("\n\t\t用户名的长度为%d,请重新输入\n\n",strlen(reg_name));
}
}
}
int judge()
{
if(strcmp(reg_name,"")==0&&strcmp(reg_pwd,"")==0)
{
printf("\n\n\t\t您尚未注册,请先注册!\n\n");
return 0;
}
else
{
return 1;
}
}
start_game() {
system("pause");
system("cls");
unsigned char ch=77;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
struct Snake s,*snake=&s;
struct Food f,*food=&f;
make_frame();
init_snake(snake);
get_food(hOut,snake,food);
while(1)
{
print_information(hOut,snake,food);
a[0]=snake->x[0];
a[1]=snake->y[0];
j=0;
if(kbhit())
{
ch=getch();
if(kbhit())
{
Sleep(20);
j=1;
}
}
switch(ch)
{
case 72:
{
move_snake(hOut,snake);
snake->y[snake->length-1]-=1;
break;
}
case 80:
{
move_snake(hOut,snake);
snake->y[snake->length-1]+=1;
break;
}
case 75:
{
move_snake(hOut,snake);
snake->x[snake->length-1]-=2;
break;
}
case 77:
{
move_snake(hOut,snake);
snake->x[snake->length-1]+=2;
break;
}
}
if( ch==72 && snake->y[snake->length-1]==FrameY)
{
return 0;
}
if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height )
{
return 0;
}
if( ch==75 && snake->x[snake->length-1]==FrameX )
{
return 0;
}
if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 )
{
return 0;
}
eat_food(hOut,snake,food);
print_snake(hOut,snake);
if( if_die(snake)==0 || ch==27 || snake->speed==50 )
{
gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1);
printf("Game Over");
Sleep(2000);
break;;
}
if(j==0)
{
Sleep(snake->speed);
}
else
{
Sleep(10);
}
}
}
void dl()
{
system("color 0D");
int id;
while(1)
{
system("pause");
system("cls");
printf(" ********************************** \n");
printf(" ** ** \n");
printf(" ** 欢迎使用贪吃蛇! ** \n");
printf(" ** ** \n");
printf(" ********************************** \n");
printf(" -----------祝你使用愉快!---------- \n");
printf(" ********************************** \n");
printf(" ** ** \n");
printf(" *****请选择功能编号:************* \n");
printf(" ** *** ** \n");
printf(" ** 1.注册账号。 ***** ** \n");
printf(" ** *** ** \n");
printf(" ** 2.登录账号。 * ** \n");
printf(" ** * ** \n");
printf(" ** 0.退出系统。 * ** \n");
printf(" ** * ** \n");
printf(" ********************************** \n");
printf("请输入您的选择:");
scanf("%d",&id);
switch(id)
{
case 1:
regist();
break;
case 2:
if(judge()==1)
{
return;
}
break;
case 0:
exit(1);
break;
default:
printf("\n\t\t您输入的功能编号有误,请重新输入!\n");
}
}
system("pause");
system("cls");
}
int main() {
int start_game();
int over_game();
dl();
int d=3;
int i;
system("pause");
system("cls");
printf( " ==============================================================================\n");
printf( " ==**************************************************************************==\n");
printf( " == \\ / ==\n");
printf( " == \\ / 欢 ==\n");
printf( " == \\ / 迎 ==\n");
printf( " == * * * * * * * * * * * * * * * * 来 ==\n");
printf( " == * * * * * * * * * * * * * * * * 到 ==\n");
printf( " == * * / \\ * * 贪 ==\n");
printf( " == * * / \\ * * 吃 ==\n");
printf( " == * * * * 蛇 ==\n");
printf( " == * * \\ /\\ / * * ==\n");
printf( " == * * \\ \\/ * * ==\n");
printf( " == * * * * * * * * * * * * * * * * ==\n");
printf( " == * * * * * * * * * * * * * * * * ==\n");
printf( " == * * ==\n");
printf( " == ==\n");
printf( " ==**************************************************************************==\n");
printf( " ******************************************************************************\n");
printf("\n\n\t\t\t欢迎来到贪吃蛇登录!哔哩哔哩-(゜-゜)つロ乾杯~\n\n");
for(i=1; i<=3; i++)
{
printf("\t\t请输入用户名:");
scanf("%s",on_name);
printf("\n\t\t请输入密 码:");
scanf("%s",on_pwd);
if(strcmp(reg_name,on_name)==0&&strcmp(reg_pwd,on_pwd)==0)
{
printf("\n\n\t\t登录成功,欢迎使用贪吃蛇!\n\n");
start_game();
over_game();
return 0;
}
else
{
printf("\n\n\t\t登录失败,请重新登录,您还有%d次机会\n\n",3-i);
d=d--;
if(d=0)
{
return 0;
}
}
}
}
案例二
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<string.h>
#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define stop 'p'
void welcome();
void Finish();
void creatgraph();
void gotoxy(int x, int y);
void gotoprint(int x, int y);
void gotodelete(int x, int y);
void creatfood();
int ClickControl();
int Judge();
void MovingBody();
void Eating();
void ChangeBody(int a,int b);
typedef struct snakes{
int x;
int y;
struct snakes *Next;
}snake;
snake *Head;
snake *tail;
struct Food
{
int x;
int y;
}food;
char name[20];
int score=0;
int speed;
char click=1;
void welcome();
void Finish()
{
system("cls");
gotoxy(15, 10);
printf("/**********************************************/");
gotoxy(15, 20);
printf("/**********************************************/");
gotoxy(18, 14);
printf("GAME OVER o(* ̄▽ ̄*)o");
gotoxy(20, 16);
printf("Your Score is %d hiahiahia", score);
gotoxy(18, 18);
gotoxy(0, 27);
system("pause");
}
void creatgraph()
{
int i;
for(i=0;i<58;i+=2)
{
gotoprint(i, 0);
gotoprint(i, 26);
}
for(i=1;i<26;i++){
gotoprint(0, i);
gotoprint(56, i);
}
gotoxy(63, 10);
printf("欢迎来到游戏%s",name);
gotoxy(63,15);
printf("您的得分是:%s",score);
gotoxy(104,29);
printf("游戏制作者李德旭");
Head = (snake*)malloc(sizeof(snake));
Head->x = 16;
Head->y = 15;
tail=(snake*)malloc(sizeof(snake));
snake *p=(snake*)malloc(sizeof(snake));
snake *q=(snake*)malloc(sizeof(snake));
p->x= 16;
p->y= 16;
q->x = 16;
q->y = 17;
Head->Next=p;
p->Next=q;
q->Next=tail;
tail->Next=NULL;
}
void gotoxy(int x, int y)
{
COORD pos;
HANDLE hOutput;
pos.X=x;
pos.Y=y;
hOutput= GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,pos);
}
void gotoprint(int x, int y)
{
gotoxy(x,y);
printf("■");
}
void gotodelete(int x, int y)
{
gotoxy(x, y);
printf(" ");
}
void creatfood()
{
srand((int)time(NULL));
lable:
food.y = rand() % (25 - 1 + 1) + 1;
food.x = rand() % (54 - 2 + 1) + 2;
if (food.x % 2 != 0)
{
food.x = food.x+1;
}
snake *judge = Head;
while (1)
{
if (judge->Next == NULL) break;
if (food.x == judge->x&&food.y == judge->y)
{
goto lable;
}
judge = judge->Next;
}
gotoxy(food.x, food.y);
printf("⊙");
}
int ClickControl()
{
char c;
while (1)
{
if (Judge()==0) return 0;
if(_kbhit())
{
click=_getch();
}
MovingBody();
Eating();
}
return 1;
}
int Judge()
{
if(Head->x==0||Head->y==0||Head->x==56||Head->y==26)
{
Finish();
return 0;
}
snake *p=Head->Next;
while(p->Next!=NULL){
if(Head->x==p->x&&Head->y==p->y)
{
Finish();
return 0;
}
p=p->Next;
}
return 1;
}
void MovingBody()
{
int count=0;
int a=Head->x,b=Head->y;
snake *p=Head;
while(1)
{
if(p->Next==NULL)
break;
gotodelete(p->x,p->y);
count++;
p=p->Next;
}
switch(click)
{
case up:
Head->y-=1;
ChangeBody(a,b);
break;
case down:
Head->y+=1;
ChangeBody(a,b);
break;
case left:
Head->x-=2;
ChangeBody(a,b);
break;
case right:
Head->x+=2;
ChangeBody(a,b);
break;
}
p=Head;
while(p->Next!=NULL)
{
gotoprint(p->x,p->y);
p=p->Next;
}
p=Head;
gotoxy(0,28);
if (count<=10)speed=150;
else if(count>10&& count<=20)speed=100;
else if(count>20&& count<=40)speed=50;
else speed=10;
Sleep(speed);
}
void Eating()
{
if (Head->x == food.x&&Head->y == food.y)
{
creatfood();
snake *_new = (snake*)malloc(sizeof(snake));
snake *p;
p = Head;
while (1)
{
if (p->Next->Next == NULL) break;
p = p->Next;
}
p->Next = _new;
_new->Next = tail;
score += 10;
gotoxy(77, 15);
printf("%d", score);
}
}
void ChangeBody(int a,int b)
{
snake *p=Head->Next;
int mid1,mid2,_mid1,_mid2;
mid1=p->x;
mid2=p->y;
while(1)
{
if(p->Next->Next==NULL)
break;
_mid1=p->Next->x;
_mid2=p->Next->y;
p->Next->x=mid1;
p->Next->y=mid2;
mid1 = _mid1;
mid2 = _mid2;
p = p->Next;
}
p=Head->Next;
p->x = a;
p->y = b;
}
int main(){
creatgraph();
creatfood();
if (ClickControl() == 0) return 0;
}
案例三
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<stdlib.h>
#define U 1
#define D 2
#define L 3
#define R 4
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;
void Pos();
void creatMap();
void initSnake();
void snakeMove();
int biteSelf();
void createFood();
void cantCrossWall();
void pause();
void runGame();
void initGame();
void endGame();
void gameStart();
void speeddown();
void speedup();
void Pos(int x, int y)
{
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
SetConsoleTextAttribute(hOutput,10|1);
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void creatMap()
{
int i;
for (i = 0; i<58; i=i+2)
{
Pos(i, 0);
printf("■");
Pos(i, 25);
printf("■");
}
for (i = 0; i<26; i++)
{
Pos(0, i);
printf("■");
Pos(56, i);
printf("■");
}
}
void initSnake()
{
snake *tail;
int i;
tail = (snake*)malloc(sizeof(snake));
tail->x = 24;
tail->y = 5;
tail->next = NULL;
for (i = 1; i <=3; i++)
{
head = (snake*)malloc(sizeof(snake));
head->next = tail;
head->x = 24 +2*i;
head->y = 5;
tail= head;
}
while (tail!= NULL)
{
Pos(tail->x, tail->y);
printf("■");
tail = tail->next;
}
}
int biteSelf()
{
snake *self;
self = head->next;
while (self != NULL)
{
if (self->x == head->x && self->y == head->y)
{
return 1;
}
self = self->next;
}
return 0;
}
void createFood()
{
snake *food_1;
srand((unsigned)time(NULL));
food_1 = (snake*)malloc(sizeof(snake));
food_1->x=rand()%53+2;
while ((food_1->x % 2)!= 0)
{
food_1->x = food_1->x+1 ;
}
food_1->y = rand()%23+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;
}
Pos(food_1->x, food_1->y);
food = food_1;
printf("$");
}
void cantCrossWall()
{
if (head->x == 0 || head->x == 54 || head->y == 0 || head->y == 24)
{
endGamestatus = 1;
endGame();
}
}
void snakeMove()
{
snake * nexthead;
cantCrossWall();
nexthead = (snake*)malloc(sizeof(snake));
if (status == U)
{
nexthead->x = head->x;
nexthead->y = head->y - 1;
if (nexthead->x == food->x && nexthead->y == food->y)
{
nexthead->next = head;
head = nexthead;
q = head;
while (q != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
score = score + add;
createFood();
}
else
{
nexthead->next = head;
head = nexthead;
q = head;
while (q->next->next != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
Pos(q->next->x, q->next->y);
printf(" ");
free(q->next);
q->next = NULL;
}
}
if (status == D)
{
nexthead->x = head->x;
nexthead->y = head->y + 1;
if (nexthead->x == food->x && nexthead->y == food->y)
{
nexthead->next = head;
head = nexthead;
q = head;
while (q != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
score = score + add;
createFood();
}
else
{
nexthead->next = head;
head = nexthead;
q = head;
while (q->next->next != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
Pos(q->next->x, q->next->y);
printf(" ");
free(q->next);
q->next = NULL;
}
}
if (status == L)
{
nexthead->x = head->x - 2;
nexthead->y = head->y;
if (nexthead->x == food->x && nexthead->y == food->y)
{
nexthead->next = head;
head = nexthead;
q = head;
while (q != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
score = score + add;
createFood();
}
else
{
nexthead->next = head;
head = nexthead;
q = head;
while (q->next->next != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
Pos(q->next->x, q->next->y);
printf(" ");
free(q->next);
q->next = NULL;
}
}
if (status == R)
{
nexthead->x = head->x + 2;
nexthead->y = head->y;
if (nexthead->x == food->x && nexthead->y == food->y)
{
nexthead->next = head;
head = nexthead;
q = head;
while (q != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
score = score + add;
createFood();
}
else
{
nexthead->next = head;
head = nexthead;
q = head;
while (q->next->next != NULL)
{
Pos(q->x, q->y);
printf("■");
q = q->next;
}
Pos(q->next->x, q->next->y);
printf(" ");
free(q->next);
q->next = NULL;
}
}
if (biteSelf() == 1)
{
endGamestatus = 2;
endGame();
}
}
void pause()
{
while (1)
{
Sleep(300);
if (GetAsyncKeyState(VK_SPACE))
{
break;
}
}
}
void runGame()
{
Pos(64, 15);
printf("不能穿墙,不能咬到自己\n");
Pos(64, 16);
printf("用↑.↓.←.→分别控制蛇的移动.");
Pos(64, 18);
printf("ESC :退出游戏.space:暂停游戏.");
status = R;
while (1)
{
Pos(64, 10);
printf("得分:%d ", score);
Pos(64, 11);
printf("每个食物得分:%d分", add);
if (GetAsyncKeyState(VK_UP) && status != D)
{
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;
}
else if (GetAsyncKeyState(VK_SPACE))
{
pause();
}
else if (GetAsyncKeyState(VK_ESCAPE))
{
endGamestatus = 3;
break;
}
Sleep(300);
snakeMove();
}
}
void initGame()
{
Pos(40, 12);
printf("欢迎来到贪食蛇游戏!");
system("pause");
system("cls");
Pos(25, 12);
printf("用↑.↓.←.→分别控制蛇的移动,\n");
system("pause");
system("cls");
}
void endGame()
{
system("cls");
Pos(24, 12);
if (endGamestatus == 1)
{
printf("对不起,您撞到墙了。游戏结束.");
}
else if (endGamestatus == 2)
{
printf("对不起,您咬到自己了。游戏结束.");
}
else if (endGamestatus == 3)
{
printf("您的已经结束了游戏。");
}
Pos(24, 13);
printf("您的得分是%d\n", score);
exit(0);
}
void gameStart()
{
initGame();
creatMap();
initSnake();
createFood();
}
int main()
{ while(1)
{
gameStart();
runGame();
}
endGame();
return 0;
}
案例四
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#define SNAKESIZE 100
#define MAPWIDTH 118
#define MAPHEIGHT 29
struct food
{
int x;
int y;
}food;
struct snake{
int speed;
int len;
int x[SNAKESIZE];
int y[SNAKESIZE];
}snake;
void drawMap();
void createFood();
void keyDown();
bool snakeStatus();
void gotoxy(int x, int y);
int key = 72;
int changeFlag = 0;
int sorce = 0;
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void drawMap()
{
for (int i = 0; i <= MAPWIDTH; i += 2)
{
gotoxy(i, 0);
printf("■");
gotoxy(i, MAPHEIGHT);
printf("■");
}
for (int i = 1; i < MAPHEIGHT; i++)
{
gotoxy(0, i);
printf("■");
gotoxy(MAPWIDTH, i);
printf("■");
}
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
if (food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("★");
snake.len = 3;
snake.speed = 200;
snake.x[0] = MAPWIDTH / 2 + 1;
snake.y[0] = MAPHEIGHT / 2;
gotoxy(snake.x[0], snake.y[0]);
printf("■");
for (int i = 1; i < snake.len; i++)
{
snake.x[i] = snake.x[i - 1] + 2;
snake.y[i] = snake.y[i - 1];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
gotoxy(MAPWIDTH - 2, 0);
return;
}
void keyDown()
{
int pre_key = key;
if (_kbhit())
{
fflush(stdin);
key = _getch();
key = _getch();
}
if (changeFlag == 0)
{
gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
printf(" ");
}
for (int i = snake.len - 1; i > 0; i--)
{
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
}
if (pre_key == 72 && key == 80)
key = 72;
if (pre_key == 80 && key == 72)
key = 80;
if (pre_key == 75 && key == 77)
key = 75;
if (pre_key == 77 && key == 75)
key = 77;
switch (key)
{
case 75:
snake.x[0] -= 2;
break;
case 77:
snake.x[0] += 2;
break;
case 72:
snake.y[0]--;
break;
case 80:
snake.y[0]++;
break;
}
gotoxy(snake.x[0], snake.y[0]);
printf("■");
gotoxy(MAPWIDTH - 2, 0);
changeFlag = 0;
return;
}
void createFood()
{
if (snake.x[0] == food.x && snake.y[0] == food.y)
{
while (1)
{
int flag = 1;
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
for (int i = 0; i < snake.len; i++)
{
if (snake.x[i] == food.x && snake.y[i] == food.y)
{
flag = 0;
break;
}
}
if (flag && food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("★");
snake.len++;
sorce += 10;
snake.speed -= 5;
changeFlag = 1;
}
return;
}
bool snakeStatus()
{
if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)
return false;
if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)
return false;
for (int i = 1; i < snake.len; i++)
{
if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
return false;
}
return true;
}
int main()
{
drawMap();
while (1)
{
keyDown();
if (!snakeStatus())
break;
createFood();
Sleep(snake.speed);
}
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);
printf("Game Over!\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);
printf("本次游戏得分为:%d\n", sorce);
Sleep(5000);
return 0;
}
案例五
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#ifndef __cplusplus
typedef char bool;
#define false 0
#define true 1
#endif
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
#define SNAKESIZE 100
#define MAPWIDTH 78
#define MAPHEIGHT 24
struct food{
int x;
int y;
}food;
struct snake{
int speed;
int len;
int x[SNAKESIZE];
int y[SNAKESIZE];
}snake;
void drawMap();
void createFood();
void keyDown();
bool snakeStatus();
void gotoxy(int x, int y);
int key = 72;
int changeFlag = 0;
int sorce = 0;
int i;
void drawMap()
{
for (i = 0; i <= MAPWIDTH; i += 2)
{
gotoxy(i, 0);
printf("■");
gotoxy(i, MAPHEIGHT);
printf("■");
}
for (i = 1; i < MAPHEIGHT; i++)
{
gotoxy(0, i);
printf("■");
gotoxy(MAPWIDTH, i);
printf("■");
}
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
if (food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("*");
snake.len = 3;
snake.speed = 400;
snake.x[0] = MAPWIDTH / 2 + 1;
snake.y[0] = MAPHEIGHT / 2;
gotoxy(snake.x[0], snake.y[0]);
printf("■");
for (i = 1; i < snake.len; i++)
{
snake.x[i] = snake.x[i - 1] + 2;
snake.y[i] = snake.y[i - 1];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
gotoxy(MAPWIDTH - 2, 0);
return;
}
void keyDown()
{
int pre_key = key;
if (_kbhit())
{
fflush(stdin);
key = _getch();
key = _getch();
}
if (changeFlag == 0)
{
gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
printf(" ");
}
for (i = snake.len - 1; i > 0; i--)
{
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
}
if (pre_key == 72 && key == 80)
key = 72;
if (pre_key == 80 && key == 72)
key = 80;
if (pre_key == 75 && key == 77)
key = 75;
if (pre_key == 77 && key == 75)
key = 77;
switch (key)
{
case 75:
snake.x[0] -= 2;
break;
case 77:
snake.x[0] += 2;
break;
case 72:
snake.y[0]--;
break;
case 80:
snake.y[0]++;
break;
}
gotoxy(snake.x[0], snake.y[0]);
printf("■");
gotoxy(MAPWIDTH - 2, 0);
changeFlag = 0;
return;
}
void createFood()
{
if (snake.x[0] == food.x && snake.y[0] == food.y)
{
while (1)
{
int flag = 1;
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
for (i = 0; i < snake.len; i++)
{
if (snake.x[i] == food.x && snake.y[i] == food.y)
{
flag = 0;
break;
}
}
if (flag && food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("*");
snake.len++;
sorce += 10;
snake.speed -= 5;
changeFlag = 1;
}
return;
}
bool snakeStatus()
{
if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)
return false;
if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)
return false;
for (i = 1; i < snake.len; i++)
{
if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
return false;
}
return true;
}
int main()
{
drawMap();
while (1)
{
keyDown();
if (!snakeStatus())
break;
createFood();
Sleep(snake.speed);
}
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);
printf("Game Over!\n");
gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);
printf("本次游戏得分为:%d\n", sorce);
Sleep(5000);
return 0;
}
案例六
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<cstdlib>
#include<ctime>
#include<fstream>
#include<cstring>
#define High 20
#define Width 50
using namespace std;
int Frames[High][Width]={0};
int MoveDirection;
int Food_x,Food_y;
int MaxGrade;
int Grade;
void gotoxy(int x,int y);
void HideCursor();
void Are_you_ready();
void Initialize();
void Show();
void Move();
void KeyPlay();
void SaveMaxGrade();
int main()
{
HideCursor();
Initialize();
Are_you_ready();
while(1)
{
Show();
KeyPlay();
Move();
}
SaveMaxGrade();
return 0;
}
void gotoxy(int x,int y)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void Are_you_ready()
{
for(int i=4;i>=1;i--)
{
system("cls");
cout<<"\n\n\n\t\t请使用方向键玩蛇!";
if(i==1)
{
cout<<"\n\n\n\t\t\tGo!";
Sleep(200);
return ;
}
cout<<"\n\n\n\t\t\t"<<i-1;
Sleep(1000);
}
}
void Initialize()
{
ifstream fin("MaxGrade.txt");
if(!fin)
{
cout<<"MaxGrade.txt 文件打开失败!\n";
}
fin>>MaxGrade;
fin.close();
Grade=0;
int i,j;
for(i=0;i<High;i++)
{
Frames[i][0]=-1;
Frames[i][Width-1]=-1;
}
for(j=0;j<Width;j++)
{
Frames[0][j]=-1;
Frames[High-1][j]=-1;
}
for(i=1;i<=5;i++)
{
Frames[High/2][Width/2-i]=i;
}
MoveDirection = 4;
srand((int)time(NULL));
do
{
Food_x=rand()%(High-5)+4;
Food_y=rand()%(Width-5)+3;
if(Frames[Food_x][Food_y]==0)
{
Frames[Food_x][Food_y]=-2;
break;
}
}while(1);
}
void Show()
{
gotoxy(0,0);
for(int i=0;i<High;i++)
{
for(int j=0;j<Width;j++)
{
if(Frames[i][j]==-1)
{
cout<<"#";
}
else if(Frames[i][j]==0)
{
cout<<" ";
}
else if(Frames[i][j]==1)
{
cout<<"@";
}
else if(Frames[i][j]>1)
{
cout<<"*";
}
else if(Frames[i][j]==-2)
{
cout<<"&";
}
}
cout<<endl;
}
if(Grade>MaxGrade)
{
cout<<"\n\n\n★当前得分: "<<Grade<<"\t★最高分:"<<Grade<<endl;
}
else
{
cout<<"\n\n\n★当前得分: "<<Grade<<"\t★最高分:"<<MaxGrade<<endl;
}
cout<<"\n\n\n★按空格暂停\t★按Esc键退出游戏\n";
if(Grade >= 100&&Grade < 200)
{
Sleep(90);
}
else if(Grade >=200 && Grade <300)
{
Sleep(50);
}
else if(Grade >=300)
{
Sleep(10);
}
else
{
Sleep(200);
}
}
void Move()
{
int i,j,max=0;
int OldTail_i,OldTail_j;
int OldHead_i,OldHead_j;
for(i=1;i<High-1;i++)
{
for(j=1;j<Width-1;j++)
{
if(Frames[i][j]>0)
{
Frames[i][j]++;
if(Frames[i][j]>max)
{
max=Frames[i][j];
OldTail_i=i;
OldTail_j=j;
}
if(Frames[i][j]==2)
{
OldHead_i=i;
OldHead_j=j;
}
}
}
}
int NewHead_i,NewHead_j;
if(MoveDirection==1)
{
NewHead_i=OldHead_i-1;
NewHead_j=OldHead_j;
}
if(MoveDirection==2)
{
NewHead_i=OldHead_i+1;
NewHead_j=OldHead_j;
}
if(MoveDirection==3)
{
NewHead_i=OldHead_i;
NewHead_j=OldHead_j-1;
}
if(MoveDirection==4)
{
NewHead_i=OldHead_i;
NewHead_j=OldHead_j+1;
}
if(Frames[NewHead_i][NewHead_j]==-2)
{
Frames[Food_x][Food_y]=0;
Grade+=10;
do
{
Food_x = rand()%(High-5)+4;
Food_y = rand()%(Width-5)+3;
if(Frames[Food_x][Food_y]==0)
{
Frames[Food_x][Food_y] = -2;
break;
}
}while(1);
}
else
{
Frames[OldTail_i][OldTail_j] = 0;
}
if(Frames[NewHead_i][NewHead_j]>0||Frames[NewHead_i][NewHead_j]==-1)
{
system("cls");
cout<<"\n\n\n\t\t\tGame Over!\n\n\n\n\n\n\n";
Sleep(2000);
system("cls");
cout<<"\n\n\n\t\t\t您的分数:"<<Grade<<endl;
if(Grade>MaxGrade)
{
cout<<"\t\t\t!新纪录!\n";
SaveMaxGrade();
}
Sleep(500);
system("pause");
exit(0);
}
else
{
Frames[NewHead_i][NewHead_j]=1;
}
}
void KeyPlay()
{
if(kbhit())
{
switch(getch())
{
case 224:
switch(getch())
{
case 72:
if(MoveDirection==1||MoveDirection==2)
break;
MoveDirection = 1;break;
case 80:
if(MoveDirection==1||MoveDirection==2)
break;
MoveDirection = 2;break;
case 75:
if(MoveDirection==3||MoveDirection==4)
break;
MoveDirection = 3;break;
case 77:
if(MoveDirection==3||MoveDirection==4)
break;
MoveDirection = 4;break;
}
break;
case 27:
system("cls");
cout<<"\n\n\n\n\t\t\t☆★退出游戏★☆\n\n\n\n";
exit(0);
case 32:
system("cls");
cout<<"\n\n\n\n\t\t\t☆★暂停★☆\n\n\n\n";
cout<<"\n\n\t\t\t";
system("pause");
system("cls");
break;
}
}
}
void SaveMaxGrade()
{
ofstream fout("MaxGrade.txt");
if(!fout)
{
cout<<"MaxGrade.txt 文件打开失败\n";
exit(2);
}if(Grade>MaxGrade)
{
MaxGrade=Grade;
}
fout<<MaxGrade;
fout.close();
}
案例七
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define stop 'p'
typedef struct Snakes
{
int x;
int y;
struct Snakes *next;
}snake;
snake *head,*tail;
struct Food
{
int x;
int y;
}food;
void welcome();
void creatgraph();
void gotoxy(int x,int y);
void gotoprint(int x,int y);
void creatfood();
int ClickControl();
void Finish();
int Judge();
void MovingBody();
void Eating();
void ChangeBody(int a,int b);
char name[20];
int score=0;
char click=1;
int speed;
int main()
{
system("color 0B");
welcome();
creatgraph();
creatfood();
if(ClickControl()==0)
return 0;
return 0;
}
void welcome()
{
gotoxy(35,10);
printf("/********************************************/");
gotoxy(35,22);
printf("/********************************************/");
gotoxy(40,13);
printf("\t欢迎来到贪吃蛇游戏");
gotoxy(35,16);
printf("\t请在英文输入法中操作,w a s d控制,p暂停");
gotoxy(40,19);
printf("\t请输入你的姓名:");
scanf("%s",name);
system("cls");
}
void creatgraph()
{
int i;
for(i=0;i<58;i+=2)
{
gotoprint(i,0);
gotoprint(i,26);
}
for(i=1;i<26;i++)
{
gotoprint(0,i);
gotoprint(56,i);
}
gotoxy(75,10);
printf("你好 %s,欢迎你来玩贪吃蛇!",name);
gotoxy(75,15);
printf("你的分数是:%d = ̄ ω ̄= ",score);
head = (snake*)malloc(sizeof(snake));
head->x=16;
head->y=15;
tail=(snake*)malloc(sizeof(snake));
snake *p=(snake*)malloc(sizeof(snake));
snake *q=(snake*)malloc(sizeof(snake));
p->x=16;
p->y=16;
q->x=16;
q->y=17;
head->next=p;
p->next=q;
q->next=tail;
tail->next=NULL;
}
void gotoprint(int x,int y)
{
gotoxy(x,y);
printf("■");
}
void gotodelete(int x,int y)
{
gotoxy(x,y);
printf(" ");
}
void gotoxy(int x,int y)
{
COORD pos;
HANDLE hOutput;
pos.X=x;
pos.Y=y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void creatfood()
{
srand((int)time(NULL));
lable:
food.y=rand()%(25-1+1)+1;
food.x=rand()%(54-2+1)+2;
if(food.x%2!=0)
{
food.x=food.x+1;
}
snake *judge=head;
while(1)
{
if(judge->next==NULL)break;
if(food.x==judge->x&&food.y==judge->y)
{
goto lable;
}
judge=judge->next;
}
gotoxy(food.x,food.y);
printf("⊙");
}
int ClickControl()
{
char c;
while(1)
{
if(Judge()==0)
return 0;
if(_kbhit())
{
click=_getch();
}
MovingBody();
Eating();
}
return 1;
}
void MovingBody()
{
int count=0;
int a=head->x,b=head->y;
snake *p=head;
while(1)
{
if(p->next==NULL)
break;
gotodelete(p->x,p->y);
count++;
p=p->next;
}
switch(click)
{
case up:
head->y-=1;
ChangeBody(a,b);
break;
case down:
head->y+=1;
ChangeBody(a,b);
break;
case left:
head->x-=2;
ChangeBody(a,b);
break;
case right:
head->x+=2;
ChangeBody(a,b);
break;
case stop:
break;
}
p=head;
while(1)
{
if(p->next==NULL)
break;
gotoprint(p->x,p->y);
p=p->next;
}
p=head;
gotoxy(0,28);
if(count<=10)
speed=150;
else if(count>10&&count<=20)
speed=120;
else if(count>20&&count<=40)
speed=80;
else speed =60;
Sleep(speed);
}
void Eating()
{
if(head->x==food.x&&head->y==food.y)
{
creatfood();
snake *_new=(snake*)malloc(sizeof(snake));
snake *p;
p=head;
while(1)
{
if(p->next->next==NULL)
break;
p=p->next;
}
p->next=_new;
_new->next=tail;
score+=10;
gotoxy(77,15);
printf("%d",score);
}
}
void ChangeBody(int a,int b)
{
snake *p=head->next;
int mid1,mid2,_mid1,_mid2;
mid1=p->x;
mid2=p->y;
while(1)
{
if(p->next->next==NULL)
break;
_mid1=p->next->x;
_mid2=p->next->y;
p->next->x=mid1;
p->next->y=mid2;
mid1=_mid1;
mid2=_mid2;
p=p->next;
}
p=head->next;
{
p->x=a;
p->y=b;
}
}
void Finish()
{
system("cls");
gotoxy(15,10);
printf("/*******************************************/");
gotoxy(15,20);
printf("/*******************************************/");
gotoxy(18,14);
printf("\t\t游戏结束!");
gotoxy(20,16);
printf("\t你的分数是 %d 继续努力吧!",score);
gotoxy(0,27);
system("pause");
}
int Judge()
{
if(head->x==0||head->x==56||head->y==0||head->y==26)
{
Finish();
return 0;
}
snake *p=head->next;
while(1)
{
if(p->next==NULL)
break;
if(head->x==p->x&&head->y==p->y)
{
Finish();
return 0;
}
p=p->next;
}
return 1;
}
案例八
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#ifndef __cplusplus
typedef char bool;
#define false 0
#define true 1
#endif
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, coord);
}
#define ss 100
#define mw 78
#define mh 24
struct food{
int x;
int y;
}food;
struct snake{
int speed;
int len;
int x[ss];
int y[ss];
}snake;
void drawMap();
void createFood();
void keyDown();
bool snakeStatus();
int bestsorce();
void gotoxy(int x, int y);
int key = 72;
int changeFlag = 0;
int sorce = 0;
int i;
void zhushi()
{
gotoxy(mw + 8, mh / 2 - 4);
printf("游戏说明\n");
gotoxy(mw + 8, mh / 2 -3);
printf("1.吃东西蛇速度在加快,\n");
gotoxy(mw + 8, mh / 2 - 2);
printf("2.该游戏通过控制蛇头方向吃东西\n");
gotoxy(mw + 8, mh / 2 -1);
printf("从而使得蛇变得越来越长。\n");
gotoxy(mw + 8, mh / 2);
printf("历史最高分%lld",bestsorce());
}
void drawMap()
{
for (i = 0; i <= mw; i += 2)
{
gotoxy(i, 0);
printf("■");
gotoxy(i, mh);
printf("■");
}
for (i = 1; i < mh; i++)
{
gotoxy(0, i);
printf("■");
gotoxy(mw, i);
printf("■");
}
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (mw - 4) + 2;
food.y = rand() % (mh - 2) + 1;
if (food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("*");
snake.len = 3;
snake.speed = 300;
snake.x[0] = mw / 2 + 1;
snake.y[0] = mh / 2;
gotoxy(snake.x[0], snake.y[0]);
printf("■");
for (i = 1; i < snake.len; i++)
{
snake.x[i] = snake.x[i - 1] + 2;
snake.y[i] = snake.y[i - 1];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
gotoxy(mw - 2, 0);
return;
}
void keyDown()
{
int w_key = key;
if (kbhit())
{
fflush(stdin);
key = getch();
key = getch();
}
if (changeFlag == 0)
{
gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
printf(" ");
}
for (i = snake.len - 1; i > 0; i--)
{
snake.x[i] = snake.x[i - 1];
snake.y[i] = snake.y[i - 1];
}
if (w_key == 72 && key == 80)
key = 72;
if (w_key == 80 && key == 72)
key = 80;
if (w_key == 75 && key == 77)
key = 75;
if (w_key == 77 && key == 75)
key = 77;
switch (key)
{
case 75:
snake.x[0] -= 2;
break;
case 77:
snake.x[0] += 2;
break;
case 72:
snake.y[0]--;
break;
case 80:
snake.y[0]++;
break;
}
gotoxy(snake.x[0], snake.y[0]);
printf("■");
gotoxy(mw - 2, 0);
changeFlag = 0;
return;
}
void createFood()
{
if (snake.x[0] == food.x && snake.y[0] == food.y)
{
while (1)
{
int flag = 1;
srand((unsigned int)time(NULL));
food.x = rand() % (mw - 4) + 2;
food.y = rand() % (mh - 2) + 1;
for (i = 0; i < snake.len; i++)
{
if (snake.x[i] == food.x && snake.y[i] == food.y)
{
flag = 0;
break;
}
}
if (flag && food.x % 2 == 0)
break;
}
gotoxy(food.x, food.y);
printf("*");
snake.len++;
sorce += 10;
snake.speed -= 5;
changeFlag = 1;
}
return;
}
int bestsorce()
{
static long long int w=0;
long long int max = 0;
if(sorce > w) max = sorce;
else(max = w);
w = max;
sorce = 0;
return max;
}
bool snakeStatus()
{
if (snake.y[0] == 0 || snake.y[0] == mh)
return false;
if (snake.x[0] == 0 || snake.x[0] == mw)
return false;
for (i = 1; i < snake.len; i++)
{
if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
return false;
}
return true;
}
void youxi()
{
system("cls");
drawMap();
zhushi();
while (1)
{
keyDown();
if (!snakeStatus())
break;
createFood();
Sleep(snake.speed);
}
gotoxy(mw / 2, mh / 2);
printf("游戏结束!!!!\n");
gotoxy(mw / 2, mh / 2 + 1);
printf("本次游戏得分为:%d\n", sorce);
Sleep(3000);
}
int main()
{
youxi();
do
{
char i;
gotoxy(mw + 8, mh / 2 + 1);
printf("1.按 1 键继续 2.按 0 退出 ");
gotoxy(mw + 8, mh / 2 + 2);
printf("请输入:");
scanf("%d",&i);
if(i==0)exit(0);
else(youxi());
}while(1);
return 0;
}
案例九
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
#include<conio.h>
#define h 30
#define k 30
#include<pthread.h>
int num1=0,num2=0;
void gotoxy(int x,int y)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(handle,coord);
}
void map()
{
for(int i=1;i<h;i++)
{
gotoxy(0,i);
printf("■");
gotoxy(60,i);
printf("■");
}
for(int i=0;i<k+1;i++)
{
gotoxy(i,0);
puts("■");
gotoxy(i,30);
printf("■");
}
}
struct snake{
int sx[50];
int sy[50];
int speed;
int length;
}snake1,snake2;
void firstonesnake()
{
snake1.speed=1000;
snake1.length=3;
snake1.sx[0]=30;
snake1.sy[0]=15;
gotoxy(snake1.sx[0],snake1.sy[0]);
printf("◆");
for(int i=0;i<snake1.length-1;i++)
{
snake1.sy[i+1]=snake1.sy[i]+1;
snake1.sx[i+1]=snake1.sx[i];
gotoxy(snake1.sx[i+1],snake1.sy[i+1]);
printf("■");
}
}
void firsttwosnake()
{
snake1.speed=1000;
snake2.speed=1000;
snake1.length=3;
snake2.length=3;
snake1.sx[0]=14;
snake1.sy[0]=15;
snake2.sx[0]=46;
snake2.sy[0]=15;
gotoxy(snake1.sx[0],snake1.sy[0]);
printf("◆");
gotoxy(snake2.sx[0],snake2.sy[0]);
printf("◆");
for(int i=0;i<snake1.length-1;i++)
{
snake1.sy[i+1]=snake1.sy[i]+1;
snake1.sx[i+1]=snake1.sx[i];
gotoxy(snake1.sx[i+1],snake1.sy[i+1]);
printf("■");
}
for(int i=0;i<snake2.length-1;i++)
{
snake2.sy[i+1]=snake2.sy[i]+1;
snake2.sx[i+1]=snake2.sx[i];
gotoxy(snake2.sx[i+1],snake2.sy[i+1]);
printf("■");
}
}
struct food{
int x;
int y;
}food1,food2;
void creat_foodup()
{
srand(time(NULL));
loop:{
int s1=0,s2=0;
food1.x=rand()%(k-4)+2;
food1.y=rand()%(h-2)+1;
for(int i=0;i<snake1.length;i++)
{
if(snake1.sx[i]==food1.x&&snake1.sy[i]==food1.y)
{
s1=1;
}
}
for(int i=0;i<snake2.length;i++)
{
if(snake2.sx[i]==food1.x&&snake2.sy[i]==food1.y)
{
s2=1;
}
}
if(food1.x%2!=0)
{
s1=1;
}
if(s1==1||s2==1)
goto loop;
gotoxy(food1.x,food1.y);
printf("★");}
}
void creat_foodre()
{
srand(time(NULL));
toop:{
int s1=0,s2=0;
food2.x=rand()%(k-4)+2;
food2.y=rand()%(h-2)+1;
for(int i=0;i<snake1.length;i++)
{
if(snake1.sx[i]==food2.x&&snake1.sy[i]==food2.y)
{
s1=1;
}
}
for(int i=0;i<snake2.length;i++)
{
if(snake2.sx[i]==food2.x&&snake2.sy[i]==food2.y)
{
s2=1;
}
}
if(food1.x==food2.x&&food1.y==food2.y)
s1=1;
if(food2.x%2!=0)
{
s1=1;
}
if(s1==1||s2==1)
goto toop;
gotoxy(food2.x,food2.y);
printf("☆");}
}
void eat_foodone()
{
if(snake1.sx[0]==food1.x&&snake1.sy[0]==food1.y)
{
snake1.length++;
num1++;
creat_foodup();
}
if(snake1.sx[0]==food2.x&&snake1.sy[0]==food2.y)
{
gotoxy(snake1.sx[snake1.length-1],snake1.sy[snake1.length-1]);
printf(" ");
snake1.length--;
num1--;
creat_foodre();
}
}
int onesnakedead()
{
int jkl=0;
for(int i=1;i<snake1.length;i++)
{
if(snake1.sx[0]==snake1.sx[i]&&snake1.sy[0]==snake1.sy[i])
jkl=1;
}
if(snake1.sx[0]==60||snake1.sx[0]==0||snake1.sy[0]==0||snake1.sy[0]==30||snake1.length==1||jkl==1)
{
gotoxy(29,14);
printf("你没了");
gotoxy(27,15);
printf("再来一局");
gotoxy(27,16);
printf("回到菜单");
char aa,bb;
int dx=36,dy=15;
while(1)
{
gotoxy(dx,dy);
printf("←");
bb=getch();
if(bb!='\r')
{
aa=getch();
gotoxy(dx,dy);
printf(" ");
if(aa==72||aa==80)
{
switch(aa)
{
case 72:dy--;break;
case 80:dy++;break;
}
if(dy>16)
{
dy--;
}
else if(dy<15)
{
dy++;
}
}
}
else
return dy;
}
}
else
return 1;
}
void eat_foodtwo()
{
if(snake1.sx[0]==food1.x&&snake1.sy[0]==food1.y)
{
snake1.length++;
num1++;
creat_foodup();
}
if(snake1.sx[0]==food2.x&&snake1.sy[0]==food2.y)
{
gotoxy(snake1.sx[snake1.length-1],snake1.sy[snake1.length-1]);
printf(" ");
snake1.length--;
num1--;
creat_foodre();
}
if(snake2.sx[0]==food1.x&&snake2.sy[0]==food1.y)
{
snake2.length++;
num2++;
creat_foodup();
}
if(snake2.sx[0]==food2.x&&snake2.sy[0]==food2.y)
{
gotoxy(snake2.sx[snake2.length-1],snake2.sy[snake2.length-1]);
printf(" ");
snake2.length--;
num2--;
creat_foodre();
}
}
char key2='5';
void keydown2()
{
int check2;
int i='5',j='1',o='2',l='3';
if (kbhit())
{
check2 = getch();
if(check2==i||check2==j||check2==o||check2==l)
{
key2=(char)check2;
}
}
gotoxy(snake2.sx[snake2.length-1],snake2.sy[snake2.length-1]);
printf(" ");
for(int i=snake2.length-1;i>0;i--)
{
snake2.sx[i]=snake2.sx[i-1];
snake2.sy[i]=snake2.sy[i-1];
}
switch(key2)
{
case '5':snake2.sy[0]--;break;
case '1':snake2.sx[0]--;snake2.sx[0]--;break;
case '2':snake2.sy[0]++;break;
case '3':snake2.sx[0]++;snake2.sx[0]++;break;
default:break;
}
}
void gosnake2()
{
gotoxy(snake2.sx[0],snake2.sy[0]);
printf("◆");
for(int i=1;i<snake2.length;i++)
{
gotoxy(snake2.sx[i],snake2.sy[i]);
printf("■");
}
}
void *snake222(void *arg)
{
keydown2();
gosnake2();
}
char key1={'w'};
void keydown1()
{
int check1;
int z='w',x='W',c='a',v='A',b='s',n='S',m='d',u='D';
if (kbhit())
{
check1 = getch();
if(check1==z||check1==x||check1==c||check1==v||check1==b||check1==n||check1==m||check1==u)
{
key1=(char)check1;
}
}
gotoxy(snake1.sx[snake1.length-1],snake1.sy[snake1.length-1]);
printf(" ");
for(int i=snake1.length-1;i>0;i--)
{
snake1.sx[i]=snake1.sx[i-1];
snake1.sy[i]=snake1.sy[i-1];
}
switch(key1)
{
case 'w':
case 'W':snake1.sy[0]--;break;
case 'a':
case 'A':snake1.sx[0]--;snake1.sx[0]--;break;
case 's':
case 'S':snake1.sy[0]++;break;
case 'd':
case 'D':snake1.sx[0]++;snake1.sx[0]++;break;
default:break;
}
}
void gosnake1()
{
gotoxy(snake1.sx[0],snake1.sy[0]);
printf("◆");
for(int i=1;i<snake1.length;i++)
{
gotoxy(snake1.sx[i],snake1.sy[i]);
printf("■");
}
}
void snake1_speed()
{
if(snake1.length>4&&snake1.length<8)
snake1.speed=750;
if(snake1.length>7&&snake1.length<10)
snake1.speed=500;
}
void *snake111(void *arg)
{
keydown1();
onesnakedead();
gosnake1();
}
int welcome()
{
gotoxy(50,10);
printf("贪吃蛇小游戏");
gotoxy(52,11);
printf("单人模式");
gotoxy(52,12);
printf("双人模式");
gotoxy(52,13);
printf("退出游戏");
int wx=60,wy=11;
char aa,bb;
while(1)
{
gotoxy(wx,wy);
printf("←");
bb=getch();
if(bb!='\r')
{
aa=getch();
gotoxy(wx,wy);
printf(" ");
if(aa==72||aa==80)
{
switch(aa)
{
case 72:wy--;break;
case 80:wy++;break;
}
if(wy>13)
{
wy--;
}
else if(wy<11)
{
wy++;
}
}
}
else
return wy;
}
}
int main()
{
system("color 0b");
pthread_t th1,th2;
qqq:{
int choose;
system("cls");
choose=welcome();
if(choose==11)
{
ttt:
{
num1=0;
key1='w';
system("cls");
int zzz;
map();
firstonesnake();
creat_foodup();
creat_foodre();
while(1)
{
gotoxy(0,0);
printf("■");
gotoxy(32,0);
printf("■");
snake1_speed();
Sleep(snake1.speed);
keydown1();
zzz=onesnakedead();
gotoxy(70,14);
printf("得分:%d",num1);
if(zzz==15)
{
goto ttt;
}
else if(zzz==16)
{
goto qqq;
}
gosnake1();
eat_foodone();
}
}
}
if(choose==12)
{
www:{
system("cls");
map();
firsttwosnake();
creat_foodup();
creat_foodre();
while(1)
{
Sleep(snake1.speed);
pthread_create(&th1,NULL,snake111,NULL);
Sleep(100);
Sleep(snake2.speed);
pthread_create(&th2,NULL,snake222,NULL);
eat_foodtwo();
}
}
}
if(choose==13)
{
system("cls");
gotoxy(52,12);
printf("bye");
gotoxy(0,28);
}
}
}