【游戏】[C++] 贪吃蛇控制台版

疫情期间看了河海大学的mooc跟着做的练手程序
实现了贪吃蛇的基本功能 使用wasd控制前进
一步步做出来很有成就感
课程网址:
https://www.icourse163.org/course/HHU-1206797807?tid=1450398479

成品截图

有分数显示
小彩蛋  把墙吃了
在这里插入图片描述

初探游戏制作 挺有意思的
全代码如下 注释很多

#include "stdio.h"
#include "stdlib.h"//包涵rand()函数 
#include "conio.h"//包涵kbhit()函数 
#include "windows.h"//包涵gotoxy ()函数 
#include "time.h"//包涵时间函数time(),用来给rand取时间种子 

const int high=10;
const int width=12 ;
int display[high][width];//地图大小
int head_x,head_y;//蛇头位置
int head_vx,head_vy;//蛇移动速度(主要是取方向) 
int suger_x,suger_y;//糖位置
int lenth;//蛇长度 
bool alive;//还活着么 
//全局变量
 
//本游戏实现了贪吃蛇的基本玩法,
//整形二维数组为基础,蛇的移动和物件的显示均以数组元素的更替实现 
//蛇头处数据为1,身体处数据依次以2、3、4···递增lenth 
//食物处数据为-2,墙为-1(墙可以吃 ,墙的另一边才是死亡判断处) 
// 示例图 如下   
//名称 数组值 显示字符
//蛇头   1       @ 	
// 糖   -2       $
// 墙   -1		 #
//蛇身  2/3/4... 0				 0
//描述的不清 读者可以自行跟着视频mooc制作
//  2020/4/16  共计约6小时  NBU 196003408   
 
 
//另彩蛋:墙可以吃 墙之外的才为死亡判断 
void gotoxy(int x, int y) {//光标移动,用来刷新画面显示
	COORD pos = {x,y};	//相当于system("cls");但不会造成闪烁
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//主程序里可
	SetConsoleCursorPosition(hOut, pos);//以自己试试
}
void initialize() { //初始化函数
	srand((unsigned)time(NULL));//时间为种子 为rand取种子
	
	lenth=1; alive=1;
	suger_x=rand() %(width-4)+2;
	suger_y=rand() %(high-4)+2;
	head_x=width/2;head_vx=0;
	head_y=high/2;head_vy=0;
	
	while(head_x==suger_x&&head_y==suger_y)	//避免糖与蛇重叠
		head_x=rand()%(width-2)+1,head_y=rand()%(high-2)+1;

	for(int i=0; i<high; i++) {
		for(int j=0; j<width; j++) {
			if(i==0||i==high-1||j==0||j==width-1)
				display[i][j]=-1;
			else if(head_x==j&&head_y==i)
				display[i][j]=1;
			else if(suger_x==j&&suger_y==i)
				display[i][j]=-2;
			else
				display[i][j]=0;
		}
	}
}
void show() { 	//画面显示函数
	gotoxy(0,0);
	//system("cls");
	for(int i=0; i<high; i++) {
		for(int j=0; j<width; j++) {
			if(display[i][j]==-1)
				printf("#");
			else if(display[i][j]==1)
				printf("@");
			else if(display[i][j]>1)
				printf("O");
			else if (display[i][j]==-2)
				printf("$");
			else if(display[i][j]==0)
				printf(" ");
		}
		printf("\n");
	}
	printf("当前得分:%d   ",lenth-1);
}
void update_without() {//赋值显示无关(数据处理有关)的更新
	head_x=head_x+head_vx;
	head_y=head_y+head_vy;
	//蛇头前进 
	if(display[head_y][head_x]>1)	alive=0;//撞自己了 
	if(head_x>=width||head_x<0||head_y>high||head_y<0)	alive=0;
	//冲破束缚的代价 
	
	if(head_x==suger_x&&head_y==suger_y){//甜了自己一口 
		lenth++;//  
		while(display[suger_y][suger_x]!=0){
			suger_x=rand()%(width-2)+1;
			suger_y=rand()%(high-2)+1;
		}
		display[suger_y][suger_x]=-2;
	}
	if(display[head_y][head_x]==-1)
		lenth++;//该死的墙头蛇吃着资本主义的糖 
	
}
void update_with() {//与数组赋值显示有关的更新
	for(int i=0; i<high; i++) {
		for(int j=0; j<width; j++) {
			if(display[i][j]>0&&display[i][j]<=lenth)
				display[i][j]++;//蛇身前进 
			if(head_x==j&&head_y==i)
				display[i][j]=1;// 蛇头前进 
			if(display[i][j]>lenth)
				display[i][j]=0;//蛇尾前进 
			
		}
	}
}

void operate() {
	if(kbhit()) {
		int input=getch();
		switch (input) {
			case 'a':head_vx=-1;head_vy=0;break;
			case 's':head_vy=1;head_vx=0;break;
			case 'w':head_vy=-1;head_vx=0;break;
			case 'd':head_vx=1;head_vy=0;break;
		}
	}
	//你控制的不是头  是头的方向!! 
}
int main() {
	initialize();
	while(alive) {
		show(); 
		Sleep(300) ;
		operate();
		update_without();
		update_with();
	}
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
	 FOREGROUND_INTENSITY | FOREGROUND_RED);//设置文本输出红色 
	printf(" WASTED \a"); //neta自GTAV
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
	 FOREGROUND_INTENSITY);//将文本输出颜色还原 
	Sleep(1000) ;
	system("pause");
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值