贪吃蛇c++语言程序,利用C/C++实现较完整贪吃蛇游戏

本文详细介绍了如何使用C++语言在DOS环境下编写贪吃蛇游戏。通过自定义gotoxy函数控制字符移动,并利用kbhit()非阻塞函数实现游戏过程中实时接收用户输入,同时解决字符移动与等待输入同步的问题。文章涵盖了结构体、随机数生成、键盘输入检测等基础知识,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇。于是本人利用空余时间写出了这么一个简单的小游戏。

由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行。那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动。那么我们就先来实现这个函数。

gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用。

gotoxy.h

#include

void gotoxy(int x,int y)

{

COORD pos;

pos.X = x - 1;

pos.Y = y - 1;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

现在我们已经能够利用 gotoxy 函数对指针进行控制,那么实现字符的移动则只需将原来位置的字符清除,然后利用此函数移动指针到想去的坐标后打印字符即可。

在对此函数进行测试的时候,我发现了一个重要的问题,因为代码是一行一行的运行,那么在等待我输入方向的时候,其他代码是无法执行的,这意味这我的蛇只能是我给一下方向它移动一下,那么该如何使得字符在等待我输出方向的同时自行移动呢???对于这个问题有两个解决方案:一、创建线程(对于当时的我来说线程还很陌生) 二、利用 kbhit() 非阻塞函数(百度一下,你就知道)。当然我选择的是第二个方案,再配合使用 getch() 函数即可完美实现方向的输入。

该游戏的两个难点都解决了,话不多说 ↓

(由于没有涉及什么算法,加之年少,代码显得过于冗长)

这里主要运用到的知识有这些:结构体,srand(), rand(), kbhit(), getch(), Sleep().

/*******************http://blog.csdn.net/lcsy000**********************/

#include

#include"gotoxy.h"

#include

#include

#include

using namespace std;

char direction_a,direction_b; //方向a、b,用于方向的限制

int scores,num,fool_x,fool_y,speed=100; //得分、num用于蛇身起步、食物x坐标、食物y坐标

bool end; //结束标记

struct node //蛇身结点

{

int x,y;

node *next;

}*head=NULL,*p,*tail;

void init(); //初始化开始界面

void start(); //游戏开始入场

void init_snake(); //初始化蛇身

void delete_snake(); //删除蛇身

void control(); //方向控制

void move(); //蛇身移动

void limit(); //方向限制

void panduan(); //配合limit限制方向

void fool(); //食物的出现以及食物被吞

void isEnd(); //结束判断

void zhuangwei(); //撞尾判断

void zhuangqiang(); //撞墙判断

int main ()

{

srand((unsigned)time(NULL));

init();

cin>>direction_a;

if(direction_a!='y'&&direction_a!='Y')

return 0;

do

{

system("cls"); //清除屏幕

end=false;

start();

delete_snake();

init_snake();

scores=0;

num=0;

fool_x=(rand() % (79-2+1))+ 2;

fool_y=(rand() % (22-2+1))+ 2;

gotoxy(fool_x,fool_y);

cout<

direction_a=getch();

while(direction_a!='d'&&direction_a!='s'&&direction_a!='w') direction_a=getch();

while(true)

{

if(num&&direction_a!='d'&&direction_a!='s'&&direction_a!='w'&&direction_a!='a')

{

direction_a=direction_b;

}

control();

fool();

Sleep(speed);

if(kbhit()) //kbhit 非阻塞函数

{

direction_a=getch(); //使用 getch 函数获取键盘输入

limit();

}

panduan();

num=1;

zhuangqiang();

zhuangwei();

if(end) break;

}

}while(direction_a=='y'||direction_a=='Y');

return 0;

}

void init()

{

gotoxy(35,8);

cout<

gotoxy(36,10);

cout<

}

void start()

{

for(int i=0;i<=79;i++)

{

Sleep(10);

cout<

gotoxy(i+1,24);

cout<

gotoxy(i+2,1);

}

gotoxy(1,2);

for(int i=0;i<=21;i++)

{

Sleep(20);

cout<

for(int j=0;j<=77;j++) cout<

cout<

}

}

void init_snake()

{

int n=3;

head=new node;

tail=head;

head->x=40;

head->y=12;

while(n--)

{

p=new node;

tail->next=p;

p->x=tail->x-1;

p->y=tail->y;

tail=p;

}

tail->next=NULL;

node *q=head->next;

gotoxy(head->x,head->y);

cout<

while(q!=NULL)

{

gotoxy(q->x,q->y);

cout<

q=q->next;

}

}

void delete_snake()

{

while(head!=NULL)

{

node *q=head;

head=q->next;

delete q;

}

}

void move()

{

gotoxy(tail->x,tail->y);

cout<

gotoxy(head->next->x,head->next->y);

cout<

gotoxy(head->x,head->y);

cout<

node *q=tail;

tail=head;

while(tail->next!=q)

{

tail=tail->next;

}

tail->next=NULL;

delete q;

}

void control()

{

node *q=new node;

q->next=head;

q->x=head->x;

q->y=head->y;

head=q;

switch(direction_a)

{

case 'w': head->y--;break;

case 's': head->y++;break;

case 'a': head->x--;break;

case 'd': head->x++;break;

default : break;

}

move();

}

void limit()

{

if(direction_b=='s'&&direction_a=='w') direction_a='s';

if(direction_b=='w'&&direction_a=='s') direction_a='w';

if(direction_b=='a'&&direction_a=='d') direction_a='a';

if(direction_b=='d'&&direction_a=='a') direction_a='d';

}

void panduan()

{

if(direction_a=='s') direction_b='s';

if(direction_a=='w') direction_b='w';

if(direction_a=='d') direction_b='d';

if(direction_a=='a') direction_b='a';

}

void fool()

{

node *q;

if(head->x==fool_x&&head->y==fool_y)

{

fool_x=(rand() % (79-2+1))+ 2;

fool_y=(rand() % (22-2+1))+ 2;

gotoxy(fool_x,fool_y);

cout<

num=0;

scores++;

node *q=new node;

q->x=tail->x;

q->y=tail->y;

tail->next=q;

tail=q;

tail->next=NULL;

}

q=head;

while(q!=NULL)

{

if(q->x==fool_x&q->y==fool_y)

{

fool_x=(rand() % (79-2+1))+ 2;

fool_y=(rand() % (22-2+1))+ 2;

gotoxy(fool_x,fool_y);

cout<

q=head;

continue;

}

q=q->next;

}

}

void isEnd()

{

end=true;

Sleep(600);

system("cls");

gotoxy(35,8);

cout<

gotoxy(33,10);

cout<

gotoxy(31,12);

cout<

cin>>direction_a;

}

void zhuangwei()

{

node *q=head->next;

while(q!=NULL)

{

if(head->x==q->x&&head->y==q->y)

{

isEnd();

break;

}

q=q->next;

}

}

void zhuangqiang()

{

if(head->x==80||head->x==1||head->y==24||head->y==1)

isEnd();

}

效果图:

>

00bf58d28e03ccf1f9c67bcb0f06d03c.png

7952d4e7ef07c1fe5009fed1955c5870.png

bad80943822de0fdcb9324eb9151eb6f.png

由于考虑到游戏的各种 BUG 故自定义函数很多,有兴趣的朋友可以自行改动一些函数对比效果。

关于C++小游戏的更多精彩内容请点击专题: 《C++经典小游戏》 学习了解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

C语言实训心得总结.doc C语言实训心得 10903090113 李新程 在初学C语言的一个学期后,我们进行了C语言实训阶段,尝试编写一个比较复杂的程序系统。在为期两周的时间中,我们同组的同学共同的感受是:C语言实训和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。在这里,我作为其中的参与者,感触良多。 在这次实训中,我对对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的实训,使我对C语言的学习产生浓厚的兴趣。 还是这次实训,最令人激动的就是合作做项目,虽然那只是一个很小很小的项目。每天大家来得很早,大家在一起学习,取长补短,我们很好的在实训中长知识,提高我们的学习热情。实训中深切体会到了老师认真负责的伟大的精神和热情为同学指导的促学方式,虽然对有些时候老师没给我们指出解决问题的方法有些小抱怨,但是到了结束时才知道,这种教学让我们自己学会了自学,学会了去看懂别人的代码。更多是老师给的感动,每天在我们来之前就到了教室,在讲课中海给我们分享他在公司上班的一些心得和体会,还有那些我们应该注意的事项,这些是平时上课时无法学到的,是更深层次的巨大收获。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值