正文
c语言贪吃蛇暂停函数 c语言程序贪吃蛇如何运行
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
请问这个C语言的贪吃蛇如何增加暂停和继续功能?还有,怎么实现保存和读取记录?
你的程序在哪里?
我来说一下我的思路吧,仅限于二维的贪吃蛇地图。
首先创建一张地图,地图上的每一个点都可以用一个坐标来表示。
然后给蛇来建模,蛇的属性可以复用地图的属性,就是他在地图上占用的坐标。还有额外要保存一个蛇头的位置和蛇的前进方向。
蛇的运动可以用一个定时器来表示,定时器每一次到时都向前进方向增加一个坐标。至于暂停功能,就可以对应于停止定时器,继续功能就是启动定时器。
保存功能就是将蛇的所有属性保存到一个文件中,读取记录就是从文件中读取所有的蛇的属性,再放到地图上就可以了。
不知道我说的是否明白。
c语言编程贪吃蛇时,怎么让它暂停
getchar()//让用户输入一个字符 需要stdio.h
或者 system("pause"); //暂停 需要stdlib.h
c语言贪吃蛇的速度控制程序怎么编
可以Sleep函数设置延时来控制贪吃蛇的速度。
函数名: Sleep
功 能: 执行挂起一段时间
用 法: void Sleep(DWORD dwMilliseconds);
在VC中使用带上头文件
#include windows.h
( Sleep函数存放头文件:WinBase.h)
在gcc编译器中,使用的头文件因gcc版本的不同而不同
#include unistd.h
Sleep()单位为毫秒,sleep()单位为秒(如果需要更精确可以用usleep单位为微秒)
返回值
若进程/线程挂起到参数所指定的时间则返回0,若有信号中断则返回剩余秒数。
例程:
/ *--------------------snake.h --------------------*/
#ifndef SNAKE_H
#define SNAKE_H
#define LEFT 'a'
#define RIGHT 'd'
#define DOWN 's'
#define UP 'w'
#define ESC 27
#define N 200 /*蛇的最大长度*/
char key; /*控制按键*/
struct Food
{
int x; /*食物的横坐标*/
int y; /*食物的纵坐标*/
int yes; /*判断是否要出现食物的变量*/
}food; /*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node; /*蛇的节数*/
int direction; /*蛇移动方向*/
int life; /* 蛇的生命,0活着,1死亡*/
}snake;
#endif
/ *--------------------snake.c --------------------*/
#include graphics.h
#include stdlib.h
#include conio.h
#include time.h
#include stdio.h
#include "snake.h"
int score = 0;
int gamespeed = 100; //蛇运行速度
static void Init(void); /*图形驱动*/
static void Close(void); /*图形结束*/
static void Game_interface(void); /*游戏界面*/
static void GameOver(void); /*结束游戏*/
static void GamePlay(void); /*游戏过程*/
static void PrScore(void); /*输出成绩*/
/*主函数*/
int main(void)
{
Init();
Game_interface();
GamePlay();
Close();
return 0;
}
/*图形驱动*/
static void Init(void)
{
int gd=9,gm=2;
initgraph(gd,gm," ");
cleardevice();
}
/* 开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 */
static void Game_interface(void)
{
int i;
setcolor(LIGHTCYAN); /*setbkcolor(LIGHTGREEN);*/
setlinestyle(PS_SOLID,0,1); /*设置线型*/
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); /*右边框*/
}
}
/* 游戏主函数 */
static void GamePlay(void)
{
int i;
srand(time(NULL)); /*随机数发生器*/
food.yes = 1; /*1表示需要出现新食物,0表示已经存在食物*/
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) /*可以重复玩游戏,压ESC键结束*/
{
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];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
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.x) (snake.y[0] == food.y)) /*吃到食物以后*/
{
setcolor(BLACK); /*把画面上的食物东西去掉*/
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(RED); /*画出蛇*/
for(i=0;isnake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
Sleep(gamespeed); /*用延迟控制贪吃蛇速度*/
setcolor(BLACK); /*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life == 1) /*如果蛇死就跳出循环*/
break;
key=getch(); /*接收按键*/
if (key == ESC) break; /*按ESC键退出*/
switch(key)
{
case UP:
if(snake.direction != 4) /*判断是否往相反的方向移动*/
snake.direction = 3;
break;
case RIGHT:
if(snake.direction != 2)
snake.direction = 1;
break;
case LEFT:
if(snake.direction != 1)
snake.direction = 2;
break;
case DOWN:
if(snake.direction != 3)
snake.direction = 4;
break;
}
}/*endwhile(1)*/
}
/*游戏结束*/
static void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
setfont(56,0,"黑体");
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
static void PrScore(void)
{
char str[10];
setfillstyle(YELLOW);
bar(50,15,220,35);
setcolor(BROWN);
setfont(16,0,"宋体");
sprintf(str,"score:%d",score);
outtextxy(55,16,str);
}
static void Close(void)
{
closegraph();
}
怎么改这个贪食蛇代码(c语言),有点变化,并能解释通就行。
我写好的c语言贪吃蛇暂停函数,c语言贪吃蛇暂停函数你看你要不要:
/*贪吃蛇*/
/**********************重要思想******************************************************/
//以二维数组为游戏界面。
//通过改变二维数组中指定元素的值实现对事物和蛇的显示和变化
#includestdio.h
#includestdlib.h
#includetime.h
#includeconio.h
#define SHEAD '@'
#define SBODY ''
#define FOOD '*'
/*************************************关键变量全局声明**********************************************/
const int L=20;
const int H=20; //定义界面的长 和 高
char view[20][20]={' '};//定义界面
int botton; //记录上下左右的操作
int length=1; //蛇的长度,默认为1只有蛇头(蛇头用@表示)
int end=0; //游戏结束条件,1是结束
int sbl=0; //定义蛇身的长度
int speed_time=300; //sleep(speed_time)
int speed_point=0; //用作速度增加提示
int pause_point=-1; //暂停标识,为1代表暂停
struct snake
{
int s_x;
int s_y;
int direction;//存蛇该节点运动的方向 上1 下2 左3 右4
}snake[20*20];
/*********************************函数声明**********************************************************/
void display(); //界面显示主菜单
void instruct(); //界面显示介绍
void runit(); //游戏启动
void init_view();//游戏界面初始化。就是把二维数组的所有元素都赋值为空格,并显示出来
void Creat_food(); //创建一个食物
void Get_button(); //获取方向键
void start();
void move();
void Check_bound();
void Check_self();
void choose_diff();//选择难度
void display()
{
int i;
printf("********************贪吃蛇v2.0(第一版升级版)************************\n");
printf(" 1.游戏说明 \n");
printf(" 2.开始吧 \n");
printf(" 3.残忍的离开... \n");
printf("----------------------------------------------------------\n");
printf("你要做什么呢: ");
scanf("%d",i);
switch(i)
{
case 1:instruct();break;
case 2:choose_diff();break;
case 3:exit(0);break;
default:
system("cls");
printf("都不知道你在说什么--\n");
display();
}
}
void instruct()
{
system("cls");
printf("------------------------------------------------------\n");
printf("游戏名称:贪吃蛇(v2.0)\n");
printf("版本:v2.0(功能实现版)");
printf("BY 申济铨\n");
printf("开发开始日期:2014-4-17\n");
printf("-------------------版本说明------------------------\n");
printf("1.游戏中可以暂停\n");
printf("2.游戏中蛇的移动速度回增加并有提示\n");
printf("3.实现难度选择\n");
// printf("4.截屏分享\n");
printf("4.为后续版本提供支持\n");
printf("输入回车以返回主菜单?");
if(getchar()=='\n');
while(getchar()=='\n')
{
system("cls");
display();
}
}
void choose_diff()
{
int c;
printf("----------------难度选择------------------------\n");
printf("1.初级\n");
printf("2.中级\n");
printf("3.高级\n");
printf("4.骨灰级\n");
printf("请输入序号:\n");
scanf("%d",c);
while(c4||c1)
{
printf("不识数啊。。。重新输:\n");
scanf("%d",c);
}
speed_time-=(50*(c-1));
runit();
}
void init_view()
{
int i=0;
int j=0;
printf("----------------------\n");
for(i;iL;i++)
{
printf("|");
for(j;jH;j++)
{
printf("%c",view[i][j]);
}
j=0;
printf("|");
if(i==L/2)
{
printf(" 回车可以暂停!");
}
printf("\n");
}
printf("----------------------\n");
}
void Creat_food()
{
int x;
int y;
while(1)
{
x=rand()%(L-1);
y=rand()%(H-1);
if(view[x][y]==' ');
{
break;
}
}
view[x][y]=FOOD;
}
void Get_button() //前提是必须先读入一个字符
{
while(kbhit()!=0)
{
botton=getch();
switch (botton)
{
case 75:snake[0].direction=1;break; //上
case 77:snake[0].direction=2;break; //下
case 72:snake[0].direction=3;break; //左
case 80:snake[0].direction=4;break; //右
case 13:pause_point*=-1;
}
if(pause_point!=-1) //游戏暂停
{
pause_point*=-1;
system("pause");
}
}
}
void runit()
{
int sx,sy;
int i,j;
for(i=0;iH;i++) //界面初始化
{
for(j=0;jL;j++)
{
view[H][L]=' ';
}
}
system("cls");
srand(time(0));
sx=rand()%(L-1);
sy=rand()%(H-1);
snake[0].s_x=sx;
snake[0].s_y=sy;
snake[0].direction=1; //默认假设蛇头向上运动
view[sx][sy]=SHEAD;
Creat_food();
init_view();
printf("任意方向键开始!\n");
getch(); //先读一个字符,骗他,不然执行到Get_button()的时候跳过去按默认值执行,为了让程序一开始不自动动
}
/******************************关键的3个函数*******************************************/
void Check_bound()
{
if((snake[0].s_x0)||(snake[0].s_x=H))
{
end=1;
}
if((snake[0].s_y0)||(snake[0].s_y=L))
{
end=1;
}
}
void Check_self()
{
if(view[snake[0].s_x][snake[0].s_y]==SBODY)//结束条件。全局变量。作用在start函数。
{
end=1;
}
}
void move()
{
int i=1;
int tmp_x=snake[sbl].s_x;
int tmp_y=snake[sbl].s_y;
int x_0=snake[0].s_x;
int y_0=snake[0].s_y;
view[snake[0].s_x][snake[0].s_y]=' ';
switch(snake[0].direction)//判断蛇移动的方向并改变蛇头位置
{
case 1:snake[0].s_y-=1;break;
case 2:snake[0].s_y+=1;break;
case 3:snake[0].s_x-=1;break;
case 4:snake[0].s_x+=1;break;
}
Check_bound();
Check_self();
if(end==1)
{
printf("你死了\n");
return ;
}
if(view[snake[0].s_x][snake[0].s_y]==FOOD)
{
length++;
sbl+=1;
snake[sbl].direction=snake[0].direction;
snake[sbl].s_x=x_0;
snake[sbl].s_y=y_0;
view[snake[sbl].s_x][snake[sbl].s_y]=SBODY;
Creat_food();
}
else
{
if(sbl!=0)
{
if(sbl==1)
{
view[snake[1].s_x][snake[1].s_y]=' ';
snake[1].s_x=x_0;
snake[1].s_y=y_0;
view[snake[1].s_x][snake[1].s_y]=SBODY;
}
else
{view[snake[1].s_x][snake[1].s_y]=' ';
for(i;isbl;i++)
{
snake[i].s_x=snake[i+1].s_x;
snake[i].s_y=snake[i+1].s_y;
view[snake[i].s_x][snake[i].s_y]=SBODY;
}
snake[sbl].s_x=x_0;
snake[sbl].s_y=y_0;
view[snake[sbl].s_x][snake[sbl].s_y]=SBODY;
}
}
else
{
view[snake[sbl].s_x][snake[sbl].s_y]=' ';
}
}
view[snake[0].s_x][snake[0].s_y]=SHEAD;
}
void start()
{
int i=0;//后续版本使用
int j=0;
while(1)
{
_sleep(speed_time-5*(length/5));
if(speed_point!=(length/5))
{
speed_point=(length/5);
printf("速度增加了哦!\n");
_sleep(1000);
}
Get_button();
move();
if(end==1)
{
system("cls");
printf("死得好!!\n");
printf("再见!!\n");
_sleep(2000);
for(i=0;iL;i++)
{
for(j=0;jH;j++)
{
view[i][j]=' ';
}
}
for(i=0;ilength;i++)
{
snake[i].s_x=0;
snake[i].s_y=0;
}
length=0;
sbl=0;
end=0;
speed_time=300;
display();
}
system("cls");
init_view();
printf("任意方向键开始!");
}
}
int main()
{
display();
start();
return 0;
}
我在c语言里编了贪吃蛇游戏,我怎么用空格键实现游戏暂停和继续啊
给c语言贪吃蛇暂停函数你个思路把。c语言贪吃蛇暂停函数我用c# 编写c语言贪吃蛇暂停函数的,
如果c语言贪吃蛇暂停函数你使用的timer来做的话c语言贪吃蛇暂停函数,首先定一个全局变量bool isPause=false;
来控制
有没有可以帮我写c语言贪吃蛇的代码 cmd运行的
//code by wlfryq 71693456@qq.com
#include stdio.h
#include stdlib.h
#include conio.h
#include windows.h
#include time.h
#include direct.h
#include stdbool.h
#define W 80 //屏幕宽度
#define H 37 //屏幕高度
#define SNAKE_ALL_LENGTH 200 //蛇身最长为
void CALLBACK TimerProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime);
void start();
struct MYPOINT
{
int x;
int y;
} s[SNAKE_ALL_LENGTH] , head, end, food;
int max_count=0; //历史最高分,如果countmax_count, 则max_count=count
int old_max_count=0; //历史最高分,不会变动, 用于死亡时判断max_count是否大于old_max_count,如果大于,则写入文件
int count=0; //得分
int len=20; //当前蛇身长度
int direct=0; //方向: 0-向右, 1-向下, 2-向左, 3-向上
int speed=200; //速度:毫秒
bool isfood=false; //食物是否存在
int timerID;
bool stop=false; //暂停
char* ini_path; //数据文件绝对路径
void setxy(int x, int y) //设置CMD窗口光标位置
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void hide_cursor() //隐藏CMD窗口光标
{
CONSOLE_CURSOR_INFO cci;
cci.bVisible = FALSE;
cci.dwSize = sizeof(cci);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, cci);
}
void set_food() //设置食物坐标
{
if(isfood==true)
{
return;
}
int x,y,i;
bool flag=false;
while(1)
{
flag=false;
x=rand()%(W-14)+6;
y=rand()%(H-12)+6;
for(i=0;ilen;i++) //判断食物是否落在蛇身上
{
if(s[i].x==x s[i].y==y)
{
flag=true;
break;
}
}
if(flag==true)
{
continue;
}
else
{
food.x=x;
food.y=y;
break;
}
}
setxy(food.x,food.y);
printf("*");
isfood=true;
}
void check_board() //检测蛇身是否越界和相交
{
int i;
if(s[0].x=W-3 || s[0].x=2 || s[0].y=H-1 || s[0].y=2)
{
setxy(W/2-5,0);
printf("game over\n");
stop=true;
if(old_max_countmax_count)
{
char t[5]={'\0'};
sprintf(t,"%d",max_count);
WritePrivateProfileString("MAX_COUNT","max_count",t,ini_path);
}
}
for(i=1;ilen;i++)
{
if(s[i].x==s[0].x s[i].y==s[0].y)
{
setxy(W/2-5,0);
printf("game over\n");
stop=true;
if(old_max_countmax_count)
{
char t[5]={'\0'};
sprintf(t,"%d",max_count);
WritePrivateProfileString("MAX_COUNT","max_count",t,ini_path);
}
break;
}
}
if(stop==true)
{
KillTimer(NULL,timerID);
int c;
while(1)
{
fflush(stdin);
c=_getch();
if(c=='n' || c=='N')
{
start();
}
else if(c=='q' || c=='Q')
{
exit(0);
}
else continue;
}
}
}
void printf_body(bool is_first) //打印蛇身
{
if(is_first==true) //如果是第一次打印蛇身
{
int i;
for(i=0;ilen;i++)
{
setxy(s[i].x,s[i].y);
printf("O");
}
}
else //如果不是第一次打印蛇身
{
setxy(end.x,end.y);
printf(" ");
setxy(s[0].x,s[0].y);
printf("O");
}
if(food.x==s[0].x food.y==s[0].y) //如果吃到食物
{
count++;
isfood=false; //重置食物
set_food();
len++;
KillTimer(NULL,timerID);
if(speed100) speed-=10;
else if(speed50) speed-=5;
else if(speed30) speed-=2;
else if(speed16) speed-=1;
else ;
setxy(0,0);
if(max_countcount) max_count=count;
printf(" speed : %d ms score : %d best score:%d ",speed,count,max_count);
timerID=SetTimer(NULL,001,speed,TimerProc);
}
}
void change_body_pos(int x, int y) //改变蛇身的坐标数据
{
end.x=s[len-1].x;
end.y=s[len-1].y;
int i;
for(i=len-1;i0;i--)
{
s[i].x=s[i-1].x;
s[i].y=s[i-1].y;
}
s[0].x=x;
s[0].y=y;
}
void CALLBACK TimerProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime)
{
switch(direct)
{
case 0:
head.x++;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
case 1:
head.y++;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
case 2:
head.x--;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
case 3:
head.y--;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
}
}
void start()
{
int i;
KillTimer(NULL,timerID);
count=0; //得分
len=20; //当前蛇身长度
direct=0; //方向: 0-向右, 1-向下, 2-向左, 3-向上
speed=200; //速度:毫秒
isfood=false; //食物是否存在
stop=false; //停止
system("cls");
setxy(1,4);
printf("┌─────────────────────────────────────┐\n");
for(i=0;i33;i++)
{
printf(" │ │\n");
}
printf(" └─────────────────────────────────────┘");
head.x=len-1+5;
head.y=H/2;
for(i=0;ilen;i++)
{
s[i].x=head.x-i;
s[i].y=head.y;
}
setxy(0,0);
printf(" speed : %d:ms score : %d best score:%d ",speed,count,max_count);
printf_body(true);
set_food();
timerID=SetTimer(NULL,001,speed,TimerProc);
int c;
MSG msg;
while(GetMessage(msg,NULL,0,0))
{
if(stop==true) break;
if(_kbhit()) //如果按下的是方向键或功能键, _getch()要调用两次,第一次返回0XE0或0
{
fflush(stdin);
c=_getch(); //上: 72 下:80 左:75 右:77
if(c==0XE0 || c==0)
{
c=_getch();
if(c==72 direct!=1 direct!=3)
{
direct=3;
}
else if(c==80 direct!=1 direct!=3)
{
direct=1;
}
else if(c==75 direct!=0 direct!=2)
{
direct=2;
}
else if(c==77 direct!=0 direct!=2)
{
direct=0;
}
}
else if(c==' ')
{
setxy(W/2-10,0);
system("pause");
setxy(W/2-10,0);
printf(" ");
}
}
if(msg.message==WM_TIMER)
{
DispatchMessage(msg);
}
}
}
int main()
{
ini_path=(char*)malloc(sizeof(char)*50);
srand((unsigned)time(0));
getcwd(ini_path,50);//取得当前程序绝对路径
ini_path=strcat(ini_path,"snake.dat");
max_count=GetPrivateProfileInt("MAX_COUNT","max_count",0,ini_path);
old_max_count=max_count;
char cmd[50];
sprintf(cmd,"mode con cols=%d lines=%d\0",W,H);
system(cmd);//改变CMD窗口大小
hide_cursor();
start();
return 0;
}
c语言贪吃蛇暂停函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言程序贪吃蛇如何运行、c语言贪吃蛇暂停函数的信息别忘了在本站进行查找喔。