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