April 5, 2020

Keller的奇葩贪吃蛇游戏

时间就像一条贪吃蛇。

Keller的奇葩贪吃蛇游戏

前一阵翻旧代码忽然翻到了这个高中时搞的贪吃蛇代码QAQ
现在看来也还挺有趣的...
原来博客的文章都丢掉了,然而这篇博文的文案写在代码的注释里所以保留了下来~
以下是原内容

这里介绍一下与普通的贪吃蛇的区别:

1.先是搞了个果子闪烁...其实就是个rand()...(逃
2.然后增加了障碍物(金币)...
3.然后设置了难度,随着难度增加,障碍物出现数量、蛇的移动速度等 都会变化
4.加上了提示音~就是蜂鸣声啦~
5.当得分大于5时,有10%的几率出现“时空隧道传送门”...蛮有趣的~
6.还有个防沉迷(滑稽)...然而正常不可能玩到...
7.然后还有一些普通贪吃蛇没有的bug... 比如果子出现在障碍物中无法吃到..新的障碍物rand()到了头前面迷之瞬间GameOver...(有时间改一下)
8.还有一些小彩蛋和迷之奖励关卡...请自行从代码中发现...

注意: win10 显示效果并不理想... 建议使用机房XP系统~ 流畅运行、蜂鸣声带感~

代码:

/*
	Name: 一个奇葩的贪吃蛇游戏 
	Author: HelenKeller 
	Date: 06-09-2016 16:14
*/

#include<cstdio>
#include<conio.h>
#include<cstdlib>
#include<windows.h>
#include<cstring>
#include<pthread.h>
#include<ctime>
using namespace std;
const int N = 400, n = 20, dx[] = {-1,1,0,0}, dy[] = {0,0,-1,1};
int c,len,ed,eed,x,y,v,a[25][25],bx[N],by[N],nddd,tttim,insk,inskp;
pthread_t t1,t2;
struct nd {int x,y,dir;}p[N];
int slslsls;
void* gt(void* args) {
	while(c = getch()) {
		if(c == 72 && p[1].dir > 1) p[0].dir = 0;
		else if(c == 80 && p[1].dir > 1) p[0].dir = 1;
		else if(c == 75 && p[1].dir < 2) p[0].dir = 2;
		else if(c == 77 && p[1].dir < 2) p[0].dir = 3;
		else if(c == 114) eed = 1;
	}
}

void mk() {
	int cnt = 0;
	for(int i = 2; i < n; i++)
		for(int j = 2; j < n; j++)
			if(!a[i][j]) bx[++cnt] = i, by[cnt] = j;
	int d = rand()%cnt+1;
	a[x=bx[d]][y=by[d]] = 3;
}
int now5x,now5y;
int bx2[N],by2[N];
void mk2() {
	rand();rand();
	int cnt = 0;
	for(int i = 2; i < n; i++)
		for(int j = 2; j < n; j++)
			if(!a[i][j]) bx2[++cnt] = i, by2[cnt] = j;
	int d = rand()%cnt+1;
	now5x=(bx2[d]),now5y=(by2[d]);
	a[bx2[d]][by2[d]] = 5;
}

void mk3() {
	rand();rand();
	int cnt = 0;
	for(int i = 2; i < n; i++)
		for(int j = 2; j < n; j++)
			if(!a[i][j]) bx2[++cnt] = i, by2[cnt] = j;
	int d = rand()%cnt+1;
	now5x=(bx2[d]),now5y=(by2[d]);
	a[bx2[d]][by2[d]] = 4;
}

void pr_k(){
	Sleep(100);
	system("cls");
	printf("Score:%d    难度等级:%d \n", v,nddd);
	putchar('*');
	for(int i = 2; i < n; i++) putchar('-'), putchar('-');
	puts("*");
	for(int i = 2; i < n; i++) {
		putchar('|');
		for(int j = 2; j < n; j++) {
			int gz=rand()%5;
			if(gz==1)putchar('&');
			else if(gz==2)putchar('!');
			else if(gz==3)putchar('@');
			else if(gz==4)putchar('%');
			else
				putchar('+');
			putchar(' ');
		}
		puts("|");
	}
	putchar('*');
	for(int i = 2; i < n; i++) putchar('-'), putchar('-');
	puts("*");
} 

char name[100];
void* run(void* args) {
	srand(time(NULL));
	memset(a, 0, sizeof a);
	len = 5, p[0].dir = 0, v = 0;
	if(insk){
		v=inskp+100;
		//insk=0;
	}
	for(int i = 1; i <= len; i++) p[i].x = 7+i, p[i].y = 10, p[i].dir = 0, a[p[i].x][p[i].y] = 2;
	mk();
	while(1) {
		int vv=v;
		if(insk){
			vv=v%100;
		}
		slslsls=200-5*vv*nddd;
		if(slslsls<30)slslsls=30;
		if(nddd==88888888) slslsls=100;
		Sleep(slslsls);
		system("cls");
		for(int i = len; i >= 1; i--) p[i].dir = p[i-1].dir;
		for(int i = 1; i <= len; i++) {
			a[p[i].x][p[i].y] = 0, p[i].x += dx[p[i].dir], p[i].y += dy[p[i].dir];
			if(a[p[i].x][p[i].y] == 1 || a[p[i].x][p[i].y] == 2) if(nddd!=88888888)goto over;
			if(a[p[i].x][p[i].y] == 5) goto over2;
			if(a[p[i].x][p[i].y] == 3) Beep(5500,40);
			if(a[p[i].x][p[i].y] == 4){
				int uiui=1;
				while(uiui<10){
					len++;uiui++;
					//a[now5x][now5y]=0;
					p[len].x = p[len-1].x+dx[p[len-1].dir^1], p[len].y = p[len-1].y+dy[p[len-1].dir^1], p[len].dir = p[len-1].dir;
					pr_k();
				}
				goto over4;
			}
			if(i != 1) a[p[i].x][p[i].y] = 2; else a[p[i].x][p[i].y] = 1;
		}
		if(p[1].x == x && p[1].y == y) {
			len++, v++;
			//printf("\a");
			//a[now5x][now5y]=0;
			p[len].x = p[len-1].x+dx[p[len-1].dir^1], p[len].y = p[len-1].y+dy[p[len-1].dir^1], p[len].dir = p[len-1].dir;
			mk();
			if(v>=5&&(rand()%10==8 || insk)){
				mk3();
			}
			int mone=rand()%(v);
			if(nddd>3) mone=(v+nddd)%(25);
			if(nddd==88888888){
				mone=0;
				for(int i=1;i<=25;i++)mk();
				//v+=88;
			}
			if(insk){
				mone%=15;
			}
			for(int i=1;i<=mone;i++)
				if((rand()%2 && nddd>1)|| (nddd>=3&&!insk))mk2();
		}
		//insk=0;
		printf("Score:%d    难度等级:%d \n", v,nddd);
		putchar('*');
		for(int i = 2; i < n; i++) putchar('-'), putchar('-');
		puts("*");
		for(int i = 2; i < n; i++) {
			putchar('|');
			for(int j = 2; j < n; j++) {
				if(a[i][j] == 1) {
					putchar('#');
				}
				else if(a[i][j] == 2) {
					/*int gz=rand()%5;
					if(gz==1)putchar('&');
					else if(gz==2)putchar('!');
					else if(gz==3)putchar('@');
					else if(gz==4)putchar('%');
					else*/
						putchar('+');
				}
				else if(a[i][j] == 3) {
					int gz=rand()%5;
					if(gz==1)putchar('&');
					else if(gz==2)putchar('!');
					else if(gz==3)putchar('@');
					else if(gz==4)putchar('%');
					else putchar('*');
				}
				else if(a[i][j]==5){
					putchar('$');
				}
				else if(a[i][j]==4){
					int gz=rand()%5;
					if(gz==1)putchar(' ');
					else if(gz==2)putchar('W');
					else if(gz==3)putchar('K');
					else if(gz==4)putchar('L');
					else putchar('*');
				}
				else putchar(' ');
				putchar(' ');
			}
			puts("|");
		}
		putchar('*');
		for(int i = 2; i < n; i++) putchar('-'), putchar('-');
		puts("*");
		tttim++; 
		printf("您已进行了 %d 蛇时间 的游戏, %d 蛇时间后您将进入疲劳时间!\n",tttim,10000-tttim);
		if(tttim>=10000){
			goto over3;
		}
		puts(" ");
		if(p[1].x <= 1 || p[1].x >= n || p[1].y <= 1 || p[1].y >= n) {
			over:system("cls"), puts("Game Over!\nPress R to Try Again.");
			insk=0;
			//slslsls=400;
			printf("Your Score:%d", v);
			printf("\n\n 输入你的名字:\n");
			memset(name,0,sizeof(name));
			scanf("%s",name);
			printf("===============排行榜===============\n");
			printf("No.1  HelenKeller  scord: 888888 \n");
			printf("No.2  ");
			for(int i=0;i<strlen(name);i++){
				printf("%c",name[i]);
			} 
			printf("  score: %d \n\n",v);
			printf("=============继续加油!=============\n");
			printf("Press R to Try Again.\n");
			while(!eed);
			ed = 1;
			return 0;
		}
		if(1<0) {

			over2:system("cls"), puts("年轻人不要贪图钱财!\nPress R to Try Again.");
			//slslsls=400;
			insk=0;
			printf("Your Score:%d", v);
			printf("\n\n 输入你的名字:\n");
			memset(name,0,sizeof(name));
			scanf("%s",name);
			printf("===============排行榜===============\n");
			printf("No.1  HelenKeller  scord: 888888 \n");
			printf("No.2  ");
			for(int i=0;i<strlen(name);i++){
				printf("%c",name[i]);
			} 
			printf("  scord: %d \n\n",v);
			printf("=============继续加油!=============\n");
			printf("Press R to Try Again.\n");
			while(!eed);
			ed = 1;
			return 0;
		}
		if(1<0){

			over3:system("cls"), puts("您已进入疲劳时间!请下线!\n**************************");
			//slslsls=400;
			insk=0;
			Sleep(10000);
			while(!eed);
			ed = 1;
			return 0;
		}
		if(1<0) {

			over4:system("cls"), Beep(550,1000);puts("\n\n你陷入了时空隧道!\n");
			insk=1;
			inskp=v;
			//Sleep(1000);
			ed = 1;
			return 0;
		}
	}
}

int main(){
	puts("An Easy Game\nMade by HelenKeller\n\nPress Enter to Start...");
	while(c = getch()) if(c == 13) break;
	printf("\n\n\n请输入数字选择难度:0: 白痴 1:简单 2:困难 3:地狱 大于3:极限\n");
	scanf("%d",&nddd);
	start:
		char ch;
		pthread_create(&t1, NULL, gt, NULL);
		pthread_create(&t2, NULL, run, NULL);
		while(!ed);
		ed = eed = 0;
	goto start;
	return 0;
}

直接编译代码运行就可以在控制台玩辣~
TIM--20200405155646