单纯的书本知识的记忆不论对于哪门学科来说都是枯燥乏味的,而若能运用自己已学的知识去解决或创造一个问题,学习将会被赋予更为明显的意义。于是,在我们整天盯着书本而不知所以时,不如来段游戏设计吧。
若你不知从哪里开始着手,相信在屏幕上打一条可以自动寻路的贪吃蛇(我更愿称它为智能蛇)将会是一个不错的开始。而且倘若你有兴趣,这条蛇甚至可以陪伴你的整个学习历程,在你的手中越来越“强大”。
//这是源代码
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include"kky.h"
int main(void) {
int io, oi;
int m, n;
int m0, n0;
int a, b, c;
int t = 0;
int y = 1;
int k[2] = { 4, 4 };
for (io = 0; io < COUNT; io++) {
for (oi = 0; oi < COUNT; oi++) {
q[io][oi].w = 0;
q[io][oi].e = ' ';
}
}
for (io = 0; io < COUNT; io++) {
for (oi = 0; oi < COUNT; oi++) {
if (io == COUNT - 1 || io == 0 || oi == COUNT - 1 || oi == 0)
q[io][oi].e = '*';
}
}
m0 = area(COUNT);
n0 = area(COUNT);
q[m0][n0].e = 48;
q[m0][n0].w = 1;
a = m0;
b = n0;
while (q[a][b].e != ' ') {
a = area(COUNT);
b = area(COUNT);
}
m = m0;
n = n0;
q[a][b].e = 'x';
t++;
k[1] = news(&k[0], 4);
while (y) {
system("cls");
while ((c = next(k[1], &m0, &n0)) != 4 || q[m0][n0].e == 'o') {
m0 = m;
n0 = n;
k[1] = news(&k[0], c);
}
m = m0;
n = n0;
if (q[m][n].e == 'x') {
t++;
q[m][n].w = 1;
for (io = 0; io < COUNT; io++) {
for (oi = 0; oi < COUNT; oi++) {
if (q[io][oi].w != 0) {
q[io][oi].w++;
q[io][oi].e = 'o';
}
}
}
q[m][n].w--;
q[m][n].e = '0';
while (q[a][b].e != ' ') {
a = area(COUNT);
b = area(COUNT);
}
q[a][b].e = 'x';
}
else {
q[m][n].w = 1;
for (io = 0; io < COUNT; io++) {
for (oi = 0; oi < COUNT; oi++) {
if (q[io][oi].w != 0) {
q[io][oi].w++;
q[io][oi].e = 'o';
}
if (q[io][oi].w == t + 1) {
q[io][oi].w = 0;
q[io][oi].e = ' ';
}
}
}
q[m][n].w = 1;
q[m][n].e = '0';
}
for (io = 0; io < COUNT; io++) {
for (oi = 0; oi < COUNT; oi++) {
putchar(q[io][oi].e);
}
putchar('\n');
}
k[1] = news(&k[0], 4);
if (q[m + 1][n].e != ' ' && q[m - 1][n].e != ' ' && q[m][n + 1].e != ' ' && q[m][n - 1].e != ' ')
y = 0;
Sleep(100);
}
puts("\n\n game over\nyour score is %d \n", t - 1);
return 0;
}
//这是头文件
#define COUNT 9
int news(int *, int);
int area(int);
int next(int, int *, int *);
void print(void);
struct Area {
int w;
char e;
} q[COUNT][COUNT];
//这是函数实现源文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"kky.h"
int news(int *q, int t) {
int p;
int k = *q;
if (k == 3)
k = 1;
else if (k == 0)
k = 2;
else if (k == 1)
k = 3;
else if (k == 2)
k = 0;
srand((unsigned)time(NULL));
while ((p = rand() % 4) == k || p == t);
*q = p;
return p;
}
int area(int q) {
srand((unsigned)time(NULL));
return (rand() % (q - 2) + 1);
}
int next(int k, int *m, int *n) {
switch (k) {
case 0:
if (*n + 1 >= COUNT - 1)
return 0;
(*n)++;
break;
case 1:
if (*m + 1 >= COUNT - 1)
return 1;
(*m)++;
break;
case 2:
if (*n - 1 <= 0)
return 2;
(*n)--;
break;
case 3:
if (*m - 1 <= 0)
return 3;
(*m)--;
break;
}
return 4;
}
void print(void) {
int io, oi;
for (io = 0; io < COUNT; io++) {
for (oi = 0; oi < COUNT; oi++) {
putchar(q[io][oi].e);
}
putchar('\n');
}
}
(其中对贪吃蛇下一步方向的判断的实现上写得是很糟糕的,读者可以自己重新设计一下这方面的算法,因为人较懒就没打算优化了,不过应该很简单的。运行应该没什么问题。有兴趣可以玩一下。至于详细解析就不在这写了,想要的话可以翻一翻我的博客。我会在下一篇中介绍的。)