用c++做贪吃蛇小游戏(简陋版)

今年刚上大一,在学c++的时候就想做一个贪吃蛇小游戏,拖了好久,今天终于把它搞定了。

最困难的我感觉是蛇身移动的那部分模块,开始根本没想到要怎么做,后面借鉴了百度上的贪吃蛇代码,才发现可以把蛇的各段都做为一个数组,通过前后数组的赋值来实现蛇身的移动。太妙了,这里放上代码

void mov_snack(struct snack*p_snack)//移动蛇 
{
	
	for(int i=30-length;i<29;i++)
	{
		p_snack->x[i]=p_snack->x[i+1];
		p_snack->y[i]=p_snack->y[i+1];
	}

这是整个程序的代码,改进空间我感觉还很大,各地方的逻辑还可以理一理,看起来更清晰。
还是写有点简陋了。。

#include<iostream>
#include "stdio.h"
#include "conio.h"
#include <conio.h>
#include<ctime>
#include <windows.h>
using namespace std;
int fdx,fdy;
int length=3;
int speed=300;
void gotoxy(int x,int y) //控制光标坐标 
{
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}



void print_noodle()//打印边框 
{
	for(int i=1;i<=21;i++)//左右边框 
	{
		gotoxy(29,i);
		cout<<"#";
		gotoxy(81,i);
		cout<<"#";
		gotoxy(83,10);
		cout<<"当前长度:";
		gotoxy(83,11);
		cout<<"目标长度:29";
		gotoxy(83,12);
		cout<<"当前速度:";
	}
	for(int i=30;i<81;i++)//上下边框 
	{
		gotoxy(i,1);
		cout<<"#";
		gotoxy(i,21);
		cout<<"#";
	}
 } 


void in_food()//打印食物 
{
	fdx=rand()%51+30;
	fdy=rand()%19+2;
	gotoxy(fdx,fdy);
	cout<<"*";
}


struct snack//蛇结构体 
  {
  	int x[30],y[30]; 
  } ;

snack s1;
struct snack*p_snack=&s1;

void grow_snack()//蛇增长 
{
	length++;
}

void mov_snack(struct snack*p_snack)//移动蛇 
{
	
	for(int i=30-length;i<29;i++)
	{
		p_snack->x[i]=p_snack->x[i+1];
		p_snack->y[i]=p_snack->y[i+1];
	}
	
	if(p_snack->x[29]==fdx&&p_snack->y[29]==fdy)//蛇吃食物和消除食物 
	{
	gotoxy(fdx,fdy);
	cout<<" ";
	in_food();
	
	grow_snack();
	mov_snack(&s1);
	
	gotoxy(92,10);
	cout<<length-1;
	
	speed=speed-10;//控制蛇速度 
	gotoxy(92,12);
	cout<<speed;
    } 
}

int cond_snack()//蛇撞到自己退出游戏 
{
	int l=0;
	for(int i=30-length;i<29;i++)
	{
		if(p_snack->x[29]==p_snack->x[i]&&p_snack->y[29]==p_snack->y[i])
		l=1;
	}
	return l;
}

void print(struct snack*p_snack)//打印蛇 
{

	for(int i=29;i>(29-length);i--)
	{
		gotoxy(p_snack->x[i],p_snack->y[i]);
		gotoxy(p_snack->x[i],p_snack->y[i]);
		cout<<"0";
	}
	
	gotoxy(p_snack->x[30-length],p_snack->y[30-length]);
	cout<<" ";//消除尾巴 
	
}

int main()
{
	
	
	
	
	p_snack->x[29]=40;
	p_snack->x[28]=39;
	p_snack->x[27]=38;
	
	p_snack->y[29]=9;
	p_snack->y[28]=9;
	p_snack->y[27]=9;
	
	print(&s1);
	char a;
	in_food();
	print_noodle();
	while(1)
	{
	 a=getch();
	 while(!kbhit())
	 {
            switch(a)
		{
			case 'a':
				mov_snack(&s1); 
				p_snack->x[29]-=1;
				
				break;
			case 'd':
				mov_snack(&s1);
				p_snack->x[29]+=1;
				
				break;
			case 's':
				mov_snack(&s1);
				p_snack->y[29]+=1;
				
			    break;
			case 'w':
				mov_snack(&s1);
				p_snack->y[29]-=1;
				
				break;
		}
		
		if(p_snack->x[29]==29||p_snack->x[29]==81||
		   p_snack->y[29]==1||p_snack->y[29]==21||cond_snack())
		   {
		   	  goto lost;
		   } 
		
		
		print(&s1);
		Sleep(speed);
	 }
    }
    lost:
    	system("cls");
    	gotoxy(20,10);
		cout<<"geam over" ;
		gotoxy(18,18);
		cout<<"制作者:林杀马特*青龙";
		gotoxy(50,20);
		cout<<"\n";
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值