【C语言】俄罗斯方块的源代码

【C语言】俄罗斯方块的源代码
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程吧。零基础,通俗易懂!风趣幽默!http://www.captainbed.net/

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

GitHub:【C语言】实现俄罗斯方块源代码

Head.h

#ifndef _HEAD_H_#define _HEAD_H_#include<graphics.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<time.h>#include<string.h>#define _CRT_SECURE_NO_WARNINGS 1//界面的相关的参数#define WALL_SQUARE_WIDTH 10 //围墙方块的宽度#define xWALL_SQUARE_NUM 30 //x轴方向的方块的数目#define yWALL_SQUARE_WIDTH 46 //y轴方向的方块的数目#define GAME_WALL_WIDTH  (WALL_SQUARE_WIDTH*xWALL_SQUARE_NUM) //游戏区域的宽度 300 #define GAME_WALL_HTGH (WALL_SQUARE_WIDTH*yWALL_SQUARE_WIDTH) //游戏区域的高度 460#define WINDOW_WIDTH 480 // 游戏总窗口宽度 480 #define WINDOW_HIGH 460  // 游戏总窗口高度 460//定义俄罗斯方块的相关参数#define ROCK_SQUARE_WIDTH (2*WALL_SQUARE_WIDTH) //俄罗斯方块的大小是围墙的两倍 20#define xROCK_SQUARE_NUM  ((GAME_WALL_WIDTH -20)/ROCK_SQUARE_WIDTH) // 游戏区x轴放的方块数目:14 #define yROCK_SQUARE_NUM  ((GAME_WALL_HTGH -20)/ROCK_SQUARE_WIDTH)  // 游戏区y轴放的方块数目:22//定义移动方块的相关操作#define DIRECT_UP    3  #define DIRECT_DOWN  2      #define DIRECT_LEFT  -1  #define DIRECT_RIGHT 1 /*数据结构-线性表(结构体数组)*/typedef struct ROCK{    //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)      unsigned short rockShapeBits;    int          nextRockIndex;  //下一个方块,在数组中的下标  } RockType;//方块在图形窗口中的位置(即定位4*4大块的左上角坐标)  typedef struct LOCATE{    int left;    int top;} RockLocation_t;//全局变量-游戏板的状态描述(即表示当前界面哪些位置有方块)  //0表示没有,1表示有(多加了两行和两列,形成一个围墙,便于判断方块是否能够移动)  int game_board[yROCK_SQUARE_NUM + 2][xROCK_SQUARE_NUM + 2] = { 0 };int game_socres = 0; //全局分数// 把俄罗斯方块的19种类放到数组中int rockTypeNum = 19;RockType RockArray[19] = { (0, 0) };//预览区的方块的位置RockLocation_t preRockLocation = {GAME_WALL_WIDTH+70,70};//每次生成初始化方块的位置RockLocation_t initRockLocation = { (WALL_SQUARE_WIDTH + 100), WALL_SQUARE_WIDTH };//分数显示的位置//各个文件中的函数// 画出界面以及画出方块Draw.h中void DrawGameWindow();void DisplayRock(int rockIdx, RockLocation_t*  LocatePtr, bool displayed);//初始化Init源文件void InitGame();//game.hvoid PlayGame();bool IsGameOver();#endif

Draw.h

#include"Head.h"//画出游戏界面void DrawGameWindow(){    //先画出围墙    setcolor(BLUE);    setlinestyle(PS_SOLID,NULL,0);    setfillcolor(BLUE);    //画出上下围墙    for (int x = WALL_SQUARE_WIDTH; x <= GAME_WALL_WIDTH; x += WALL_SQUARE_WIDTH)    {        fillrectangle(x - WALL_SQUARE_WIDTH, 0, x, WALL_SQUARE_WIDTH); //上        fillrectangle(x - WALL_SQUARE_WIDTH, GAME_WALL_HTGH - WALL_SQUARE_WIDTH, x, GAME_WALL_HTGH);//下    }    //画出左右围墙    for (int y = WALL_SQUARE_WIDTH; y <= GAME_WALL_HTGH; y += WALL_SQUARE_WIDTH)    {        fillrectangle(0, y, WALL_SQUARE_WIDTH, y + WALL_SQUARE_WIDTH);//左        fillrectangle(GAME_WALL_WIDTH - WALL_SQUARE_WIDTH, y, GAME_WALL_WIDTH, y + WALL_SQUARE_WIDTH);//右    }    //画出右边统计分数及相关东西    //画出分割线    setcolor(WHITE);    setlinestyle(PS_DASH,2);    line(GAME_WALL_WIDTH + 20, 0, GAME_WALL_WIDTH + 20, GAME_WALL_HTGH);    //设置字体    LOGFONT font;    gettextstyle(&font);    settextstyle(18, 0, _T("宋体"));    font.lfQuality = ANTIALIASED_QUALITY;//设置输出效果为抗锯齿     //1显示预览形状    outtextxy(GAME_WALL_WIDTH + 80, 30, _T("预览"));    outtextxy(GAME_WALL_WIDTH + 80, 170, _T("分数"));    outtextxy(GAME_WALL_WIDTH + 65, 250, _T("操作说明"));    outtextxy(GAME_WALL_WIDTH + 40, 290, _T("w a s d控制方向"));    outtextxy(GAME_WALL_WIDTH + 40, 335, _T("空格 暂停"));    //显示分数    setcolor(RED);    outtextxy(GAME_WALL_WIDTH + 90, 200, '0');}//在游戏区显示编号为rockIdx的方块void DisplayRock(int rockIdx,  RockLocation_t*  LocatePtr, bool displayed){    int color;//方块的填充颜色    int lineColor = WHITE;//线的颜色    int boardFalg = 0;    int xRock = 0;    int yRock = 0;    unsigned short rockCode = RockArray[rockIdx].rockShapeBits;    //如果displayed为true的话,将方块块颜色设置为white,game_board对应的位置设置为1;    //如果displayed为false的话,将方块块颜色设置为black,game_board对应的位置设置为0;    displayed ? (color = RED, boardFalg = 1) : (color = BLACK,lineColor = BLACK, boardFalg = 0);    setcolor(lineColor);    setfillcolor(color);    setlinestyle(PS_SOLID);//设置为实线,    xRock = LocatePtr->left;    yRock = LocatePtr->top;    int count = 0;//每4个换行,记录坐标偏移量    unsigned short mask = 1;    for (int i = 1; i <= 16; ++i)    {        mask = 1 << (16 - i);        if ((rockCode & mask) != 0) //如果不为0的话,就画出小方块        {                   fillrectangle(xRock , yRock, xRock + ROCK_SQUARE_WIDTH, yRock + ROCK_SQUARE_WIDTH);        }        if (i % 4 == 0) //换行        {            yRock = yRock + ROCK_SQUARE_WIDTH;              xRock = xRock = LocatePtr->left;        }        else        {            xRock += ROCK_SQUARE_WIDTH;        }    }}

Init.h

#include"Head.h"static void ShapeStrToBit(unsigned char *rockShapeStr, unsigned short& rockShapeBit);static void ReadRcok();void InitGame(){    //把全局游戏游戏版初始化,边界初始化为1    for (int i = 0; i < xROCK_SQUARE_NUM + 2; i++)    {        game_board[0][i] = 1//上边界        game_board[yROCK_SQUARE_NUM + 1][i] = 1; //下边界    }    for (int i = 0; i < yROCK_SQUARE_NUM + 2; i++)    {        game_board[i][0] = 1 ; //左边界        game_board[i][xROCK_SQUARE_NUM + 1] = 1; //右边界    }    //读取俄罗斯方块     ReadRcok();}//从文件中读取方块的形状存储到rockArray中void ReadRcok(){    FILE* fp 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值