游戏——贪吃蛇

#介绍
这个贪吃蛇写了好几天,终于打完了!下面介绍具体玩法,你们看一下吧,希望喜欢!

  1. 运行了编译出的可执行文件后会出现如下界面,这时输入两个数,中间空格隔开(你要换行也行),输完按回车:
  2. 之后游戏便开始了,出现如下界面,图中可看出几个基本操作,“|”符号左边是字母键盘区操作的规则,右边则是数字键盘区操作规则,个人推荐用数字键盘区(就是标准键盘右边那一坨),你们可能注意到“加速”和“减速”两个操作各有两个按键,左边的(q,e,4,6)代表粗调,速度改变得快一些,右边的(j,k,7,9)代表微调,速度改变得慢一些:
    这里写图片描述
  3. 游戏设置有“奖励蛋”,可能你们也看到下面有一行提示字,默认是每九个“普通蛋”之后就有一个“奖励蛋”,“奖励蛋”的体现是一个闪来闪去的五角星,它的分数根据你当前的速度而定,而且他的分还会随着时间的流逝而变少,不过应该不会低于“普通蛋”的默认分——10分。
    这里写图片描述
  4. 在游戏中,你可以按“8”(若是字母键盘区,则可以按“h”键)来开启作弊模式,此模式中,你可以作弊(废话),当你要撞上障碍物(包括你的身体和后面要讲的地图障碍物)是,蛇会停下来,等着你下一步的指令继续走(当然不能再往有障碍物的路走)。
    这里写图片描述
  5. 你们应该注意到,右边的说明中有一项“地图”,按了那个键就会进入地图编辑界面,不过游戏只是暂停,之后根据提示,你可以在上面放置或删除“地图障碍物”,增添游戏乐趣。
    这里写图片描述
    当然你可以做成这样
    这里写图片描述
  6. 最后,如果你诚实地没作弊,却咬到了自己,那么这一局就结束了,出现如下界面,过一会之后就回到了界面“1”。
    这里写图片描述

#实现

  • 为了让屏幕不那么卡,我依旧是运用了只改动被改过的像素点的方法。
  • 我用了个二维数组把整个地图记录下来,再有一个二维数组记下当前这个点的方向(可以想象成一个链表一样的东西,这个点的dir[]值就代表蛇在这个地方的方向,要是这里没有蛇的身体那么当然就是空了,这样就把整条蛇给记录下来了)
  • 而且这样的好处是,只要你记下蛇头蛇尾的坐标,每过一个单位,你只需修改蛇头和蛇尾这两个像素点,而且可以由 dir[] 很快地知道应该怎么修改。
  • 其它具体操作也很简单了,就是细节比较繁琐,希望大家玩的开心~

#附上源代码

#include <cstdio>
#include <iostream>
#include <ctime>
#include <conio.h>
#include <windows.h>       //停顿:Sleep(); 
#include <cstdlib>         //清屏:system("cls");
#include <cstring>         //1:'◎' 2:'⊙' 3:'▲' 4:'◆' 5:'■'
using namespace std;
int a[100][100], dir[100][100];
//string guo[5]={'▲','◆','■','▼','★'};
int fx[4][2] = { {0,-1},{1,0},{0,1},{-1,0} }; //ap来记录奖励块的分   
int n, m, ff, f = 1, t = 50, T = 50, ap = 10, egg[2], danshu, headx, heady, endx, endy, point = 0, apple = 0, fangx, stopp = 0, panduan = 0;  //ff用来判断  panduan 0:中途退出;1:咬到自己;2:重置  
int lastfx;
int zuobi = 0;
int fff[110][110];
string print[4][4] = { {"═","╔","  ","╚"},{"╝","║","╚","  "},{"  ","╗","═","╝"},{"╗"," ","╔","║"} };

void color(int a)//颜色函数
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}

void gotoxy(int x, int y)//位置函数(行为x 列为y)
{
	COORD pos;
	pos.X = 2 * y;
	pos.Y = x;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void reset() {
	system("cls");
	color(7); printf("                   ★"); color(10); printf("贪吃蛇"); color(11); printf("★\n\n"); color(7);
	printf("⊙打印若有错位请调整窗口大小或按r重输小点的数⊙\n\n  请输入场地大小(格式:行数 列数) 推荐(20 20) \n\n>>");
	scanf("%d%d", &n, &m);
	system("cls");
	color(14);
	for (int i = 1; i <= m; i++) { gotoxy(0, i); printf("※"); gotoxy(n + 1, i); printf("※"); }
	for (int i = 1; i <= n; i++) { gotoxy(i, 0); printf("※"); gotoxy(i, m + 1); printf("※"); }
	color(10);
	memset(fff, 0, sizeof(fff));
	gotoxy(0, 0); printf("┍");
	gotoxy(n + 1, 0); printf("┕");
	gotoxy(0, m + 1); printf("┑");
	gotoxy(n + 1, m + 1); printf("┙");
	color(7);
	gotoxy(0, m + 5); printf("方向:a/s/d/w | 1/2/3/5");
	gotoxy(1, m + 5); printf("暂停:p       |       0");
	gotoxy(2, m + 5); printf("减速:q/j     |     4/7");
	gotoxy(3, m + 5); printf("加速:e/k     |     6/9");
	gotoxy(4, m + 5); printf("重置:r       |       .");
	gotoxy(5, m + 5); printf("地图:h       |       +");
	headx = endx = endy = 1; heady = 3;
	f = 1; ff = 3;
	memset(a, 1, sizeof(a));
	memset(dir, 0, sizeof(dir));
	a[1][1] = a[1][2] = a[1][3] = 0;
	gotoxy(1, 1); printf("⊙");
	gotoxy(1, 2); printf("⊙");
	gotoxy(1, 3); printf("◎");
	dir[1][1] = dir[1][2] = dir[1][3] = 2;
	apple = 0; fangx = 2; point = 0; danshu = 0; lastfx = 2; stopp = 0;
	if (zuobi) { color(12); gotoxy(12, m + 5); printf("作弊可耻!"); gotoxy(m + 4, 0); printf("做了弊还没路走那就救不了你了,乖乖重来吧......"); color(7); }
}

void haha() {
	char ch = getch();
	if ((ch == 'a' || ch == '1') && dir[headx][heady] != 2) { fangx = 0; return; }
	if ((ch == 's' || ch == '2') && dir[headx][heady] != 3) { fangx = 1; return; }
	if ((ch == 'd' || ch == '3') && dir[headx][heady] != 0) { fangx = 2; return; }
	if ((ch == 'w' || ch == '5') && dir[headx][heady] != 1) { fangx = 3; return; }
	if (ch == 'p' || ch == '0') { stopp = (stopp + 1) % 2; return; }
	if (ch == 'q' || ch == '4') { T += 10; if (T >= 1005) T = 1005; return; }
	if (ch == 'e' || ch == '6') { T -= 10; if (T <= 1) T = 2; return; }
	if (ch == 'j' || ch == '7') { T += 1; if (T >= 1005) T = 1005; return; }
	if (ch == 'k' || ch == '9') { T -= 1; if (T <= 1) T = 2; return; }
	if (ch == 'r' || ch == '.') { ff = 2; f = 0; panduan = 0; return; }
	if (ch == 'h' || ch == '8') {
		zuobi += 1; zuobi %= 2;
		if (zuobi) { color(12); gotoxy(12, m + 5); printf("作弊可耻!"); gotoxy(m + 4, 0); printf("做了弊还没路走那就救不了你了,乖乖重来吧......"); color(7); }
		else { printf("                "); gotoxy(m + 4, 0); printf("                                                   "); }
	}
	if (ch == 'g' || ch == '+') {
		gotoxy(n + 50, 0);
		printf("现在切换到地图编辑模式\n\nq/4 为开始放置模式(光标移动过的痕迹会留下障碍物)\n\ne/6 为取消放置障碍物模式\n\nj/0 为橡皮模式(再按一次退出橡皮模式)\n\n按 h/+ 继续游戏\n\n");
		printf("\n按任意键开始编辑地图");
		color(13);
		int x = 1, y = 1, dfx, moshi = 0;
		ch = getch(); gotoxy(0, 0); gotoxy(1, 1);
		while (ch != 'h' && ch != '+') {
			if (ch == 'a' || ch == '1') dfx = 0;
			else if (ch == 's' || ch == '2') dfx = 1;
			else if (ch == 'd' || ch == '3') dfx = 2;
			else if (ch == 'w' || ch == '5') dfx = 3;
			else dfx = 5;
			if (ch == 'q' || ch == '4') moshi = 1;
			if (ch == 'e' || ch == '6') moshi = 0;
			if (ch == 'j' || ch == '0') if (moshi - 2) moshi = 2; else moshi = 0;
			if (dfx <= 4) {
				if (x + fx[dfx][0] > 0 && x + fx[dfx][0] <= n && y + fx[dfx][1] > 0 && y + fx[dfx][1] <= m) { x += fx[dfx][0]; y += fx[dfx][1]; }
				if (x > 0 && x <= n && y > 0 && y <= m) {
					gotoxy(x, y);
					if (moshi == 1 && a[x][y] && !fff[x][y]) { a[x][y] = 0; fff[x][y] = 1; printf("□"); }
					if (moshi == 2 && fff[x][y]) { a[x][y] = 1; fff[x][y] = 0; printf("  "); }
					gotoxy(x, y);
				}
			}
			ch = getch();
		}
		color(7);
	}
}

void findegg() {
	srand(time(NULL));
	int aa = 1;
	while (!a[egg[0]][egg[1]]) { egg[0] = (rand() % (n)) + 1; egg[1] = (rand() % m) + 1; }
	a[egg[0]][egg[1]] = 0;
	point += ap;
	gotoxy(egg[0], egg[1]); if (!apple) { printf("★"); ap = 8000 / T; if (ap >= 200) ap = 200; }
	else { printf("●"); ap = 10; }
	apple++; apple = apple % 10;
	gotoxy(n + 2, 0); printf("距离下一个奖励蛋还有 "); color(11); cout << 9 - (8 + apple) % 10; color(7); printf(" 个");
	danshu++;
	return;
}

int gg() {

	if (ff == 0) return(0);
	if (ff == 1) { gotoxy(n + 2, 1); Sleep(3000); gotoxy(n + 26, 1); gotoxy(n + 10, 0); printf("哦豁~ 你咬到自己了o( ̄▽ ̄)d\n\n\n你共吃蛋 %d 个\n\n\n你共得分 %d 分,恭喜!\n\n\n等一下就继续", danshu, point); Sleep(5000); if (kbhit) return(1); }
	if (ff == 2) return(1);
	return 0;
}

void dong() {
	gotoxy(11, m + 3); printf("当前的蛋有 %d 分            ", ap);
	if (ap - 3 > 10) ap -= 3;
	if (ap != 10) {
		gotoxy(egg[0], egg[1]);
		color(ap % 10);
		printf("★");
		color(7);
	}

	int x, y;
	x = (headx + fx[fangx][0] - 1 + n) % (n)+1; y = (heady + fx[fangx][1] - 1 + m) % (m)+1;
	dir[headx][heady] = fangx;
	if (x == egg[0] && y == egg[1]) {
		gotoxy(headx, heady); cout << print[lastfx][fangx];
		dir[headx][heady] = fangx;
		headx = x; heady = y; a[x][y] = 0;
		gotoxy(headx, heady); printf("◎");
		findegg();
	}
	else if (a[x][y]) {
		gotoxy(headx, heady); cout << print[lastfx][fangx];
		headx = x; heady = y; a[x][y] = 0;
		gotoxy(headx, heady); printf("◎");
		gotoxy(endx, endy); printf("  "); a[endx][endy] = 1;
		x = endx; y = endy;
		endx += fx[dir[x][y]][0]; endx = (endx - 1 + n) % (n)+1;
		endy += fx[dir[x][y]][1]; endy = (endy - 1 + m) % (m)+1;
		dir[x][y] = -1;
	}
	else if (!zuobi) { f = 0; ff = 1; }

	dir[headx][heady] = fangx;
	lastfx = fangx;
	return;
}

int main() {
	while (1) {
		srand(time(NULL));
		reset();
		egg[0] = (rand() % n - 1) + 2; egg[1] = (rand() % m) + 1;
		a[egg[0]][egg[1]] = 0;
		gotoxy(egg[0], egg[1]); if (apple) { printf("★"); ap = 100; }
		else printf("●");
		while (f) {
			if (kbhit()) haha();
			gotoxy(9, m + 5); printf("吃蛋:%d 个", danshu);
			gotoxy(8, m + 5); printf("速度: %d   ", 1005 - T);
			//while (stopp) {Sleep(10); if (kbhit()) haha();}
			Sleep(1); t = (t - 1 + T) % T;
			if (t == 0 && !stopp) dong();
			gotoxy(7, m + 5); printf("得分:%d 分", point);
			gotoxy(12, m + 5);
		}
		if (!gg()) return 0;
	}
	return 0;
}

#几点说明

  • 源代码以及编译出的可执行文件的下载页面
    http://download.csdn.net/detail/jackypigpig/9725997
  • 我发现电脑们的配置不同,蛇初始的速度也会不同,所以要是你们发现每次打开游戏蛇的速度都不合心意的话,可以在原程序里调,第12行(是一行定义),找到“t”和“T”,T 的值代表T毫秒蛇走一步,而 t 只是相当于一个累加时间的变量,~~改不改都行,~~不过最好改成和T一样。
  • 注意每次咬到自己之后会重新输入屏幕大小,注意把之前输入的字符删掉,免得出现过大的错误。
  • 压缩包里面还有个文件“贪吃蛇_大屏版”,是没有说明的,不过操作是一样的,目的在于提供更大的空间让蛇蛇蠕动!(大屏版大小可调至更大,只要你将窗口调大就行了)
  • 要是有什么建议,欢迎提出!
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值