1.如何用C语言编一个俄罗斯方块
游戏界面预览:菜单预览:自定义每个小方块颜色功能界面:游戏主要有四部分组成:Square类,Block类,gameField类,游戏引擎 Square类: 这个类描述的对象是组成大方块中的每个小正方形实体。
类设计: class Square { public Point location; //小方块的坐标 public Size size; //小方块大小 public Color foreColor; //小方块前景色 public Color backColor; //小方块背景色 public Square(Size initSize,Color initForeColor,Color initBackColor) //构造函数 { ……} public void Draw(System.IntPtr winHandle) //在指定设备上画方块 { …… } public void Erase(System.IntPtr winHandle)//擦除方块 { …… } } Block类: 这个类描述的对象是某一个大方块的实体。每个大方块由四个小正方形组成,一共有7种组合方式。
这个类需要实现一个大方块实体所有的属性和动作。包括:方块的形状,位置,方块左移,右移,下移,旋转等。
类设计: class Block { public Square square1; //组成block的四个小方块 public Square square2; public Square square3; public Square square4; private const int squareSize = GameField.SquareSize; //小方块的边长 public enum BlockTypes { undefined = 0, square = 1, line = 2, J = 3, L = 4, T = 5, Z = 6, S = 7 };//一共有7种形状 public BlockTypes blockType; //方块的形状 //七个小方块的颜色数组 private Color foreColor; private Color backColor; //方块的方向 public enum RotateDirections { North = 1, East = 2, South = 3, West = 4 }; public RotateDirections myRotation = RotateDirections.North; public Block(Point thisLocation,BlockTypes bType) { ……} //含有自定义颜色的重载 public Block(Point thisLocation, BlockTypes bType,Color fc,Color bc) { ……} /*画方块*/ public void Draw(System.IntPtr winHandle) {…… } /*擦方块*/ public void Erase(System.IntPtr winHandle) {…… } /*移动*/ public bool down() {……} public bool left() {……} public bool right() {……} /*旋转block*/ public void Rotate() {……} /*检测是否到顶*/ public int Top() {……} } GameField类: 这个类描述的对象是游戏场景实体,包括场景的背景色,大小,方块是否还可以移动,以及场景中填满一行的检测等。 类设计: class GameField { public const int width = 20; //场景的宽,以方块个数为单位 public const int height = 30; public const int SquareSize = 15; //每个四分之一小方块的边长 public static Color BackColor; //场景的背景色 public static System.IntPtr winHandle; //场景的handle public static Color[] BlockForeColor ={ Color.Blue, Color.Beige, Color.DarkKhaki, Color.DarkMagenta, Color.DarkOliveGreen, Color.DarkOrange, Color.DarkRed }; public static Color[] BlockBackColor ={ Color.LightCyan, Color.DarkSeaGreen, Color.Beige, Color.Beige, Color.Beige, Color.Beige, Color.Beige }; public static bool isChanged=false; //设置是否被更改的标志位 public static SoundPlayer sound = new SoundPlayer(); //播放声音 public static Square[,] arriveBlock = new Square[width, height]; //保存已经不能再下落了的方块 public static int[] arrBitBlock=new int[height]; //位数组:当某个位置有方块时,该行的该位为1 private const int bitEmpty = 0x0; //0000 0000 0000 0000 0000 private const int bitFull = 0xFFFFF; //1111 1111 1111 1111 1111 /*检测某个位置是否为空*/ public static bool isEmpty(int x, int y) {……} /*将方块停住*/ public static void stopSquare(Square sq, int x, int y) {……} /*检测行是否满 * 返回:成功消除的行数和 (方便统计分数) */ public static int CheckLines() { ……} /*播放声音*/ public static void PlaySound(string soundstr) {……} /*重画*/ public static void Redraw() { …… } //结束 } 游戏引擎: 游戏引擎正如其名,就像一个发动机一样让游戏不间断运行。
本游戏中就是让方块以一定的速度下落。并响应键盘事件,实行左右移动,和向下加速功能。
(代码见源码) 声音播放: 音效是游戏不可缺少的一部分。在.Net2.0中已经提供了一个类来播放声音。
在using System.Media;命名空间。 本游戏中播放声音的代码如下:(在 GameField类中) using System.Media; public static SoundPlayer sound = new SoundPlayer(); /*播放声音*/ public static void PlaySound(string soundstr) { switch (soundstr) { case "FinishOneLine": //消除一行的声音 if (!File.Exists("FinishOneLine.wav")) return; sound.SoundLocation = "FinishOneLine.wav"; break; case "CanNotDo": //当无法操作时 if (!File.Exists("CanNotDo.wav")) return; sound.SoundLocation = "CanNotDo.wav"; break; } sound.Play(); } 要播放的时候调用PlaySound()方法即可。
其实步骤很简单,先引用System.Media空间,然后创建一个SoundPlayer 对象,用SoundLocation 属性设置声音文件的地址,然后调用Play()方法即可播放。不过注意,这个类可以播放的声音格式只有Wav文件。
保存游戏设置: 在游戏中经常要保存用户自定义的设置。本游戏通过写进ini文件来保存。
2.怎样用C语言写俄罗斯方块,求指教,谢谢
首先你要下载vc++,初学者可以用vs98安装好后在项目中可以添加如下代码#include "graphics.h"#include #include int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW};struct tetris { int _pool[16][32], (*pool)[32], tmap[8][4][16]; int x, y, s, st, t;}gt;void trsInit() { int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}}; int *p, i, j, b; for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2]; gt.pool = >._pool[4]; for (j = 0; j >= 1; memset(gt._pool, -1, sizeof(gt._pool)); for (i = 0; i > 5), cy = y + (m[i] & 31); if (gt.pool[cx][cy]) if (c == 2) gt.pool[cx][cy] = 0; else return 0; if (c==1) gt.pool[cx][cy] = sp[i]; } return 1;}int trsScene() { int x, y = 0; gt.s = random(7) + 1, gt.st = gt.t = 0; gt.x = 4, gt.y = 0; for (--gt.t ; ; delay(10), --gt.t) { int k = 0; while (kbhit()) { k = getch(); if (k == 27) return 0; if (k == 'A' || k == 'a') { if (trsCopy(gt.tmap[gt.s][gt.st], gt.x-1, gt.y, 0)) --gt.x; } else if (k == 'D' || k == 'd') { if (trsCopy(gt.tmap[gt.s][gt.st], gt.x+1, gt.y, 0)) ++gt.x; } else if (k == 'W' || k == 'w') { if (trsCopy(gt.tmap[gt.s][(gt.st+1) % 4], gt.x, gt.y, 0)) gt.st = (gt.st+1) % 4; } } if (k == 'S' || k == 's' || gt.t 0; --y) { for (x = 0; gt.pool[x][y] > 0; ++x); if (gt.pool[x][y] 0; --k) for (x = 0; gt.pool[x][0] >= 0; ++x) gt.pool[x][k] = gt.pool[x][k-1]; } return 1; } } trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1); for (x = 0; gt.pool[x][0] >= 0; ++x) { for (y = 1; gt.pool[x][y] >= 0; ++y) { setfillstyle(1, gcColor[gt.pool[x][y]]); bar(201 + x*gcW, 1 + y*gcW, 200 + gcW + x*gcW, gcW + y*gcW); } } trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 2); }}int main() { int g = DETECT, m = 0; initgraph(&g, &m, ""); randomize(); trsInit(); while (trsScene()); return 0;}。
3.用c语言编写俄罗斯方块程序 求详解
俄罗斯方块C源代码#include
4.用c语言编写俄罗斯方块程序 求详解
1、用C语言绘制图形界面 EasyX图形库()即TC的图形库在VC下的移植。
包含库#include
注意:由于我们用的是EasyX图形库,故源文件后缀要为.cpp,但其中内容都是C的语法。2、存储表示出俄罗斯方块的形状 一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样19种 方块就得有19种相应的代码来描绘。
而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。二、我们很自然的想到可用字模点阵的形式来表示,即设置一个4行4列的数组,元素置1即代表这个位置有小 方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。
1000100011000000 这个方法挺靠谱,但我们还可以优化一下:不用4*4的数组,而是用16个bit位来表示这个点阵。这样存储起来比较方便,故我们用unsigned int 的低16位来表示方块的点阵。
我们可以用掩码与表示俄罗斯方块的位进行操作,来识别并在屏幕上画出方块。我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。
但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组rockArray中的值。我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成unsigned int的变量存储在rockArray中。
这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。@### @### @@###### (为使得看起来更醒目,我们用@表示1,用#表示0)3、让图形动起来 在某位置处用函数DrawRock在屏幕上画出俄罗斯方块,然后再擦除掉(即用背景色在原位置处重绘一次方块),最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。
同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。那么按下上方向键时,如何让方块翻转呢?我们在配置文件中就把方块的顺时针翻转形态放在了一起:@### @### @@###### @@@# @########### @@###@###@########@# @@@######### 我们每按一次上方向键改变一次方块的形状即可。
若一直按上键,形状应该是循环地翻滚。我们想到了循环链表的数据结构可实现这个效果。
可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。
我们用结构体来作为一个方块在rockArray中的元素 typedef struct ROCK { //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行) unsigned int rockShapeBits ; int nextRockIndex ; //下一个方块,在数组中的下标 } RockType ; 这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。参考资料:C语言图形界面篇。
5.怎样用C语言写俄罗斯方块,求指教,谢谢
首先你要下载vc++,初学者可以用vs98安装好后在项目中可以添加如下代码 #include "graphics.h"#include
6.用c语言写俄罗斯方块要学哪些东西
首先要学习C语言,这个是基础。
然后如果必须用C的话,还要学习C语言的图形界面编程。
网上资料做多,而且容易得到的就是Turbo C的,因为Turbo C可以写图形的程序。
如果你不想限制在Turbo C,想用其他编译器也可以编译的程序的话,你可以学习SDL。SDL的教程里,也可以找到俄罗斯方块。当然,你也可以学习OpenGL的俄罗斯方块。你百度 SDL 俄罗斯方块或者 OpenGL 俄罗斯方块都很容易找到例程。
总之,
第一,你必须先学好C语言;
然后,你要学习一种C语言的图形库;
最后,你要学习俄罗斯方块的程序设计方法。
这样,你就可以编写一个自己的,有声有色的俄罗斯方块了。
7.用c语言写俄罗斯方块要学哪些东西
首先要学习C语言,这个是基础。
然后如果必须用C的话,还要学习C语言的图形界面编程。网上资料做多,而且容易得到的就是Turbo C的,因为Turbo C可以写图形的程序。
如果你不想限制在Turbo C,想用其他编译器也可以编译的程序的话,你可以学习SDL。SDL的教程里,也可以找到俄罗斯方块。
当然,你也可以学习OpenGL的俄罗斯方块。你百度 SDL 俄罗斯方块或者 OpenGL 俄罗斯方块都很容易找到例程。
总之,第一,你必须先学好C语言;然后,你要学习一种C语言的图形库;最后,你要学习俄罗斯方块的程序设计方法。这样,你就可以编写一个自己的,有声有色的俄罗斯方块了。
8.一个简单的c语言写的俄罗斯方块程序
1、考虑怎么存储俄罗斯方块俄罗斯方块的形状一共有19种类型,如果拿数组来表示的话,可能会比较会浪费空间(网上有很多实现代码)考虑到每种方块形状的范围是4 *4的小方块,用 字模点阵的方式来存储,即设置一个4行4列的数组,元素置1即代表这个位置有小 方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。
1000 1000 1100 0000 上述4*4来表示L形状的方块。 4*4 =16 bit 正好为short类型,所以每一个方块可以用一个short类型的数据来表示。
我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。 但是这种方式扩展性不好,每当有一种新方块时需要改动, 所以可以写一个配置文件来表示19种方块。
(RockShape.ini)@###@###@@######1234从配置文件中读取方块的类型的代码在(Init.h的ReadRock函数中)在下面3中解释下代码如何实现2如何画出方块可以使用EasyX库来画出简单的图形, EasyX库是在VC下实现TC的简单绘图功能的一个库,这个库很容易学会(直接 百度EasyX库,里面有详细的教程)那么如何画出方块,方块已经存储到一个short类型中了 从short中读取出,可以用一个掩码mask = 1来与short的每个bit位相与,结果为1,则画出一个小方块; 函数声明:void DisplayRock(int rockIdx, RockLocation_t* LocatePtr, bool displayed)1参数1:表示在数组中的下标,取出short类型的方块表示数据 参数2:表示当前坐标,即画出方块的左上角的坐标x,y 参数3:true表示画出该方块,false 表示擦除该方块。//方块在图形窗口中的位置(即定位4*4大块的左上角坐标) typedef struct LOCATE{ int left; int top;} RockLocation_t;1234563如何实现同一种类型方块的翻转,在按‘↑’时应该翻转同一种类型的方块, 比如下面的横杆和竖杆@###@###@###@###@@@@############****1234567891011可以假想成静态循环链表来实现这种方式 使同一种类型的方块循环起来,用一个struct结构来表示一种方块typedef struct ROCK{ //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)unsigned short rockShapeBits; int nextRockIndex; //下一个方块,在数组中的下标 } RockType;123456定义一个RockType类型的数组来存储19种方块 RockType RockArray[19] = { (0, 0) };当我们按“↑”时,把传入画方块函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。
简单解释下ReadRock函数的实现:当读取到空行的时候表示 一种方块已经读取完毕,当读取到**** 行时 表示同一种类型的方块读取完毕,具体看代码实现,代码中具体的注释4、主要游戏实现的逻辑贴一个预览图吧 注:上述预览图的游戏控制区和游戏显示区在Draw.h的DrawGameWindow()函数实现的(1)在初始位置画出方块,在预览区画出下一次的方块 (2)方块有两种行为:响应键盘命令UserHitKeyBoard(),自由下落 如果敲击键盘了(w ,a ,s ,d, )空格表示暂停,如果在规定时间内没有敲击键盘的话,方块自由下落一个单位if (kbhit()) //如果敲击键盘了 就处理按键{userHit = getch();UserHitKeyBoard(userHit, &curRockIndex, &curRockLocation);} //没有 就自动下移一个单位 :不能用else,因为可能按键不是上下左右DWORD newtime = GetTickCount(); if (newtime - oldtime >= (unsigned int)(300) && moveAbled == TRUE){oldtime = newtime;DisplayRock(curRockIndex, &curRockLocation, false);curRockLocation.top += ROCK_SQUARE_WIDTH; //下落一格}1234567891011121314(3)当方块落地(即不能下移了)时,判断是否满行,如果满行则消除,然后再判断游戏是否结束,游戏结束的话,直接退出游戏判断满行:FullLine()函数,从最底下的一行开始判断,直到遇到一行空行,while (count != xROCK_SQUARE_NUM ) //遇到空行 14{linefull = true; count = 0; for (int i = 1; i 评论0 0 0。
转载请注明出处育才学习网 » 怎么用c语言写俄罗斯方块