搜档网
当前位置:搜档网 › C语言编写的《俄罗斯方块》详解

C语言编写的《俄罗斯方块》详解

C语言编写的《俄罗斯方块》详解
C语言编写的《俄罗斯方块》详解

C语言编写的《俄罗斯方块》详解.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。就算是一坨屎,也有遇见屎壳郎的那天。所以你大可不必为今天的自己有太多担忧。335280641

Tc2.0 编写俄罗斯方块游戏

很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后,

问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,

而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。

俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。

这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。

最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。

我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。

下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。

关于俄罗斯方块程序的一些问题:

******************************************************

Tc2.0中怎么样设置图形显示?

Tc2.0中常用图形函数的用法?

怎样获取鍵盘输入?

怎样控制方块的移动?

怎样控制时间间隔(用于游戏中控制形状的下落)?

游戏中的各种形状及整个游戏空间怎么用数据表示?

游戏中怎么判断左右及向下移动的可能性?

游戏中怎么判断某一形状旋转的可能性?

按向下方向键时加速某一形状下落速度的处理?

怎么判断某一形状已经到底?

怎么判断某一已经被填满?

怎么消去已经被填满的一行?

怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行)

怎样修改游戏板的状态?

怎样统计分数?

怎样处理升级后的加速问题?

怎样判断游戏结束?

关于计分板设计的问题。

关于“下一个”形状取法的问题。

剩下的问题。

******************************************************

新的问题:

我想有一个最高记录的显示,应该怎么做呀?

我想实现一个进度存储功能,应该怎么做呀?

Tc2.0中怎么样设置图形显示?

Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。一般是显示25

行,每行80个字符。程序缺省的是字符模式。在字符模式下不能显式图形和进行绘图操作。要想进行图形显示和绘图操作,必须切换到图形模

式下。

Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。initgraph()和closegraph()都是图形

函数,使用图形函数必须包括头文件"graphics.h"。

void far initgraph(int far *graphdriver,int far *graphmode,char far *pathtodriver);graphdriver是上涨指向图形驱动序号变量

的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针。pathtodriver表示存放图形驱动文件的路径。

Tc2.0中有多种图形驱动,每种图形驱动下又有几种图形显示模式。在我的程序中图形驱动序号为VGA,图形显示模式序号为VGAHI。

这是一种分辨率为640*480(从左到右坐标依次为0-639,从上到下坐标依次为0-479),能够显示16种颜色的图形模式。别的图形驱动序号和

图形显示模式序号,可以从手册或联机帮助中找到。

pathtodriver指示存放图形驱动文件的路径。图形驱动序号不同,图形驱动文件也不同。序号为VGA图形驱动对应"egavga.bgi"这个

图形驱动文件。"egavga.bgi"一般在Tc目录下。

void far closegraph(void);

没有参数,从图形模式直接返回字符模式。

initgraph()和closegraph()的常用用法如下:

int gdriver = VGA, gmode=VGAHI, errorcode;

/* initialize graphics mode */

initgraph(&gdriver, &gmode, "e:\\tc2");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* return with error code */

}

/* return to text mode */

closegraph();

Tc2.0中常用图形函数的用法?

在这里讲几个游戏中用到的绘图用的图形函数:

setcolor();

line();

rectangle();

settextjustify();

outtextxy();

setfillstyle();

bar();

void far setcolor(int color);

设置画线、画框和在图形模式下显示文字的当前颜色。这个函数将影响line()、rectangle()和outtextxy()函数绘图的颜色。

color可以取常的颜色常量:

BLACK ? 0

BLUE ? 1

GREEN ? 2

CYAN ? 3

RED ? 4

MAGENTA ? 5

BROWN ? 6

LIGHTGRAY ? 7

DARKGRAY ? 8

LIGHTBLUE ? 9

LIGHTGREEN ?10

LIGHTCYAN ?11

LIGHTRED ?12

LIGHTMAGENTA ?13

YELLOW ?14

WHITE ?15

void far line(int x1,int y1,int x2,int y2);

用当前颜色从(x1,y1)画一条到(x2,y2)的线段。

void far rectangle(int left,int top,int right,int bottom);

用当前颜色画一个左上角为(left,top)、右下角为(right,bottom)的矩形框。

void far settextjustify(int horz,int vert);

设置图形模式下文字输出的对齐方式。主要影响outtextxy()函数。

horiz和vert可取如下枚举常量:

horiz ?LEFT_TEXT ? 0 ?Left-justify text

?CENTER_TEXT ? 1 ?Center text

?RIGHT_TEXT ? 2 ?Right-justify text

vert ?BOTTOM_TEXT ? 0 ?Justify from bottom

?CENTER_TEXT ? 1 ?Center text

?TOP_TEXT ? 2 ?Justify from top

void far outtextxy(int x,int y,char * textstring);

在(x,y)处用当前字体(缺省的字体是DEFAULT_FONT)显示字符串textstring,字符串的对齐方式由settextjustify()指定。

void far setfillstyle(int pattern,int color);

设置图形的填充模式和填充颜色,主要影响bar()等函数。

pattern一般取枚举常量值SOLID_FILL,color的取值与setcolor(int color)中color的取值范围相同。

介绍完了前面两个问题,现在来写一个程序。这个程序演示前了面所介绍的几个图形函数。

程序prog1.c

怎样获取鍵盘输入?

在Tc2.0中有一个处理键盘输入的函数bioskey();

int bioskey(int cmd);

当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(任何按键码都不为0),但此时并不将检测到的按

键码从键盘缓冲队列中清除。

当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列

中清除。如果键盘缓冲队列为空,则一直等到有键按

下,才将得到的按键码返回。

Escape键的按键码为0x11b,下面的小程序可以获取按键的按键码。

for (;;)

{

key=bioskey(0); /* wait for a keystroke */

printf("0x%x\n",key);

if (key==0x11b) break; /* Escape */

}

常用按键的按键码如下:

#define VK_LEFT 0x4b00

#define VK_RIGHT 0x4d00

#define VK_DOWN 0x5000

#define VK_UP 0x4800

#define VK_HOME 0x4700

#define VK_END 0x4f00

#define VK_SPACE 0x3920

#define VK_ESC 0x011b

#define VK_ENTER 0x1c0d

完整的程序请参见prog2.c、prog3.c。

prog2.c获取按键的按键码,按Escape键退出程序。

prog3.c根据不同的按键进行不同的操作,按Escape键退出程序。

怎样控制方块的移动?

方块移动的实现很简单,将方块原来的位置用背景色画一个同样大小的方块,将原来的方块涂去。然后在新的位置上重新绘制方块就可以

了。这样就实现了方块的移动。完整的程序请参见prog4.c。这个用方向键控制一个黄色的小方块在屏幕上上、下、左、右移动。

这个程序用到了前面几个问题讲的内容,如果你有点忘了,还要回头看看哦。:)

怎样控制时间间隔(用于游戏中控制形状的下落)?

解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,在处理完正常的时钟中断后,将一个计时变量

加1。这样,每秒钟计时变量约增加18。需要控控制时间的时候,只需要看这个计时变量就行了。

截获时钟中断要用到函数getvect()和setvect()。

两个函数的声明如下:

?void interrupt (*getvect(int interruptno))();

?void setvect(int interruptno, void interrupt (*isr) ( ));

保留字interrupt指示函数是一个中断处理函数。在调用中断处理函数的时候,所有的寄存器将会被保存。中断处理函数的返回

时的指令是iret,而不是一般函数用到的ret指令。

getvect()根据中断号interruptno获取中断号为interruptno的中断处理函数的入口地址。setvect()将中断号为interruptno的中断处理函数的入口地址改为isr()函数的入口地址。即中断发生时,将调用isr()函数。

在程序开始的时候截获时钟中断,并设置新的中断处理。在程序结束的时候,一定要记着恢复时钟中断哦,不然系统的计时功能会出问题

的。具体演示程序请参见prog5.c。由于中断处理大家可能用的不多,所以我把prog5.c这个程序完整地贴在下面,并加上详细的解释。

/* prog5.c */

This is an interrupt service routine. You can NOT compile this

program with Test Stack Overflow turned on and get an executable

file which will operate correctly. */

/* 这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。

按escape键提前退出程序。*/

#include

#include

#include

/* Escape key */

#define VK_ESC 0x11b

#define TIMER 0x1c /* 时钟中断的中断号 */

/* 中断处理函数在C和C++中的表示略有不同。

如果定义了_cplusplus则表示在C++环境下,否则是在C环境下。 */

#ifdef __cplusplus

#define __CPPARGS ...

#else

#define __CPPARGS

#endif

int TimerCounter=0; /* 计时变量,每秒钟增加18。 */

/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */ void interrupt ( *oldhandler)(__CPPARGS);

/* 新的时钟中断处理函数 */

void interrupt newhandler(__CPPARGS)

{

/* increase the global counter */

TimerCounter++;

/* call the old routine */

oldhandler();

}

/* 设置新的时钟中断处理过程 */

void SetTimer(void interrupt (*IntProc)(__CPPARGS))

{

oldhandler=getvect(TIMER);

disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */ setvect(TIMER,IntProc);

enable(); /* 开启中断 */

}

/* 恢复原有的时钟中断处理过程 */

void KillTimer()

{

disable();

setvect(TIMER,oldhandler);

enable();

}

void main(void)

{

int key,time=0;

SetTimer(newhandler); /* 修改时钟中断 */

for (;;)

{

if (bioskey(1))

{

key=bioskey(0);

if (key==VK_ESC) /* 按escape键提前退出程序 */

{

printf("User cancel!\n");

break;

}

}

if (TimerCounter>18) /* 1秒钟处理一次 */

{

/* 恢复计时变量 */

TimerCounter=0;

time++;

printf("%d\n",time);

if (time==10) /* 10秒钟后结束程序 */

{

printf("Program terminated normally!\n");

break;

}

}

}

KillTimer(); /* 恢复时钟中断 */

}

游戏中的各种形状及整个游戏空间怎么用数据表示?

以后我提到的形状都是指下面七种形之一及它们旋转后的变形体。

□□□□□□□□□□□□□□□□

□■□□□■■□□□□□□□□□

□■□□□■□□□■□□□■■□

□■■□□■□□■■■□■■□□

□□□□□■□□□□□□

□□□□□■□□□□□□

■■□□□■□□□■■□

□■■□□■□□□■■□

我定义了一个结构来表示形状。

struct shape

{

int xy[8];

int color;

int next;

}

-1 0 1 2

-3□□□□

-2□□□□

-1□□□□

0□■□□

所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4

个数对来表示。坐标x从左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺

序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape 中的xy就是用来表示这4个数对的。为了简化程序

,用一维数组xy[8]来表示。xy[0]、xy[1]表示第一个数对,xy[2]、xy[3]表示第二个数对,依次类推。

shape中的color表示形状的颜色,不同的形状有不同的颜色。七种形状及它们旋转后的变形体一共有19种形状,用一个全局数组表示。

假定旋转的方向是逆时针方向(顺时针方向道理一样)。shape中的next就表示当前形状逆时针旋转后的下一个形状的序号。

例如:第一种形状及其旋

转变形的形状用结构表示如下。

□□□□□□□□□□□□□□□□

□■□□□□□□□■■□□□□□

□■□□□□■□□□■□■■■□

□■■□■■■□□□■□■□□□

struct shape shapes[19]=

{

/*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/

{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */

{-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */

{ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */

{-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */

……

}

游戏空间指的是整个游戏主要的界面(呵呵,这个定义我实在想不出更准确的,还请哪位大虾指点)。实际上是一个宽10格子、高20格子的

游戏板。用一个全局数组board[12][22]表示。表示的时候:board[x][y]为1时表示游戏板

上(x,y)这个位置上已经有方块占着了,board[x][y]

为0表示游戏板上这位置还空着。为了便于判断形状的移动是否到边、到底,初始的时候在游戏板的两边各加一列,在游戏板的下面加一行,全

部填上1,表示不能移出界。即board[0][y],board[11][y](其中y从0到21)初始都为1,board[x][21](其中x从1到10)初始都为1。

1 2 3 4 5 6 7 8 910

1□□□□□□□□□□

2□□□□□□□□□□

3□□□□□□□□□□

4□□□□□□□□□□

5□□□□□□□□□□

6□□□□□□□□□□

7□□□□□□□□□□

8□□□□□□□□□□

9□□□□□□□□□□

10□□□□□□□□□□

11□□□□□□□□□□

12□□□□□□□□□□

13□□□□□□□□□□

14□□□□□□□□□□

15□□□□□□□□□□

16□□□□□□□□□□

17□□□□□□□□□□

18□□□□□□□□□□

19□□□□□□□□□□

20□□□□□□□□□□

prog6.c演示了用结构表示各种形状的方法。虽然程序稍长一些,但并不是特别复杂。其中游戏板初始化部分并没有真正用到,

但是后面的程

序会用到的。其中SIZE定义为16,这样将整个屏幕的坐标系由原来的640×480转换成40×30(640/16=40,480/16=30)。游戏中所有的坐标

都是基于40×30的坐标系的,这样有助于简化程序。坐标的转换在程序中由DrawBlock(int x,int y)来体现。

新的坐标系如下图所示:

-8-7-6-5-4-3-2-1 0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031 -4□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

-3□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

-2□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

-1□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

0□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

1□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

2□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

3□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

4□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

5□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

6□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

7□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

8□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

9□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

10□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

11□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

12□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

13□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

14□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

15□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

16□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

17□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

18□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

19□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

20□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

21□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

22□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

23□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

24□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

25□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

26□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

新坐标中最主要的是就是上面两块黑色的部分。左边那块大的就是游戏板(横坐标从1到10,纵坐标从1到20),

右边那块小的就是显示“下一个”形状的部分(横坐标从14到17,纵坐标从3到6)。这个新的坐标系是整个游戏的基础,

后面所有的移动、变形等的计算都是基于这个坐标系的。

游戏中怎么判断左右及向下移动的可能性?

看懂了前面的各种形状和游戏板等的表示,接下来的东西就都好办多了。先来看一下某个形状如何显示在游戏板当中。

假设要在游戏板中

显示第一个形状。第一个形状在结构中的表示如下:

struct shape shapes[19]=

{

/*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/

{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1},

……

}

那么这个组成形状四个方块的坐标表示为(0,-2)、(0,-1)、(0,0)和(1,0)。这实际上是相对坐标。假形状的实际坐标指的是4x4方块

中的第

二列、第三行的方块的位置,设这个位置为(x,y)。那么组成这个形状的四个小方块的实际坐标(以第一个形状为例)

就是(x+0,y-2)、(x+0,y-1)、(x+0,y+0)和(x+1,y+0)。由于所有的形状都可以在4x4的方块阵列中表示,

这样就找到了一种统一的方法来表示所有的形状了。

-1 0 1 2

-3□□□□相对坐标

-2□■□□

-1□■□□组成第一种形状的四个方块的相对坐标为(0,-2)、(0,-1)、(0,0)和(1,0)。

0□■■□

让我们看看形状是如何显示在游戏板中的(以第一个形状为例)。

1 2 3 4 5 6 7 8 910

1□■□□□□□□□□形状的坐标为(2,3)。组成形状的四个方块的坐标由形状的

2□■□□□□□□□□坐标加上这四个小方块各自的相对坐标得出。它们分别是:

3□■■□□□□□□□ (2+0,3-2)、(2+0,3-1)、(2+0,3-0)和(2+1,3-0)。即:

4□□□□□□□□□□ (2,1)、(2,2)、(2,3)和(3,3)。如左图所示。

5□□□□□□□□□□

6□□□□□□□□□□

7■□□□□□□□□□形状的坐标为(1,9)。组成形状的四个方块的坐标分别是:

8■□□□□□□□□□ (1+0,9-2)、(1+0,9-1)、(1+0,9-0)和(1+1,9-0)。即:

9■■□□□□□□□□ (1,7)、(1,8)、(1,9)和(2,9)。如左图所示。

10□□□□□□□□□□

11□□□□□□□□□□

12□□□□□□□□□□

13□□□□□□□□□□

14□□□□□□□□□□

15□□□□□□□□□□

16□□□□□□□□□□

17□□□□□□□□□□

18□□□□□□□□■□形状的坐标为(9,20)。组成形状的四个方块的坐标分别是:

19□□□□□□□□■□ (9+0,20-2)、(9+0,20-1)、(9+0,20-0)和(9+1,20-0)。即:

20□□□□□□□□■■ (9,18)、(9,19)、(9,20)和(10,20)。如左图所示。

从现在起,我不再举别的示例程序了。从现在开始所有的示例代码均来自于我写的"Russia.c"。为了记录游戏板的状态,

用了一个全局数组board[12][22]。board[x][y](其中x从0到11,y从1到21)等于1表示(x,y)这个位置已经被填充了,

组成形状的四个方块的坐标都不能为(x,y),否则将发生冲突。board[x][y](其中x从1到10,y从1到20)等于表示(x,y)这个位置还没有被填充。

游戏板初始化时,给board[0][y],board[11][y](其中y从1到21)都赋为1,给board[x][21](其中x从1到10)都赋为1。

这相当于一开始就给游戏板左右和下方加了个“边”。所有的形状都不能够移入这个“边”,否则将发生冲突。

现在我们可以开始讨论如何判断一个形状向左、向右和向下移动的可能性了。先说个概

念,“当前形状”是指那个正在下落

还没有落到底的那个形状。如果当前形状向左移动,不与游戏板现有状态发生冲突,则可以向左移动。具体做法是:

先假设当前形状已经向左移动了,判断此时是否与游戏板现有状态发生冲突。如果不发生冲突,则可以向左移动。否则,不可以向左移动。

判断索引号为ShapeIndex的形状在坐标(x,y)是否与游戏板当前状态发生冲突的代码如下。我把详细的说明加在这段代码中。

enum bool Confilict(int ShapeIndex,int x,int y)

{

int i;

/* 对组成索引号为ShapeIndex的形状的四个方块依次判断 */

for (i=0;i<=7;i++,i++) /* i分别取0,2,4,6 */

{

/* 如果四个方块中有任何一个方块的x坐标小于1或大于10,表示超出左边界或右边界。此时,发生冲突。 */

if (shapes[ShapeIndex].xy+x<1 ||

shapes[ShapeIndex].xy+x>10) return True;

/* 如果四个方块中某个方块的y坐标小于1,表示整个形状还没有完全落入游戏板中。

此时,没有必要对这个方块进行判断。*/

if (shapes[ShapeIndex].xy[i+1]+y<1) continue;

/* 如果四个方块中有任何一个方块与游戏板当前状态发生冲突,则整个形状在(x,y)处

与游戏板当前状态冲突 */

if (board[shapes[ShapeIndex].xy+x][shapes[ShapeIndex].xy[i+1]+y])

return True;

}

/* 四个方块中没有任何一个方块与游戏板当前状态发生冲突,则整个形状在(x,y)处

没有与游戏板当前状态冲突 */

return False;

}

对以上代码附加说明如下:

shapes[ShapeIndex].xy(其中i等于0,2,4,6)表示组成索引号为ShapeIndex的形状的某个方块的x相对坐标。

(i等于0时,表示第1个方块的x相对坐标;i等于2时,表示第2个方块的x相对坐标;i 等于4时,表示第3个方块的x相对坐标;

i等于6时,表示第4个方块的x相对坐标。)

shapes[ShapeIndex].xy(其中i等于1,3,5,7)表示组成索引号为ShapeIndex的形状

的某个方块的y相对坐标。

(i等于1时,表示第1个方块的y相对坐标;i等于3时,表示第2个方块的y相对坐标;i 等于5时,表示第3个方块的y相对坐标

;i等于7时,表示第4个方块的y相对坐标。)

shapes[ShapeIndex].xy+x(其中i等于0,2,4,6)表示索引号为ShapeIndex的形状的坐标为(x,y)时,

组成该形状的某个方块的x实际坐标。(i等于0时,表示第1个方块的x实际坐标;i等于2时,表示第2个方块的x实际坐标;

i等于4时,表示第3个方块的x实际坐标;i等于6时,表示第4个方块的x实际坐标。)

shapes[ShapeIndex].xy+y(其中i等于1,3,5,7)表示索引号为ShapeIndex的形状的坐标为(x,y)时,

组成该形状的某个方块的y实际坐

标。(i等于1时,表示第1个方块的y实际坐标;i等于3时,表示第2个方块的y实际坐标;i等于5时,

表示第3个方块的y实际坐标;i等于7时,表示第4个方块的y实际坐标。)

现在来看看这句是什么意思吧。

board[shapes[ShapeIndex].xy+x][shapes[ShapeIndex].xy[i+1]+y]

可以这样理解,把上面一句分开来看::

ActualX=shapes[ShapeIndex].xy+x;/* 其中x为0,2,4,6 */

表示某个方块实际的x坐标。

ActualY=[shapes[ShapeIndex].xy[i+1]+y;

表示某个方块实际的y坐标。

board[ActualX][ActualY]就是与某个方块坐标相同处的游戏板的标志。如果此标志不为0(为1),表示这个方块与游戏板发生冲突。

如果此标志为0,表示这个方块没有与游戏板发生冲突。

这段写的比较长,但是不是特别难理解。游戏中很多地方都用到了这种相对坐标向实际坐标的转换方式,

看懂了这一段对理解其他部分的代码很有帮助。

仔细看过这段代码后,你可能会提一个问题:不是已经在游戏板的左右两边都加了“边”了吗,为什么还要加下面这个对x坐标的判断呢?

/* 如果四个方块中有任何一个方块的x坐标小于1或大于10,表示超出左边界或右边界。此时,发生冲突。 */

if (shapes[ShapeIndex].xy+x<1 ||

shapes[ShapeIndex].xy+x>10) return True;

这是因为有一种特殊情况,如下图所示:

■■

■ 2 3 4 5 6 7 8 910

1■□□□□□□□□□这在当前形状刚出来的时候,是可能发生的。但是我们只给游戏板 2□□□□□□□□□□加了一层“边”。对于这个形状的最左边的那个方块将失去判断, 3□□□□□□□□□□如果不予理会,这个形状将会“挂”在游戏板的左上角!当初我也 4□□□□□□□□□□没有想到这一点,后来发现会有形状“挂”在最顶层,而导致游戏 5□□□□□□□□□□提前退出。发现了这个问题。

6□□□□□□□□□□

7□□□□□□□□□□

8□□□□□□□□□□加了这个判断后,游戏板的左右两个“边”对冲突的判断就是去意 9□□□□□□□□□□义了。因为没有这两个“边”,对于冲突的判断也不会出错。不过10□□□□□□□□□□为了程序易于理解,还是保留了游戏板的左右两个“边”。

11□□□□□□□□□□

12□□□□□□□□□□

13□□□□□□□□□□

14□□□□□□□□□□

15□□□□□□□□□□

16□□□□□□□□□□

17□□□□□□□□□□

18□□□□□□□□□□

19□□□□□□□□□□

20□□□□□□□□□□

如果你对我上面提出的新问题及对于这个问题的解释不太明白,没关系,这并不重要。因为现在才刚刚开始,

而且刚才所说的这个问题只

有在特殊情况下才出现(当然,一旦发生上面说的问题,游戏就出错啦!^_^ ),对于理解整个程序的思路影响不大。

看多了就会明白了(你

会说:原来就这么简单!)。

C语言中的32个关键字及其意思

由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static 一、数据类型关键字(12个): 1、char [t?ɑ:]:声明字符型变量或函数 (1)主要内容字符:容纳单字符的一种基本数据类型;(2)n.炭;女清洁工 vt. 烧焦; (3)字符类型:字符型(Char) c、字符串型(String) s 、二进制型(Binary) bn、布尔型(Boolean) b 、日期时间型(DateTime) d 、数组型(Array) a、象型(Object) o 、循环控制变量通常使用单一的字符; 2、double [?d?b?l] :声明双精度变量或函数 (1)n. 两倍;(2)a. 两倍的,双重的;(3)v. 加倍的,快步走,加倍努力 3、enum :声明枚举类型 (1)枚举:枚举是一个被命名的整型常数的;(2)枚举类型;(3)列举型; (4)列举enumerate [i?nju:m?reit] 4、float [fl?ut] :声明浮点型变量或函数 (1)浮点数、(2)浮点型、(3)漂浮、(4)浮动 5、int[int]:声明整型变量或函数 (1)符号整数、(2)取整、(3)Int是 integer ['intid??] 的简写 int 声明一个变量为整型。占2个字节,最大表示范围:-32768到32767(十进制)。 long 声明一个变量为长整型。长整型变量占4个字节,最大表示范围: -2147483648(十进制)到2147483647(十进制)。 6、long [l??] :声明长整型变量或函数 (1)长整型(2)a./ ad.长(期)的(地)(3) n.长时间(4)vi.渴望 7、short [??:t] :声明短整型变量或函数 (1)a. 短的,矮的、(2)n. 短裤、(3)adv. 短暂地;突然地,急地 8、signed:声明有符号类型变量或函数 (1)有符号的、(2)带正负号、(3)sign [sain] n.标记,符号;招牌;迹象 v.签(署) 9、struct:声明结构体变量或函数 (1)n.结构(2)结构体(4)创建构架数组(3)structural[?str?kt??r?l]a. 结构的 10、union [?ju:ni?n]:声明共用体(联合)数据类型 (1)联合、(2)n.工会,联盟、(3)合并、(4)团结 11、unsigned [?n'saind]:声明无符号类型变量或函数 (1)无符号的 (1)无符号的 12、void [v?id] :声明函数无返回值或无参数,声明无类型指针(基本上就 这三个作用) (1)a.无效的、(2)没有的、(3)vt.使无效、(4)n.空虚感 二、控制语句关键字(12个):

c语言程序设计课程计算器设计报告

课程设计说明书 题目计算器程序设计 起讫日期 2006 年 7月 3日至 2006 年 8月 6日 所在院系软件学院 专业机械+软件班级 04-2 学生姓名偶偶哦学号 指导教师 2006年 8 月日

摘要 当今社会是信息社会,科技经济高速发展的社会!为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品! 随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小!电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成!电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延!下面我们将用我们学习的c语言编写一个简易的计算器程序!实现简单的初步的计算功能! 本程序的编写基础是Tubro 汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定!现在只实现了加、减、乘、除、求幂、求模,求平方根,求Sin,求Cos,求Log10,以及一个时钟原代码。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。在程序里面在添加一组选择函数即可。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。 关键词:C语言 Tubro c 汉化版计算器时钟

目录 第一章综述 (1) 1.1 课题的现实意义 (1) 1.2 软件环境 (1) 1.3 硬件环境 (1) 第二章系统设计流程图 (2) 2.1 系统流程图 (2) 2.2 主要功能表 (2) 第三章系统分析和设计 (3) 3.1 图形的绘制和输出 (3) 3.2 文本的输出显示 (3) 3.3 计算函数的调用 (4) 3.4 程序的运行和退出 (5) 第四章系统测试 (6) 4.1 系统测试 (6) 4.2 调试 (6) 4.3 错误原因分析一 (6) 4.4 错误原因分析二 (6) 第五章用户使用说明书 (8)

c语言小游戏编程

程序设计实践 大作业 学号:20100302XXXX 姓名:XXX 班级:信息10-3班 实验题目:射击类飞机游戏 页脚内容1

成绩: 一.实验题目: 射击类飞机游戏 二.实验目的: 通过c语言编写一个射击类的打飞机小游戏,可以通过键盘来进行游戏,操作方法是“a”“d”“w”或者“←”“↑”“→”来控制,击中敌机可获得积分,被敌机撞中死亡一次,每次游戏有3次生还机会,游戏结束后可选择是否重新开始游戏…… 三.对游戏的改进: 这个游戏是我对一个小游戏进行的改造升级版,添加了颜色函数、终止函数,选择类函数,使游戏实现了可以终止,不再是分数、死亡数一直增加但是没有结束的情况;增加了颜色函数,使得游戏看起来更加的舒适;增加了终止函数,使游戏在死亡三次后自动结束游戏,并且可以选择是否重新开始游戏;另外增添了设置函数,使得可以对游戏进行设置,改变游戏大小,调整飞机运行速度等等,是游戏更加的人性化…… 四.实验内容 页脚内容2

编写出c语言代码,运行程序,并调试程序,最终实现游戏的功能。本程序主要包含游戏控制函数、设置是否继续游戏函数、输出函数、子弹移动函数、敌机移动函数、设置函数、菜单函数等7个主要函数,包含了不同的功能,对原来的程序作出了很大的改进,用到的主要语句有getche语句、for语句、while语句、printf语句、switch语句等等,添加了颜色函数,实现了诸多功能。可以在页面上显示制作人的主要信息等等…… 【流程图见打印版】 五.源程序: #include 页脚内容3

#include #include #include #define N 35 #define up 72 #define left 75 #define right 77 void run();//游戏控制函数 void yn();//设置是否继续游戏函数 void print(int [][N]);//输出函数 void movebul(int [][N]);//子弹移动函数 void movepla(int [][N]);//敌机移动函数 void setting(void);//设置函数 void menu(void);//菜单函数 int scr[22][N]={0},pl=9,width=24,speed=3,density=30,score=0,death=0;//全局变量:界面、我机初始位、界面宽度、敌机速度、敌机密度、得分、死亡 页脚内容4

C语言的32个关键字意义与用法

C语言的32个关键字意义与用法 2009-11-20 13:19 1)auto 声明自动变量。可以显式的声明变量为自动变量,只要不是声明在所有函数文前的变量,即使没有加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值例如:auto int name=1 2)static: 声明静态变量。可以显式的声明量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍不还原。即使没有给静态变量赋值,它也会自动初始化为0,例:static int name=1 3)extern: 声明全局变量。用时声明在main函数之前的变量也叫全局变量。它可以在程序任何地方使用。程序运行期间它一直存在的。全局变量也会初始化为0,例:extern int name 4)register: 声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存寄存器中的,速度要快很多。对于需要频繁使用的变量,使用它来声明会提高程序运行速度。例: register int name=1 5)int: 声明量的类型。int为整数型。注意在16位和32位系统中它的范围是不用的。16位中占用2个字节;32位中占用4个字节。还可以显式的声明为无符号或有符号:unsigned int signed int.有符号和无符号的区别就是把符号也当作数字位来存储;也可以用short和long来声明为短整型或长整行例: int mum 6)float: 声明变量的类型。float浮点型,也叫实型。它的范围固定为4个字节。其中6位小数位,其他为整数位。例: float name 7)double: 声明为双精度类型。它的范围为8个字节,14位为小数位。也可使用更高精度的long double.它的范围则更大,达到10字节。例: double name 8)struct: 声明结构体类型。结构体可以包含各种不类型的量。比如可以把整型,字符型等类型的变量声明在同一个结构体种,使用的时候使用结构体变量直接可以调用。例: struct some{ int a=1; float b=1.1 double=1.1234567 }KKK;

C语言课程设计 简单计算器程序

课程设计名称:C语言课程设计课程设计题目:简单计算器程序

目录 第1章需求分析 (1) 1.1设计要求 (1) 1.2任务 (1) 第2章总体设计 (2) 2.1设计简介及设计方案论述 (2) 2.2功能模块层次图 (2) 第3章详细设计 (3) 3.3由(后缀)逆波兰表达式计算中缀表达式原理 (8) 3.3.1算法描述 (8) 第4章调试分析 (10) 4.1程序设计中所遇到的错误及犯错的原因 (10) 4.2错误的解决方法 (10) 第5章用户手册 (11) 总结 (15) 参考文献 (16) 附录(程序清单) (17)

第1章需求分析 1.1 设计要求 (1)用 C 语言数据结构实现程序设计; (2)利用结构体、栈、进行相关信息处理; (2)系统的各个功能模块要求用函数的形式实现; (4)界面简单,可操作性高。 1.2任务 (1)定义一个结构体类型数组,输入0~9 及+、--、*等符号的信息,将其信息存储起来; (2)输入简单的加减乘除算术计算式,并在屏幕上显示逆波兰(后缀式)表达式和计算结果; (3)编写代码; (4)程序分析与调试。 说明: 本课程设计将实现一个简单计算器。在功能上尽量模仿windows 的计算器。系统界面不做牵制要求。该程序能实现标准型中+、-、*、/、(、)、.、的混合运算表达式(一般意义上的中缀表达式),将其转换成逆序波兰表达式(后缀表达式)并计算输出结果。在进行运算后可以选择继续运算或者结束当前运算。即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。

第2章 总体设计 2.1设计简介及设计方案论述 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相 关的两个运算对象之间,所以,这种表示法也称为中缀表达式。波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法。按此方法,每一运算符都置 于其运算对象之后,故称为后缀表达式。 后缀表达式的优点是显而易见的, 编译器在处理时候按照从左至右的顺序读取逆波 兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实 际编程的时候就会体会到它的好处了。 逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转 换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运 算级别的特殊处理。 2.2功能模块层次图 将算术表达式转化为逆波兰表达式 计算逆波兰表达式的值 简单计算器 表 达 式 格 式 转 换 系统 求 值 计 算 系 统

C语言简易计算器的实现

目录 一.课程设计目的 (1) 二.设计环境 (1) 三.设计内容 (1) 四.设计说明 (2) 五.设计程序流程图 (2) 六.调试 (4) (1)错误原因分析一 (4) (2)语法错误 (5) (3)逻辑错误 (5) 七. 调试结果图 (6) 八. 结论与心得体会 (7) 九.附录 (8) 具体代码实现 (8) 十.参考文献 (18)

一.课程设计目的 1.通过一个学期的学习,我认为要学号C语言程序这门课程,不仅要认真阅读课本知识,更重要的是要通过上机实践来巩固我 们的知识,特别是学计算机专业的,我们更应该注重这一环节, 只有这样我们才能成为一个合格的计算机人才。通过这一个课程 设计,进一步来巩固所学的语句,如:循环,和分支结构的运用。还要熟悉四则运算和函数的算法。 2.通过这次课程设计扩展自己的知识面,课本上的东西是远 远不够的,可以通过上网或去图书馆查资料等方式得到一些新的 知识, 3.通过课程设计,加深对课程化设计思想的理解,能进行一 个系统功能分析,并设计一个合理的模块化结构,提高程序开发 能力。 二.设计环境 1.硬件:一台完整的电脑,包括键盘、鼠标,最小硬盘空间1GHz 2.软件:安装有Microsoft visual c++6.0 三.设计内容 以简易计算器为例,通过对简单应用软件计算器的设计,编制、调试,实现

简单的加,减,乘,除等运算,以学习应用MFC库类编写对话框的原理,加深对C++类的学习及应用。 (1)定义一个结构体类型数组,输入0~9及+、--、*等符号的信息,将其信息存入文件中; (2)输入简单的加减乘除算术计算式,并在屏幕上显示计算结果; (3)画出部分模块的流程图; (4)编写代码; (5)程序分析与调试。 四.设计说明 1)包含的功能有:加、减、乘、除运算,开方、平方等功能。 (2)计算器上数字0—9为一个控件数组,加、减、乘、除为一个控件数组,其余为单一的控件。 (3)输入的原始数据、运算中间数据和结果都显示在窗口顶部的同一个标签中。 (4)计算功能基本上是用系统内部函数。 (5)程序可以能自动判断输入数据的正确性,保证不出现多于一个小数点、以0开头等不正常现象。 (6)“CE”按钮可以清除所有已输入的数据从头计算 五.设计程序流程图

C语言编程游戏代码

#include #include #include #include #include #define L 1 #define LX 15 #define L Y 4 static struct BLOCK { int x0,y0,x1,y1,x2,y2,x3,y3; int color,next; intb[]={{0,1,1,1,2,1,3,1,4,1},{1,0,1,3,1,2,1,1,4,0},{1,1,2,2,1,2,2,1,1,2},{0,1,1,1,1,0,2,0,2,4}, {0,0,0,1,1,2,1,1,2,3},{0,0,1,0,1,1,2,1,3,8},{1,0,1,1,2,2,2,1,2,5},{0,2,1,2,1,1,2,1,2,6},{0,1,0,2,1,1,1 ,0,3,9},{0,1,1,1,1,2,2,2,3,10},{1,1,1,2,2,1,2,0,3,7},{ 1,0,1,1,1,2,2,2,7,12},{0,1,1,1,2,1,2,0,7,13},{0 ,0,1,2,1,1,1,0,7,14},{0,1,0,2,1,1,2,1,7,11},{0,2,1,2,1,1,1,0,5,16},{0,1,1,1,2,2,2,1,5,17},{1,0,1,1,1, 2,2,0,5,18},{0,0,0,1,1,11,2,1,5,15},{0,1,1,1,1,0,2,1,6,2,0},{0,1,1,2,1,1,1,0,6,21},{0,1,1,2,1,1,2,1,6 ,22},{1,0,1,1,1,2,2,1,6,19}}; static int d[10]={33000,3000,1600,1200,900,800,600,400,300,200}; int Llevel,Lcurrent,Lnext,Lable,lx,ly,Lsum; unsigned Lpoint; int La[19][10],FLAG,sum; unsigned ldelay; void scrint(),datainit(),dispb(),eraseeb(); void throw(),judge(),delayp(),move(0,note(0,show(); int Ldrop(),Ljudge(),nextb(),routejudge(); } main() { char c; datainit(); Label=nextb(); Label=Ldrop(); while(1){ delayp(); if(Label!=0) { Ljudge(); Lable=nextb(); } ldelay--; if(ldelay==0)

C语言的标识符和关键字

1、标识符 标识符使用来标识源程序中的某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、常量、数组等。 C语言规定:一个标识符由字母、数字和下划线组成,第一个字符必须是字母或下划线,通常以下划线开头的标识符是编译系统专用的,所以在编写C语言程序时,最好不要使用以下划线开头的标识符。但是下划线可以用在第一个字符以后的任何位置。 标识符的长度不要超过32个字符,尽管C语言规定标识符的长度最大可达255个字符,但是在实际编译时,只有前面32个字符能够被正确识别。对于一般的应用程序来说,32个字符的标示符长度足够用了。 C语言对大小写字符敏感,所以在编写程序时要注意大小写字符的区分。例如:对于sec和SEC这两个标识符来说,C语言会认为这是两个完全不同的标识符。 C语言程序中的标识符命名应做到简洁明了、含义清晰。这样便于程序的阅读和维护。例如在比较最大值时,最好使用max来定义该标识符。 2、关键字 在c语言编程中,为了定义变量、表达语句功能和对一些文件进行预处理,还必须用到一些具有特殊意义的字符,这就是关键字。 关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符。C语言中关键字主要有以下三类: ?类型说明符:用来定义变量、函数或其他数据结构的类型,如unsigned char,int,long等 ?语句定义符:用来标示一个语句的功能,如if,for等 ?预处理命令字:用来表示预处理命令的关键字,如include,define等

标准C语言有32个关键字,c51编译器又扩充了一些关键字,这些关键字在编程时需要注意,绝对不能使用这些关键字来定义标识符。

C语言实现计算器功能

实验一多功能计算器 一、问题描述 设计一个多功能计算器,可以完成基本的计算。 设计要求: 1、具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果。结果可以作为下一个运算的第一运算数。按‘C’清屏,按‘R’返回菜单。 例如:输入:2 + 5 输出:7 2、实现单运算符表达式计算的功能。输入的操作数可以包含整数或浮点数。输入表达式如下: 例如:输入:2+5 输出:7 二、算法说明 1.数据结构说明(可以图示说明,也可以文字说明) 本程序主要根据选择菜单编写了六个自定义函数,用于在main()函数中调用,在main()中,用一个字符变量num1来记录下菜单选项的标号,根据num1的值来决定调用哪个函数。 程序要完成的功能及所要用到的函数如下:

下面就是整个程序的流程图:

2.算法说明(即函数说明) void suanshuyunsuan() //做算术运算时调用的函数 void suanshuyunsuan2() //选择继续做算术运算调用的函数,将上次运算的结果做为下次算术运算的第一个操作数//判断算术运算就是否继续 void panduan() //判断算术运算就是否继续 void biaodashiyunsuan() //单运算符表达式实现函数 void qingping() //清除屏幕 void fanhuicaidan() //显示菜单 三、测试结果(这部分需文字与图示结合) 1.第一组测试用例 (1)测试输入: 测试目的:测试算术运算的功能 结果输出:

(2)再一次输入:1测试目的:测试算术运算就是否能继续 结果输出: (3)这时输入:0 测试目的:退出算术运算 结果输出:

C语言 个关键字九种控制语句 种运算符

总结归纳了C语言的32个关键字 第一个关键字:auto 用来声明自动变量。可以显式的声明变量为自动变量。只要不是声明在所有函数之前的变量,即使没加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值。 例:auto int name=1; 第二个关键字:static 用来声明静态变量。可以显式的声明变量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍旧不还原。即使没有给静态变量赋值,它也会自动初始化为0. 例:static int name=1. 第三个关键字:extern 用来声明全局变量。同时声明在main函数之前的变量也叫全局变量。它可以在程序的任何地方使用。程序运行期间它是一直存在的。全局变量也会初始化为0. 例:extern int name; 第四个关键字:register 用来声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存在寄存器之中的。速度要快很多。对于需要频繁使用的变量使用它来声明会提高程序运行速度。 例:register int name=1; 第五个关键字:int 用来声明变量的类型。int为整型。注意在16位和32位系统中它的范围是不同的。16位中占用2个字节。32位中占用4个字节。还可以显式的声明为无符号或有符号: unsigned int或signed int .有符号和无符号的区别就是把符号位也当作数字位来存储。也可用short和long来声明为短整型,或长整行。 例:int num; 第六个关键字:float 用来声明变量的类型。float为浮点型,也叫实型。它的范围固定为4个字节。其中6位为小数位。其他为整数位。 例:float name;

大学计算机c语言计算器源代码

C++语言编写。。 #include #include #include using namespace std; const double pi = 3.14159265; const double e = 2.718281828459; const int SIZE = 1000; typedef struct node//为了处理符号而建立的链表(如: 1+(-2)) { char data; node *next; }node; typedef struct stack_num//存储数的栈 { double *top; double *base; }stack_num; typedef struct stack_char//存储运算符号的栈 { char *top;

char *base; }stack_char; stack_num S_num;//定义 stack_char S_char;//定义 char fu[18] = {'\n', ')', '+', '-', '*', '/', '%', '^', 'Q', 'L', 'C', 'S', 'T', 'c', 's', 't', '('}; int compare[1000];//表现出各运算符号的优先级 double shu[1000];//存储"数"的数组 double dai_result;//运算的结果,是为了处理M运算(简介函数里有M的定义) int biao = 0;//和dia_result一样,为了处理M运算 char line[SIZE];//输入的所要计算的表达式 void init()//初始化 { compare[fu[0]] = -2;//用数字的大小表现出符号的优先级 compare[fu[1]] = -1; compare[fu[2]] = 2; compare[fu[3]] = 2; compare[fu[4]] = 4; compare[fu[5]] = 4; compare[fu[6]] = 4;

C编写的小游戏

C编写的小游戏 集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

#i n c l u d e usingnamespacestd; constcharMOUSE='*'; constcharWAY=''; constcharWALL='@'; constcharPASS='.'; constcharIMPASS='X'; classGame{ public: Game(size_tuWidth,size_tuHeight):m_uWidth(uWidth),m_uHeigh t(uHeight),m_pcMaze(newchar[uWidth*uHeight]),m_mouse(0,1){ srand(time(NULL)); char(*pcMaze)[m_uWidth]=reinterpret_cast(m_pcMaze); for(size_ti=0;im_uWidth-5)) pcMaze[i][j]=WAY;

elseif(i==0||i==m_uHeight- 1||j==0||j==m_uWidth-1) pcMaze[i][j]=WALL; else pcMaze[i][j]=rand()%4WAY:WALL; } ~Game(void){ if(m_pcMaze){ delete[]m_pcMaze; m_pcMaze=NULL; } } voidRun(void){ for(Show();!Quit()&&Step();); } private: classMouse{ public: Mouse(size_tx,size_ty):m_x(x),m_y(y){} size_tGetX(void){returnm_x;} size_tGetY(void){returnm_y;} voidStepRight(void){

C语言小游戏程序设计

程序设计实验 大作业 学院: 班级: 学号: 指导老师: 姓名: 实验项目名称:猜数字游戏成绩:

一、实验要求 根据所学知识编写一个小游戏--猜数字游戏 二、实验目的 为了加深对编程课程的基本知识的理解和掌握,并且掌握编程和程序调试的技巧通过程序的设计训练和提高学生的基本技能,掌握字符串的表示方法和字符串函数的功能、编程软件操作的基本知识、键盘上特殊键的获取以及图形方式下光标的显示,提高编程兴趣与编程水平,学会如何正确的书写程序设计说明文档,提高解决实际问题的能力,巩固语法规则的理解和掌握,学会通过源程序写出流程图,提高自学以及查阅资料的能力。 三、功能模块分析 1.系统能够随机产生一个1到1000的数字 2.比较输入数字与随机产生数字的大小 3.选择是否继续游戏 四、修改处 1.将输出内容由英文变为汉字 2.改变背景及输出字体的颜色 3将随机产生的数值范围由1-100变为1-1000 四、设计思路 # include # include # include main() { void textbackground(int color); system("color fc"); int a,b; char c; srand(time(NULL)); a=1+(rand()%1000); printf("这有一个数字从1到1000.\n你能猜出它吗?\n输入你猜的数字.\n"); scanf("%d",&b); while(b!=-1) { if(b==a) { printf("恭喜你猜对了!\n你喜欢再玩一遍吗?(y or n)?");

c语言游戏讲解

1: C语言游戏设计 1.1:课程设计目标 C语言编写一款打飞机游戏,掌握函数的使用和编程的整体思路。 1.2:整体设计思路 总体设想:运行游戏时显示游戏的界面,允许用户选择个性化设置,A、D、W分别控制飞机的左右移动和发射子弹,不同的敌机飞行和攻击,并不时伴有奖励。游行运行时播放音效,同时记录飞机的生命和得分,达到一定的分数进入下一关。 需要构建的函数:位图调用模块、界面输出函数、主菜单函数、设置函数、速度选择函数、游戏控制函数、敌机移动函数、子弹移动函数、boss 函数、计时函数。 1.3: 需调用的头文件:include //常规库头文件 include //控制台输入输出流头文件 include //系统函数头文件 include //时间函数头文件 include //windows函数库 include //导入声音头文件 pragma comment(lib,"winmm.lib ")//导入声音头文件库 1.4: 游戏过程模拟:

1.5:显示效果如下图所示:

初始设置界面:游戏界面 2 算法实现 2.1需要了解的知识点: Main函数和menu函数编写比较顺利,在bmp函数中遇到如何显示窗口和调用图片的问题,看了一些例子和网上的资料,逐渐掌握了一下知识点: ○1设备上下文:设备,显示器,打印机,数码相机,扫描仪这些类似的设备, 上下文,就是上面设备的相关信息,比如屏幕分辨率等 ○2 HANDLE 通用句柄,实际上是一个指向指针的指针,在Windows操作系统中, 内存操作器经常移动对象,来满足各种程序的内存需要,为了解决寻找对象问题,内存管理器开辟出一块专门的内存储存空间,把移动后的地址存储在该空间,这样就可以通过该地址间接寻找到对象。 ○3 HDC设备描述句柄,实现对窗口操作区域的GDI(图形设备接口, 负责系统 与绘图程序之间的信息交换,处理所有Windows程序的图形输出)操作,如画线、写文本、绘画制图等。 ○4 BITMAP 用于处理有像素数据定义的图像的对象。

C语言制作简单计算器

C语言制作简单计算器 一、项目介绍 我们要用c语言做一个简单的计算器,进行加、减、乘、除操作。本程序涉及的所有数学知识都很简单,但输入过程会增加复杂性。我们需要检查输入,确保用户没有要求计算机完成不可能的任务。还必须允许用户一次输入一个计算式,例如:32.4+32 或者9*3.2 项目效果图 编写这个程序的步骤如下: ?获得用户要求计算机执行计算所需的输入。 ?检查输入,确保输入可以理解。 ?执行计算。 ?显示结果。 三、解决方案 1.步骤1

获得用户输入是很简单的,可以使用printf()和scanf()。下面是读取用户输入的程序代码: #includeint main(){ double number1=0.0; //定义第一个操作值 double number2=0.0; //定义第二个操作值 char operation=0; //operation必须是'+''-''*''/'或'%' printf("\nEnter the calculation\n"); scanf("%lf%c%lf",&number1,&operation,&number2); return0; } 2.步骤2 接着,检查输入是否正确。最明显的检查是要执行的操作是否有效。有效的操作有+、-、*、/和%,所以需要检查输入的操作是否是其中的一个。 还需要检查第二个数字,如果操作是/或者%,第二个数字就不能是0。如果右操作数是0,这些操作就是无效的。这些操作都可以用if语句来完成,switch语句则为此提供了一种更好的方式,因此它比一系列if语句更容易理解。 switch(operation) { case'+': printf("=%lf\n",number1+number2); break; case'-': printf("=%lf\n",number1-number2); break; case'*': printf("=%lf\n",number1*number2); break; case'/': if(number2==0) printf("\n\n\aDavision by zero error!\n"); else printf("=%lf\n",number1/number2); break;

C编写的小游戏

C编写的小游戏集团档案编码:[YTTR-YTPT28-YTNTL98-UYTYNN08]

#i n c l u d e usingnamespacestd; constcharMOUSE='*'; constcharWAY=''; constcharWALL='@'; constcharPASS='.'; constcharIMPASS='X'; classGame{ public: Game(size_tuWidth,size_tuHeight):m_uWidth(uWidth),m_uHeight(uHe ight),m_pcMaze(newchar[uWidth*uHeight]),m_mouse(0,1){ srand(time(NULL)); char(*pcMaze)[m_uWidth]=reinterpret_cast(m_p cMaze); for(size_ti=0;im_uWidth-5)) pcMaze[i][j]=WAY; elseif(i==0||i==m_uHeight- 1||j==0||j==m_uWidth-1) pcMaze[i][j]=WALL; else pcMaze[i][j]=rand()%4?WAY:WALL; } ~Game(void){ if(m_pcMaze){ delete[]m_pcMaze; m_pcMaze=NULL; } } voidRun(void){ for(Show();!Quit()&&Step();); } private: classMouse{ public: Mouse(size_tx,size_ty):m_x(x),m_y(y){} size_tGetX(void){returnm_x;} size_tGetY(void){returnm_y;} voidStepRight(void){

纯C语言写的一个小型游戏-源代码

/* A simple game*/ /*CopyRight: Guanlin*/ #include #include #include #include #include #include struct object_fix { char name[20]; char id[5]; char desc[500]; char action[30]; char im[5]; }; struct object_move { char name[20]; char id[5]; char desc[500]; int loc; int pwr; int strg; char im[5]; }; struct rover { char name[20]; char id[5]; char desc[500]; int pwr; int strg; int location[2]; char im[5]; }; struct map /* this is the map structure*/ { char data[20]; char add_data[20]; int amount; int x; /* this were the successor keeps it's x & y values*/ int y; }; struct location /*this structure is for the successor lister*/ { float height; char obj;

C语言32个词汇详细解释

C语言32个词汇详细解释 Actual argument 实际参数 Addition 加法 Address 地址 Alert 警告 Algorithm 算法 ANSI 美国国家标准协会 Area 面积 Argument 参数,自变量 Arithmetic expresssion 参数,自变量 Arithmetic operator 算术运算符 Array 数组 Ascending order 升序 Assignment operator 赋值运算符 Back slash 反斜杠 Backspace 退格键 Base address 基地址 Basic Combined Programming Language (BCPL)基本组合编程语言 Binary code file 二进制代码文件 Binary executable 二进制可执行文件 Binary operator 二元运算符 Block 块,语句块 Boolean 布尔值 Bubble sort 冒泡排序 Buffer 缓冲区 Built-in function 内置函数

Call by reference 引用调用 Call by value 传值调用 Called function 被调函数 Calling function 调用函数 Carriage return 回车 Character 字符 Code snippet 代码片断 Column 列 Combined Programming Language (CPL) 组合编程语言 Comma operator 逗号运算符 Compiler 编译器 Compound statement 复合语句 Concatenation 连接 Condition 条件 Conditional construct 条件结构 Constant 常量 Control 控制,控制权 Console 控制台 Counter 计数器 Data type 数据类型 Declaration 声明 Decrement 自减,递减 Descending order 降序 Difference 差 Dimension 维数,维 Division 除法 Double 双精度浮点型

C语言课程设计--计算器(图形界面)

扬州大 学 题目一个简易计算器的设计与实现 班级 学号 姓名 指导教师 成绩 老师评语: 扬州大学信息工程学院 2010 年6 月25

目录 一、程序设计目的: (1) 二、程序设计内容: (1) 三、课程设计所补充的内容:补充的函数或算法…………3,4 四、系统总体设计 (4) 五、系统详细设计………………………………………5,6,7,8 六、运行结果………………………………………………8,9,10 七、系统调试…………………………………………8,9,10,11 八、课程设计体会总结………………………………8,9,10,11

1 课程设计目的 (1).课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于C语言对初学者较难掌握,因而对一个完整的C语言程序不适合平时实验。通过课程设计可以达到综合设计C语言程序的目的。 (2)通过本课程设计,可以培养独立思考,综合运用所学有关相应知识的能力,能更好地使用C语言的知识,更好地了解C语言的好处和其可用性!掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础! (3)通过本程序训练程序设计的基本技能,掌握字符串的表示方法和字符串函数的功能、自学掌握四则运算的算法及WIN-TC的图形操作的基本知识、键盘上特殊键的获取及图形方式下光标的显示。 2 课程设计内容 目的:本课程的课程设计要求学生模拟实现一个简单计算器,要求(1)能够实现四则运算,并能支持优先级运算。(2)三角与反三角运算:如sinx,cosx等。(3)指数对数运算:如log(x),lnx,e的x次方等。(4)其他运算:如X!,x 的累加等。(4)不允许调用库函数,使用自行开发的程序实现常用函数运算。(5)进一步考虑计算器外观设计,用可视化界面给出计算器外观、功能按键及输入界面。 使用说明:执行加法运算,'—'表示执行减法运算,表示执行乘法运算,'/'表示除法运算.‘Q’表示退出计算器‘C’表示清零,’=’表示得出结果'^'表示执行x的y次方,'e'表示执行e的x次方操作,'&'表示执行累加操作.,你可以可以用键盘上的上下左右键对光标进行移动,当光标移动到计算器按键上时,按ENTER即可执行该键的操作!最后按“=”则可得出结果。 3 课题设计的补充知识 本程序通过int specialkey(void)和#include来实现对屏幕的操作,通过调用int arrow()函数,int specialkey(void)和#include来实现对光标的操作。计算机图形采用Turbo C 2.0绘图程序制作。因此涉及C的图形程序设计知识。此外,由于不允许调用库函数,则要自行开发程序实现sinx,cosx,e的x次方函数运算,则可以根据幂级数的展开式来设计实现其运算的算法,而x的阶乘和x的累加则可用for语句来实现。 最后,不得不说说四则运算的算法,有两种方法可以实现:(1)利用堆栈实现四则运算(2)还可以用递归整数的四则运算。 sinx函数 #include