C语言只踩白块

把几周前写的贪吃蛇发出来后,出于无聊,
于是便把之前一直让同学写的别踩白块
靠自己的思路写了出来,不知道网上有没有这样的源码,
这个源码基于之前的贪吃蛇,有什么不足还请指出,但还望大佬勿喷... :guai:
这只是v1,注释比较少,等有空再优化优化代码,然后添加更加详细的注释 :huaji4:
下面是可以直接在Windows系统的编译器上编译执行的源代码:

#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
//#pragma warning(disable:4996)
//↑移除Visual Studio的4996警告

void cls() {
	//解決system("cls")導致的閃爍問題
	COORD point = { 0,0 };
	//光標要移動到的坐標
	HANDLE HOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(HOutput, point);
	//移動光標至命令行最前端
}

void move(int pos[][6]) {
	int i;
	for (i = 0; i < 5; i++) {
		pos[1][i]++;
	}
	//區塊向下移動
}

void lcr(int pos[][6]) {
	int i;
	for (i = 1; i < 5; i++)
		pos[0][5 - i] = pos[0][4 - i];
	pos[0][0] = rand() % 3;
	for (i = 0; i < 5; i++)
		pos[1][i] = 7 * i;
	for(i = 1; i < 6; i++)
		pos[2][6 - i] = pos[2][5 - i];
	pos[2][0] = 0;
	move(pos);
	//更新第一個區塊
}

int input(int intf[]) {
	int ch = 0;
	if (kbhit()) {
		ch = getch();
		//將緩衝區中的數據以字符的形式讀出至ch
		//↓循環監聽,直到按Esc鍵退出
		if (ch == 27) {
			system("cls");
			puts("遊戲已退出");
			return 1;
		}
		intf[0] = ch;
	}
	else {
		intf[0] = 0;
	}
	return 0;
}

int SetBlocks(char gui[], char enter[], char chs[][3], int pos[][6], int intf[], int score) {
	int x, y, z, i, set = 0;
	char s[30][15][3] = { "" }, ui[30][31] = { "" }, gui0[931] = { "" };
	//↓循環給s數組賦值,形成 遊戲界面佈局
	for (y = 0; y < 30; y++) {
		for (x = 0; x < 15; x++) {
			for (z = 0; z < 3; z++)
				s[y][x][z] = chs[1][z];
			//↑黑塊
			for (i = 0; i < 5; i++) {
				if (pos[0][i] * 5 <= x && (pos[0][i] + 1) * 5 > x&& y >= (pos[1][i] - 7) && y < pos[1][i])
					for (z = 0; z < 3; z++)
						s[y][x][z] = chs[0][z];
				//↑白塊
				if ((pos[0][i] * 5 <= x && (pos[0][i] + 1) * 5 > x&& y >= (pos[1][i] - 7) && y < pos[1][i] )&& pos[2][i])
					for (z = 0; z < 3; z++)
						s[y][x][z] = chs[2][z];
				//↑踩過的白塊
			}
		}
	}
	//↓循環將s賦值給ui,并將ui賦值給gui
	for (i = 0, y = 0; y < 30; y++, i++) {
		for (x = 0; x < 15; x++)
			strcat(ui[i], s[y][x]);
		strcat(gui0, ui[i]);
		strcat(gui0, enter);
	}
	strcpy(gui, gui0);
	//將SetBlock函數變量gui0賦值給GUI函數變量gui
	if (pos[1][0] < 7)
		move(pos);
	else
		lcr(pos),score++;
	return score;
}

void GUI() {
	char s[30][15][3] = { "" }, ui[30][31] = { "" }, gui[931] = { "" }, enter[] = { "\n" }, chs[3][3] = { {"■"}, {"□"}, {"◆"} };
	int pos[3][6] = { { 3,3,3,3,3 }, { 0,7,14,21,28 }, { 1,1,1,1,1,1 } }, intf[] = { 0,0 }, i, score = -6, Time = 1;
	/* 
	** s[30][15][3]表示30*15的 長度為3 的字符串二維數組,用於第一次存放遊戲界面佈局
	** ui[30][31]表示30個長度為31的字符串的數組,用於第二次存放遊戲界面的佈局
	** gui[931]用於第二次存放遊戲界面的佈局,以達到三次性輸出到屏幕上的目的
	** 這裡和之前寫的貪吃蛇v5的原理差不多...
	*/
	srand(time(NULL));
	while (1) {
		cls();
		if (input(intf))
			break;
		if (intf[0]) {
			for (i = 0; i < 6; i++) {
				if (!pos[2][5 - i]) {
					if (pos[0][5 - i] == intf[0] - 49) {
						pos[2][5 - i] = 1;
						break;
					}
					else
						pos[2][5] = 0;
				}
			}
		}
		if (!pos[2][5] && pos[1][0] >= 3) {
			system("cls");
			break;
		}
		score = SetBlocks(gui, enter, chs, pos, intf, score);
		if (score < 100)
			Time = 100 - score;
		printf("%s\n%5d\n%5d\n速度:%5d\n分数:%5d", gui, pos[1][0], intf[0], Time, score >= 0 ? score * 5 : 0);
		Sleep(Time);
	}
	printf("Game Over\n得分:%d\n最高速度:%d\n", score >= 0 ? score * 5 : 0, Time);
}


void start() {
	printf("遊戲說明:\n按數字鍵1 2 3分別代表\n點擊左中右三塊屏幕\n請只踩白色方塊\n否則Game Over\n按任意鍵開始遊戲\n");
	system("pause");
	GUI();
	system("pause");
}

int main() {
	start();
	return 0;
}
按讚

發佈留言

電子郵件地址不會被公開。必填項已用 * 標註