把你的邮箱给我,我把源程序发给你,或者你自己从网上下载,这个snake程序是NetBSD操作系统源代码的一部分,要是你能发现Bug,我先恭喜你。

/* $NetBSD: snake.c,v 1.9 1997/10/12 01:49:28 lukem Exp $ */

/*

* Copyright (c) 1980, 1993

* The Regents of the University of California. All rights reserved.

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions

* are met:

* 1. Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer.

* 2. Redistributions in binary form must reproduce the above copyright

* notice, this list of conditions and the following disclaimer in the

* documentation and/or other materials provided with the distribution.

* 3. All advertising materials mentioning features or use of this software

* must display the following acknowledgement:

* This product includes software developed by the University of

* California, Berkeley and its contributors.

* 4. Neither the name of the University nor the names of its contributors

* may be used to endorse or promote products derived from this software

* without specific prior written permission.

*

* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

* SUCH DAMAGE.

*/

#include

#ifndef lint

__COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\

The Regents of the University of California. All rights reserved.\n");

#endif /* not lint */

#ifndef lint

#if 0

static char sccsid[] = "@(#)snake.c 8.2 (Berkeley) 1/7/94";

#else

__RCSID("$NetBSD: snake.c,v 1.9 1997/10/12 01:49:28 lukem Exp $");

#endif

#endif /* not lint */

/*

* snake - crt hack game.

*

* You move around the screen with arrow keys trying to pick up money

* without getting eaten by the snake. hjkl work as in vi in place of

* arrow keys. You can leave at the exit any time.

*

* compile as follows:

* cc -O snake.c move.c -o snake -lm -ltermlib

*/

#include

#include

#include

#include

#include

#include

#include

#include "snake.h"

#include "pathnames.h"

#define PENALTY 10 /* % penalty for invoking spacewarp */

#define EOT '\004'

#define LF '\n'

#define DEL '\177'

#define ME 'I'

#define SNAKEHEAD 'S'

#define SNAKETAIL 's'

#define TREASURE '$'

#define GOAL '#'

#define BSIZE 80

struct point you;

struct point money;

struct point finish;

struct point snake[6];

int loot, penalty;

int long tl, tm = 0L;

int moves;

char stri[BSIZE];

char *p;

char ch, savec;

char *kl, *kr, *ku, *kd;

int fast = 1;

int repeat = 1;

time_t tv;

char *tn;

int main __P((int, char **));

int

main(argc, argv)

int argc;

char **argv;

{

extern char *optarg;

extern int optind;

int ch, i;

(void) time(&tv);

srandom((int) tv);

while ((ch = getopt(argc, argv, "l:w:")) != -1)

switch ((char) ch) {

#ifdef notdef

case 'd':

tv = atol(optarg);

break;

#endif

case 'w': /* width */

ccnt = atoi(optarg);

break;

case 'l': /* length */

lcnt = atoi(optarg);

break;

case '?':

default:

fputs("usage: snake [-d seed] [-w width] [-l length]\n", stderr);

exit(1);

}

penalty = loot = 0;

getcap();

i = MIN(lcnt, ccnt);

if (i < 4) {

cook();

pr("snake: screen too small for a fair game.\n");

exit(1);

}

/*

* chunk is the amount of money the user gets for each $.

* The formula below tries to be fair for various screen sizes.

* We only pay attention to the smaller of the 2 edges, since

* that seems to be the bottleneck.

* This formula is a hyperbola which includes the following points:

* (24, $25) (original scoring algorithm)

* (12, $40) (experimentally derived by the "feel")

* (48, $15) (a guess)

* This will give a 4x4 screen $99/shot. We don't allow anything

* smaller than 4x4 because there is a 3x3 game where you can win

* an infinite amount of money.

*/

if (i < 12)

i = 12; /* otherwise it isn't fair */

/*

* Compensate for border. This really changes the game since

* the screen is two squares smaller but we want the default

* to be $25, and the high scores on small screens were a bit

* much anyway.

*/

i += 2;

chunk = (675.0 / (i + 6)) + 2.5; /* min screen edge */

signal(SIGINT, stop);

putpad(TI); /* String to begin programs that use cm */

putpad(KS); /* Put terminal in keypad transmit mode */

snrand(&finish);

snrand(&you);

snrand(&money);

snrand(&snake[0]);

if (ospeed < 9600 || ((!CM) && (!TA)))

fast = 0;

for (i = 1; i < 6; i++)

chase(&snake[i], &snake[i - 1]);

setup();

mainloop();

/* NOTREACHED */

return (0);

}

/* Main command loop */

void

mainloop()

{

int j, k;

for (;;) {

int c, lastc, match;

lastc = 0;

move(&you);

fflush(stdout);

if (((c = getchar() & 0177) <= '9') && (c >= '0')) {

ungetc(c, stdin);

j = scanf("%d", &repeat);

c = getchar() & 0177;

} else {

if (c != '.')

repeat = 1;

}

if (c == '.') {

c = lastc;

}

if ((Klength > 0) &&

(c == *KL || c == *KR || c == *KU || c == *KD)) {

savec = c;

match = 0;

kl = KL;

kr = KR;

ku = KU;

kd = KD;

for (j = Klength; j > 0; j--) {

if (match != 1) {

match = 0;

if (*kl++ == c) {

ch = 'h';

match++;

}

if (*kr++ == c) {

ch = 'l';

match++;

}

if (*ku++ == c) {

ch = 'k';

match++;

}

if (*kd++ == c) {

ch = 'j';

match++;

}

if (match == 0) {

ungetc(c, stdin);

ch = savec;

/* Oops! This works if we

* figure it out on second

* character. */

break;

}

}

savec = c;

if (j != 1)

c = getchar() & 0177;

}

c = ch;

}

if (!fast)

flushi();

lastc = c;

switch (c) {

case CTRL('z'):

suspend();

continue;

case EOT:

case 'x':

case 0177: /* del or end of file */

ll();

length(moves);

logit("quit");

done();

case CTRL('l'):

setup();

winnings(cashvalue);

continue;

case 'p':

case 'd':

snap();

continue;

case 'w':

spacewarp(0);

continue;

case 'A':

repeat = you.col;

c = 'h';

break;

case 'H':

case 'S':

repeat = you.col - money.col;

c = 'h';

break;

case 'T':

repeat = you.line;

c = 'k';

break;

case 'K':

case 'E':

repeat = you.line - money.line;

c = 'k';

break;

case 'P':

repeat = ccnt - 1 - you.col;

c = 'l';

break;

case 'L':

case 'F':

repeat = money.col - you.col;

c = 'l';

break;

case 'B':

repeat = lcnt - 1 - you.line;

c = 'j';

break;

case 'J':

case 'C':

repeat = money.line - you.line;

c = 'j';

break;

}

for (k = 1; k <= repeat; k++) {

moves++;

switch (c) {

case 's':

case 'h':

case '\b':

if (you.col > 0) {

if ((fast) || (k == 1))

pchar(&you, ' ');

you.col--;

if ((fast) || (k == repeat) ||

(you.col == 0))

pchar(&you, ME);

}

break;

case 'f':

case 'l':

case ' ':

if (you.col < ccnt - 1) {

if ((fast) || (k == 1))

pchar(&you, ' ');

you.col++;

if ((fast) || (k == repeat) ||

(you.col == ccnt - 1))

pchar(&you, ME);

}

break;

case CTRL('p'):

case 'e':

case 'k':

case 'i':

if (you.line > 0) {

if ((fast) || (k == 1))

pchar(&you, ' ');

you.line--;

if ((fast) || (k == repeat) ||

(you.line == 0))

pchar(&you, ME);

}

break;

case CTRL('n'):

case 'c':

case 'j':

case LF:

case 'm':

if (you.line + 1 < lcnt) {

if ((fast) || (k == 1))

pchar(&you, ' ');

you.line++;

if ((fast) || (k == repeat) ||

(you.line == lcnt - 1))

pchar(&you, ME);

}

break;

}

if (same(&you, &money)) {

loot += 25;

if (k < repeat)

pchar(&you, ' ');

do {

snrand(&money);

} while ((money.col == finish.col &&

money.line == finish.line) ||

(money.col < 5 && money.line == 0) ||

(money.col == you.col &&

money.line == you.line));

pchar(&money, TREASURE);

winnings(cashvalue);

continue;

}

if (same(&you, &finish)) {

win(&finish);

ll();

cook();

pr("You have won with $%d.\n", cashvalue);

fflush(stdout);

logit("won");

post(cashvalue, 1);

length(moves);

done();

}

if (pushsnake())

break;

}

fflush(stdout);

}

}

/*

* setup the board

*/

void

setup()

{

int i;

clear();

pchar(&you, ME);

pchar(&finish, GOAL);

pchar(&money, TREASURE);

for (i = 1; i < 6; i++) {

pchar(&snake[i], SNAKETAIL);

}

pchar(&snake[0], SNAKEHEAD);

drawbox();

fflush(stdout);

}

void

drawbox()

{

int i;

struct point p;

p.line = -1;

for (i = 0; i < ccnt; i++) {

p.col = i;

pchar(&p, '-');

}

p.col = ccnt;

for (i = -1; i <= lcnt; i++) {

p.line = i;

pchar(&p, '|');

}

p.col = -1;

for (i = -1; i <= lcnt; i++) {

p.line = i;

pchar(&p, '|');

}

p.line = lcnt;

for (i = 0; i < ccnt; i++) {

p.col = i;

pchar(&p, '-');

}

}

void

snrand(sp)

struct point *sp;

{

struct point p;

int i;

for (;;) {

p.col = random() % ccnt;

p.line = random() % lcnt;

/* make sure it's not on top of something else */

if (p.line == 0 && p.col < 5)

continue;

if (same(&p, &you))

continue;

if (same(&p, &money))

continue;

if (same(&p, &finish))

continue;

for (i = 0; i < 5; i++)

if (same(&p, &snake[i]))

break;

if (i < 5)

continue;

break;

}

*sp = p;

}

int

post(iscore, flag)

int iscore, flag;

{

short score = iscore;

int rawscores;

short uid;

short oldbest = 0;

short allbwho = 0, allbscore = 0;

struct passwd *p;

/*

* Neg uid, 0, and 1 cannot have scores recorded.

*/

if ((uid = getuid()) <= 1) {

pr("No saved scores for uid %d.\n", uid);

return (1);

}

if ((rawscores = open(_PATH_RAWSCORES, O_RDWR | O_CREAT, 0644)) < 0) {

pr("No score file %s: %s.\n", _PATH_RAWSCORES,

strerror(errno));

return (1);

}

/* Figure out what happened in the past */

read(rawscores, &allbscore, sizeof(short));

read(rawscores, &allbwho, sizeof(short));

lseek(rawscores, uid * sizeof(short), 0);

read(rawscores, &oldbest, sizeof(short));

if (!flag)

return (score > oldbest ? 1 : 0);

/* Update this jokers best */

if (score > oldbest) {

lseek(rawscores, uid * sizeof(short), 0);

write(rawscores, &score, sizeof(short));

pr("You bettered your previous best of $%d\n", oldbest);

} else

pr("Your best to date is $%d\n", oldbest);

/* See if we have a new champ */

p = getpwuid(allbwho);

if (p == NULL || score > allbscore) {

lseek(rawscores, 0, 0);

write(rawscores, &score, sizeof(short));

write(rawscores, &uid, sizeof(short));

if (allbwho)

pr("You beat %s's old record of $%d!\n",

p->pw_name, allbscore);

else

pr("You set a new record!\n");

} else

pr("The highest is %s with $%d\n", p->pw_name, allbscore);

close(rawscores);

return (1);

}

/*

* Flush typeahead to keep from buffering a bunch of chars and then

* overshooting. This loses horribly at 9600 baud, but works nicely

* if the terminal gets behind.

*/

void

flushi()

{

tcflush(0, TCIFLUSH);

}

int mx[8] = {

0, 1, 1, 1, 0, -1, -1, -1

};

int my[8] = {

-1, -1, 0, 1, 1, 1, 0, -1

};

float absv[8] = {

1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4

};

int oldw = 0;

void

chase(np, sp)

struct point *sp, *np;

{

/* this algorithm has bugs; otherwise the snake would get too good */

struct point d;

int w, i, wt[8];

double v1, v2, vp, max;

point(&d, you.col - sp->col, you.line - sp->line);

v1 = sqrt((double) (d.col * d.col + d.line * d.line));

w = 0;

max = 0;

for (i = 0; i < 8; i++) {

vp = d.col * mx[i] + d.line * my[i];

v2 = absv[i];

if (v1 > 0)

vp = ((double) vp) / (v1 * v2);

else

vp = 1.0;

if (vp > max) {

max = vp;

w = i;

}

}

for (i = 0; i < 8; i++) {

point(&d, sp->col + mx[i], sp->line + my[i]);

wt[i] = 0;

if (d.col < 0 || d.col >= ccnt || d.line < 0 || d.line >= lcnt)

continue;

/*

* Change to allow snake to eat you if you're on the money,

* otherwise, you can just crouch there until the snake goes

* away. Not positive it's right.

*

* if (d.line == 0 && d.col < 5) continue;

*/

if (same(&d, &money))

continue;

if (same(&d, &finish))

continue;

wt[i] = i == w ? loot / 10 : 1;

if (i == oldw)

wt[i] += loot / 20;

}

for (w = i = 0; i < 8; i++)

w += wt[i];

vp = ((rand() >> 6) & 01777) % w;

for (i = 0; i < 8; i++)

if (vp < wt[i])

break;

else

vp -= wt[i];

if (i == 8) {

pr("failure\n");

i = 0;

while (wt[i] == 0)

i++;

}

oldw = w = i;

point(np, sp->col + mx[w], sp->line + my[w]);

}

void

spacewarp(w)

int w;

{

struct point p;

int j;

char *str;

snrand(&you);

point(&p, COLUMNS / 2 - 8, LINES / 2 - 1);

if (p.col < 0)

p.col = 0;

if (p.line < 0)

p.line = 0;

if (w) {

str = "BONUS!!!";

loot = loot - penalty;

penalty = 0;

} else {

str = "SPACE WARP!!!";

penalty += loot / PENALTY;

}

for (j = 0; j < 3; j++) {

clear();

delay(5);

apr(&p, str);

delay(10);

}

setup();

winnings(cashvalue);

}

void

snap()

{

struct point p;

if (you.line < 3) {

pchar(point(&p, you.col, 0), '-');

}

if (you.line > lcnt - 4) {

pchar(point(&p, you.col, lcnt - 1), '_');

}

if (you.col < 10) {

pchar(point(&p, 0, you.line), '(');

}

if (you.col > ccnt - 10) {

pchar(point(&p, ccnt - 1, you.line), ')');

}

if (!stretch(&money))

if (!stretch(&finish))

delay(10);

if (you.line < 3) {

point(&p, you.col, 0);

chk(&p);

}

if (you.line > lcnt - 4) {

point(&p, you.col, lcnt - 1);

chk(&p);

}

if (you.col < 10) {

point(&p, 0, you.line);

chk(&p);

}

if (you.col > ccnt - 10) {

point(&p, ccnt - 1, you.line);

chk(&p);

}

fflush(stdout);

}

int

stretch(ps)

struct point *ps;

{

struct point p;

point(&p, you.col, you.line);

if (abs(ps->col - you.col) < 6) {

if (you.line < ps->line) {

for (p.line = you.line + 1; p.line <= ps->line;

p.line++)

pchar(&p, 'v');

delay(10);

for (; p.line > you.line; p.line--)

chk(&p);

} else {

for (p.line = you.line - 1; p.line >= ps->line;

p.line--)

pchar(&p, '^');

delay(10);

for (; p.line < you.line; p.line++)

chk(&p);

}

return (1);

} else

if (abs(ps->line - you.line) < 3) {

p.line = you.line;

if (you.col < ps->col) {

for (p.col = you.col + 1; p.col <= ps->col;

p.col++)

pchar(&p, '>');

delay(10);

for (; p.col > you.col; p.col--)

chk(&p);

} else {

for (p.col = you.col - 1; p.col >= ps->col;

p.col--)

pchar(&p, '

delay(10);

for (; p.col < you.col; p.col++)

chk(&p);

}

return (1);

}

return (0);

}

void

surround(ps)

struct point *ps;

{

struct point x;

int j;

if (ps->col == 0)

ps->col++;

if (ps->line == 0)

ps->line++;

if (ps->line == LINES - 1)

ps->line--;

if (ps->col == COLUMNS - 1)

ps->col--;

apr(point(&x, ps->col - 1, ps->line - 1), "/*\\\r* *\r\\*/");

for (j = 0; j < 20; j++) {

pchar(ps, '@');

delay(1);

pchar(ps, ' ');

delay(1);

}

if (post(cashvalue, 0)) {

apr(point(&x, ps->col - 1, ps->line - 1), " \ro.o\r\\_/");

delay(6);

apr(point(&x, ps->col - 1, ps->line - 1), " \ro.-\r\\_/");

delay(6);

}

apr(point(&x, ps->col - 1, ps->line - 1), " \ro.o\r\\_/");

}

void

win(ps)

struct point *ps;

{

struct point x;

int j, k;

int boxsize; /* actually diameter of box, not radius */

boxsize = fast ? 10 : 4;

point(&x, ps->col, ps->line);

for (j = 1; j < boxsize; j++) {

for (k = 0; k < j; k++) {

pchar(&x, '#');

x.line--;

}

for (k = 0; k < j; k++) {

pchar(&x, '#');

x.col++;

}

j++;

for (k = 0; k < j; k++) {

pchar(&x, '#');

x.line++;

}

for (k = 0; k < j; k++) {

pchar(&x, '#');

x.col--;

}

}

fflush(stdout);

}

int

pushsnake()

{

int i, bonus;

int issame = 0;

/*

* My manual says times doesn't return a value. Furthermore, the

* snake should get his turn every time no matter if the user is

* on a fast terminal with typematic keys or not.

* So I have taken the call to times out.

*/

for (i = 4; i >= 0; i--)

if (same(&snake[i], &snake[5]))

issame++;

if (!issame)

pchar(&snake[5], ' ');

for (i = 4; i >= 0; i--)

snake[i + 1] = snake[i];

chase(&snake[0], &snake[1]);

pchar(&snake[1], SNAKETAIL);

pchar(&snake[0], SNAKEHEAD);

for (i = 0; i < 6; i++) {

if (same(&snake[i], &you)) {

surround(&you);

i = (cashvalue) % 10;

bonus = ((rand() >> 8) & 0377) % 10;

ll();

pr("%d\n", bonus);

delay(30);

if (bonus == i) {

spacewarp(1);

logit("bonus");

flushi();

return (1);

}

if (loot >= penalty) {

pr("You and your $%d have been eaten\n",

cashvalue);

} else {

pr("The snake ate you. You owe $%d.\n",

-cashvalue);

}

logit("eaten");

length(moves);

done();

}

}

return (0);

}

int

chk(sp)

struct point *sp;

{

int j;

if (same(sp, &money)) {

pchar(sp, TREASURE);

return (2);

}

if (same(sp, &finish)) {

pchar(sp, GOAL);

return (3);

}

if (same(sp, &snake[0])) {

pchar(sp, SNAKEHEAD);

return (4);

}

for (j = 1; j < 6; j++) {

if (same(sp, &snake[j])) {

pchar(sp, SNAKETAIL);

return (4);

}

}

if ((sp->col < 4) && (sp->line == 0)) {

winnings(cashvalue);

if ((you.line == 0) && (you.col < 4))

pchar(&you, ME);

return (5);

}

if (same(sp, &you)) {

pchar(sp, ME);

return (1);

}

pchar(sp, ' ');

return (0);

}

void

winnings(won)

int won;

{

struct point p;

p.line = p.col = 1;

if (won > 0) {

move(&p);

pr("$%d", won);

}

}

void

stop(dummy)

int dummy;

{

signal(SIGINT, SIG_IGN);

ll();

length(moves);

done();

}

void

suspend()

{

ll();

cook();

kill(getpid(), SIGTSTP);

raw();

setup();

winnings(cashvalue);

}

void

length(num)

int num;

{

pr("You made %d moves.\n", num);

}

void

logit(msg)

const char *msg;

{

FILE *logfile;

time_t t;

if ((logfile = fopen(_PATH_LOGFILE, "a")) != NULL) {

time(&t);

fprintf(logfile, "%s $%d %dx%d %s %s",

getlogin(), cashvalue, lcnt, ccnt, msg, ctime(&t));

fclose(logfile);

}

}

参考资料:netbsd/src/bin/echo

回答者: wangdan1600 - 经理 四级   1-1 19:26

我来评论>>

提问者对于答案的评价:谢谢了评价已经被关闭    目前有 0 个人评价

50% (0) 不好

50% (0)

相关内容

•  哪里有下贪吃蛇的C/C++/VB代码,或者谁能说一下思路

•  关于VC贪吃蛇的问题

•  要做出贪吃蛇等小游戏,要看哪几本C语言书啊!

•  贪吃蛇 电脑高手请进!

•  编写贪吃蛇需要用到哪几种软件和编写的程序.

查看同主题问题:贪吃蛇 语言 思路

其他回答    共 1 条

#define N 200

#include

#include

#include

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=50000;/*游戏速度自己调整*/

struct Food

{

int x;/*食物的横坐标*/

int y;/*食物的纵坐标*/

int yes;/*判断是否要出现食物的变量*/

}food;/*食物的结构体*/

struct Snake

{

int x[N];

int y[N];

int node;/*蛇的节数*/

int direction;/*蛇移动方向*/

int life;/* 蛇的生命,0活着,1死亡*/

}snake;

void Init(void);/*图形驱动*/

void Close(void);/*图形结束*/

void DrawK(void);/*开始画面*/

void GameOver(void);/*结束游戏*/

void GamePlay(void);/*玩游戏具体过程*/

void PrScore(void);/*输出成绩*/

/*主函数*/

void main(void)

{

Init();/*图形驱动*/

DrawK();/*开始画面*/

GamePlay();/*玩游戏具体过程*/

Close();/*图形结束*/

}

/*图形驱动*/

void Init(void)

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

}

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

void DrawK(void)

{

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/

for(i=50;i<=600;i+=10)/*画围墙*/

{

rectangle(i,40,i+10,49); /*上边*/

rectangle(i,451,i+10,460);/*下边*/

}

for(i=40;i<=450;i+=10)

{

rectangle(50,i,59,i+10); /*左边*/

rectangle(601,i,610,i+10);/*右边*/

}

}

/*玩游戏具体过程*/

void GamePlay(void)

{

randomize();/*随机数发生器*/

food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/

snake.life=0;/*活着*/

snake.direction=1;/*方向往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇头*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*节数*/

PrScore();/*输出得分*/

while(1)/*可以重复玩游戏,压ESC键结束*/

{

while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/

{

if(food.yes==1)/*需要出现新食物*/

{

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/

}

if(food.yes==0)/*画面上有食物了就要显示*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);

}

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

{

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];

}

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

switch(snake.direction)

{

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break;

}

for(i=3;i

{

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

{

GameOver();/*显示失败*/

snake.life=1;

break;

}

}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到墙壁*/

{

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/

}

if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/

{

setcolor(0);/*把画面上的食物东西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++;/*蛇的身体长一节*/

food.yes=1;/*画面上需要出现新的食物*/

score+=10;

PrScore();/*输出新得分*/

}

setcolor(4);/*画出蛇*/

for(i=0;i

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最后一节*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

} /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循环*/

break;

key=bioskey(0);/*接收按键*/

if(key==ESC)/*按ESC键退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判断是否往相反的方向移动*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/

}

/*游戏结束*/

void GameOver(void)

{

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();

}

/*输出成绩*/

void PrScore(void)

{

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);

}

/*图形结束*/

void Close(void)

{

getch();

closegraph();

}

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

c语言做贪吃蛇怎么记住成绩,用C语言编写贪吃蛇的思路是怎样的?相关推荐

  1. c语言从键盘输入一个百分制成绩score,C语言 基础练习40题

    一.题目 1.输入2个整数,求两数的平方和并输出. 2. 输入一个圆半径(r)当r>=0时,计算并输出圆的面积和周长,否则,输出提示信息. 3.函数y=f(x)可表示为: 4.编写一个程序,从4 ...

  2. 为备考二级C语言做的代码练习---辅导资料《C语言经典编程282例》--(1)

    因为二级考试的时候用的C语言编译器是VC++6.0 真是日了狗了 用这个编译器 这是我第2个C编译器吧,第一个用的是啊哈C编译器..第二个是VS++6.0 然后在win下用VS2013感觉挺不错的 毕 ...

  3. r语言做断轴_手把手教你用R语言做回归后的残差分析

    本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析. 在这篇文章中,我们通过探索残差分析和用R可视化结果,深入研究了R语言. 残差本质上是当一个给定的模型(在文中是线性回归)不完全符合给 ...

  4. 欧框语言框架标准C2,雅思成绩与欧洲语言共同参考框架的对应关系

    摘要:作为全球性标准化语言测评,雅思考试通过其权威而可靠的考试方法及分数计算方式,成为世界各地普遍使用的语言测评工具,并且同欧洲语言参考框架(以下简称CEFR)之间具有明显的对应关系.本文主要介绍欧洲 ...

  5. c语言从键盘输入一个百分制成绩score,C语言程序设计实验实验指导书及答案

    1 <C语言程序设计>实验指导书 常熟理工学院 电气与自动化工程学院实验一 熟悉C程序运行环境 班级 学号 姓名 成绩 一.实验目的 1. 熟悉C语言Visual C++6.0调试环境. ...

  6. C语言做一个36除以2的循环,C语言循环练习2,建议做做

    写在前面:这里是小王成长日志,一名在校大学生,想在学习之余将自己的学习笔记分享出来,记录自己的成长轨迹,帮助可能需要的人.欢迎关注与留言. 1.下列程序的功能为:输出100以内能被3整除且个位数为6的 ...

  7. c语言定义数组输入10同学成绩,用C语言 1.定义一个数组a[11],用以存放学生的成绩,2.从键盘输入10个学生成绩...

    满意答案 lin198585 2014.09.21 采纳率:52%    等级:9 已帮助:1013人 #include #define N 11 main() { int i,j; double s ...

  8. c语言做n行n列的方阵,C语言编程,求 给定一个n行n列(n=10)的二维整数方阵,要求在这个矩阵中找出一个子矩阵,该子矩阵中所有...

    满意答案 yxwzhen9538 推荐于 2017.11.24 采纳率:45%    等级:12 已帮助:14851人 #include main() { int e,i,j,m,n,a,b,k,l; ...

  9. c语言函数游戏,C语言做游戏常用到一些函数大全 2011.doc

    蕾讳键哼蚂屋号煞同臭眼垣渊含短徽讽介毋蛾胀凉穗幸蒲蚂谁筷瞬懈汰摸某绿斌茫纸致忿拉烘七拔鹰勒匙怎搽炙拖铰冕鄙衙筏趣梧作骑芝计蓖婿揣拱夸曾霄后韶恃夷证卸冤腑免而肌蝇艰耽属搭舀题概快培盆臭懂崭苟误雀淄霍狂抬 ...

  10. python与c语言在语法上的区别-python和c语言的区别是什么

    Python可以说是目前最火的语言之一了,人工智能的兴起让Python一夜之间变得家喻户晓,Python号称目前最最简单易学的语言,现在有不少高校开始将Python作为大一新生的入门语言.本萌新也刚开 ...

最新文章

  1. 用Python轻松搞定Excel中的20个常用操作
  2. css label 居中布局_HTMLCSS精华知识点——表单元素、BFC、两栏布局、居中总结等...
  3. 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境(服务器端及客户端)(转)...
  4. Idea terminal:不是内部或外部命令,也不是可行的程序或批处理文件
  5. python中re模块_python中re模块的使用以及一些正则表达式的总结
  6. 动画函数requestAnimationFrame
  7. 列表子集Python解法
  8. [禅悟人生]心平气和, 慢慢修行
  9. 初学python之路-day04
  10. mysql pt_MySQL慢查询之pt-query-digest分析慢查询日志
  11. 动态语言会淘汰静态语言吗?
  12. NOI2018网络同步赛爆零记
  13. linux将passwd文件拷贝到,Linux命令
  14. WinRAR 4.01 简体中文版 [0530]
  15. 斐波那契数列各种方法求解
  16. 小目标检测的一些理解
  17. java 红绿灯_java -- GUI 红绿灯
  18. JAVA消息(第一篇)JMS 很重要!!!!包教包会!!不闹!!!下一篇-AMQP(wire-level protocol)
  19. 用C++实现一个小小的爬虫
  20. Linux per_cpu机制的详解

热门文章

  1. Haar人脸检测:Haar特征 + Adaboost+ 级联分类器及改进
  2. SAP 批导模板(WBS批导为例)
  3. 【Spark】Spark安装详解
  4. 【Python 3.7.9官方文档】之术语对照表
  5. windows下一键修改IP地址
  6. DIY基于Arduino的CNC绘图机
  7. 朱丹超级搜索术笔记:百度搜索相关的技巧
  8. python调用默认播放器_在PotPlayer和MPV挂载SVP脚本进行补帧的部署方法
  9. AE、PR视频压缩导出mp4、mov格式插件:AfterCodecs1.6.1汉化破解版
  10. c语言面试题集,c语言面试题集经典