返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言怎么实现俄罗斯方块的六种模式
  • 949
分享到

C语言怎么实现俄罗斯方块的六种模式

2023-06-29 08:06:15 949人浏览 独家记忆
摘要

这篇文章主要介绍了C语言怎么实现俄罗斯方块的六种模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最终效果主页模式选择按1进入单人模式按2进入双人模式标准模式:除了左右下移动

这篇文章主要介绍了C语言怎么实现俄罗斯方块的六种模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

最终效果

主页

C语言怎么实现俄罗斯方块的六种模式

模式选择

C语言怎么实现俄罗斯方块的六种模式

按1进入单人模式

C语言怎么实现俄罗斯方块的六种模式

按2进入双人模式

C语言怎么实现俄罗斯方块的六种模式

标准模式:除了左右下移动,增加了直接下落和暂停,增加了等级判定

C语言怎么实现俄罗斯方块的六种模式

地狱模式:在标准模式的前提下加快了下落速度,更刺激!

C语言怎么实现俄罗斯方块的六种模式

作弊模式:增加炫彩模式,变形,加速以及减速功能

C语言怎么实现俄罗斯方块的六种模式

 双人标准赛:设计了一个判定胜负平局的算法

C语言怎么实现俄罗斯方块的六种模式

双人地狱存活赛:刺激到不行!!

C语言怎么实现俄罗斯方块的六种模式

双人计时赛:设置了计时器,重新设定了判定胜负平局的算法,在规定时间内分数高者胜!

C语言怎么实现俄罗斯方块的六种模式

 结束动画

C语言怎么实现俄罗斯方块的六种模式

C语言怎么实现俄罗斯方块的六种模式

代码部分

main.c

#include <stdio.h>#include <stdlib.h>#include "game.h"#include "mywindows.h"#include <coNIO.h> #include <mmsystem.h>#pragma comment (lib, "winmm.lib") void chooseMode(){   if(kbhit()){         mciSendString("close g",NULL,0,NULL);        switch(getch()){        case 49:        case 97: gameInit(1);break;        case 50:        case 98: gameInit(2);break;         case 51:        case 99: gameInit(3);break;        }   }} void chooseMode2(){    if(kbhit()){             mciSendString("close g",NULL,0,NULL);        switch(getch()){        case 49:        case 97: gameInit1(1);break;        case 50:        case 98: gameInit1(2);break;         case 51:        case 99: gameInit1(3);break;        }   }} int main(){     ///初始化句柄,必须放在最开始    initHandle();    ///开始动画    mciSendString("open 俄罗斯方块进入音乐.mp3 alias g",NULL,0,NULL);     mciSendString("play g repeat",NULL,0,NULL);    printAnimation();     if(kbhit()){            getch();        chooseWindow();     }    if(kbhit()){        switch(getch()){        case 49:        case 97: chooseWindow2();chooseMode();break;        case 50:        case 98: chooseWindow3();chooseMode2();break;         }    }    return 0;}

mywindows.c

#include "mywindows.h"  //尖括号常用于引入系统头文件,双引号常用于引入自己定义的头文件   默认检索顺序不同 HANDLE handle; //函数定义 void initHandle(){    handle = GetStdHandle(STD_OUTPUT_HANDLE);    hideCursor();//游戏启动后隐藏光标位置    //} void setColor(int color){    SetConsoleTextAttribute(handle,color);} void setPos(int x,int y){    COORD coord = {x*2,y};    //字母abcd:一个字符,汉字:两个字符    SetConsoleCursorPosition(handle,coord); //设置句柄位置} void hideCursor(){    CONSOLE_CURSOR_INFO info;        //系统的结构体变量名字都是大写    info.bVisible = FALSE;           //设置光标是否可见    info.dwSize = 1;                 //设置光标宽度(1-100)    SetConsoleCursorInfo(handle,&info);//指针取地址符}

game.c 关键代码

单人模式窗体打印

void printGradeLevel1(int num){    switch(num){        case 1:            grade1+=10; break;        case 2:            grade1+=30; break;        case 3:            grade1+=50; break;        case 4:            grade1+=80; break;    }     if(grade1 < 100){        level1 = 1;    }    else if(grade1 >= 100 && grade1 < 300){        level1 =2;    }     setColor(0x0c);    setPos(4,8);    printf("分数:%d",grade1);     setPos(4,9);    printf("等级:%d",level1);} void printGradeLevel2(int num){    switch(num){        case 1:            grade2+=10; break;        case 2:            grade2+=30; break;        case 3:            grade2+=50; break;        case 4:            grade2+=80; break;    }     if(grade2 < 100){        level2 = 1;    }    else if(grade2 >= 100 && grade2 < 300){        level2 =2;    }     setColor(0x09);    setPos(51,8);    printf("分数:%d",grade2);     setPos(51,9);    printf("等级:%d",level2);}

双人模式窗体打印

void windowPrint2(int x,int y){     int i,j;  //用来遍历二维数组    for(i=0;i<25;i++){        for(j=0;j<58;j++){            if(windowShape2[i][j] == 1){                setColor(0xc0);                setPos(x+j,y+i);  //x是列,y是行                printf("%2s","");  // <-->  printf("  ");            }        }    }     for(i=0;i<25;i++){        for(j=29;j<58;j++){            if(windowShape2[i][j] == 1){                setColor(0x90);                setPos(x+j,y+i);  //x是列,y是行                printf("%2s","");  // <-->  printf("  ");            }        }    } } //操作规则框架void printInfo(){    setColor(0x0c);    setPos(2,2);    printf("N");    setPos(2,3);    printf("E");    setPos(2,4);    printf("X");    setPos(3,3);    printf("T");    setPos(3,14);    printf("红方操作规则");    setPos(3,15);    printf("------------");    setPos(2,16);    printf("按 a 或 A 左移");    setPos(2,17);    printf("按 d 或 D 右移");    setPos(2,18);    printf("按 s 或 S 下移");    setPos(2,19);    printf("按 w 或 W 变方向");    setPos(2,20);    printf("按 q 直接下落");     setColor(0x03);     setPos(49,2);    printf("N");    setPos(49,3);    printf("E");    setPos(49,4);    printf("X");    setPos(50,3);    printf("T");    setPos(50,14);    printf("蓝方操作规则");    setPos(50,15);    printf("------------");    setPos(49,16);    printf("按 ←键 左移");    setPos(49,17);    printf("按 →键 右移");    setPos(49,18);    printf("按 ↑键 下移");    setPos(49,19);    printf("按 ↓键 变方向");    setPos(49,20);    printf("按 回车 直接下落");    setPos(27,1);    printf("--战况--");    setPos(27,3);    printf("--------");}

方块打印

void printBlock1(int x,int y,int shape,int status,int color){    int i,j;    for(i = 0;i<4;i++){        for(j = 0;j<4;j++){            if(block[shape][status][i][j] == 1){                setColor(color);                setPos(x+j,y+i);                printf("■");            }        }    }} void printBlock2(int x,int y,int shape,int status,int color){    int i,j;    for(i = 0;i<4;i++){        for(j = 0;j<4;j++){            if(block[shape][status][i][j] == 1){                setColor(color);                setPos(x+j,y+i);                printf("■");            }        }    }}

碰撞检测

 //碰撞检测基于下一个位置的检测,数组与界面坐标的对应int crash2(int x,int y,int shape,int status){    int i,j;    for(i = 0;i<4;i++){        for(j = 0;j<4;j++){            if(block[shape][status][i][j] == 1){                if(windowShape2[y+i][x+j] == 1){                      ///发生碰撞                      if(cur_block1.x == 17 && cur_block1.y == 1){                        ///游戏结束                        return -2;                      }                      ///方块落到游戏池底部,发生碰撞                      return -1;                }             }        }     }    return 0;}

胜负判断

 void bottomBlock1(){    while(crash2(cur_block1.x,cur_block1.y+1,cur_block1.shape,cur_block1.status) != -1&&crash2(cur_block1.x,cur_block1.y+1,cur_block1.shape,cur_block1.status) != -2){     cur_block1.y += 1;      }         if(crash2(cur_block1.x,cur_block1.y+1,cur_block1.shape,cur_block1.status) == -1){            ///发生碰撞:方块落到游戏池底部            ///产生新的方块:下一个方块值 -> 当前正在下落的方块,重新产生下一个方块            save1();            removeLine1();//            lineClear();            updateGame1();            copyBlock1();     }    else if(crash2(cur_block1.x,cur_block1.y+1,cur_block1.shape,cur_block1.status) == -2){        ///游戏结束     }}

按键检测以及双人胜负判断算法

int gameInit1(int mode){    if(mode == 1){         mciSendString("open 双人标准.mp3 alias d",NULL,0,NULL);     mciSendString("play d repeat",NULL,0,NULL);    }    if(mode == 2){        mciSendString("open 双人地狱.mp3 alias e",NULL,0,NULL);     mciSendString("play e repeat",NULL,0,NULL);    }    if(mode == 3){        mciSendString("open 双人限时.mp3 alias f",NULL,0,NULL);     mciSendString("play f repeat",NULL,0,NULL);    }    int counter = 180;    float speed ;    if(mode == 1){        speed = 0.45;    }    else if(mode == 2){        speed = 0.25;    }    else if(mode == 3){        speed = 1;    }    ///初始化句柄,必须放在最开始    initHandle();    ///打开音乐文件     windowPrint2(0,0);      printInfo();    printGradeLevel1(0);    printGradeLevel2(0);    ///游戏开始时间    clock_t startTime = clock();       ///定时器    clock_t time1,time2;    time1 = clock();      startBlock1();    startBlock2();    nextBlock1();    nextBlock2();       while(1){        //按键驱动        ///检测是否有按键按下        if(kbhit()){            switch(getch()){            case 'w':            case 'W':               changeStatusBlock1();break;            case 'a':            case 'A':                leftBlock1();break;            case 'd':            case 'D':                rightBlock1();break;            case 's':            case 'S':                downBlock1();break;            case 72:               changeStatusBlock2();break;            case 75:                leftBlock2();break;            case 77:                rightBlock2();break;            case 80:                downBlock2();break;            case 32:                bottomBlock1();break;            case 13:                bottomBlock2();break;            }        }         time2 = clock();   if(mode == 1|| mode == 2){        ///每0.45秒下落一次        if((float)(time2-time1)/CLOCKS_PER_SEC > speed){                 setPos(27,2);            if(downBlock1() == -2) {                    if(grade2>grade1){                            printf("蓝 方 胜!");break;                        }                        else if(downBlock2() == -2){                            if(grade1==grade2){                            printf("平     局");break;                            }                            else{                            printf("红 方 胜!");break;                            }                        }                    }                setPos(27,3);            if(downBlock2() == -2) {                  if(grade1>grade2){                            printf("红 方 胜!");break;                        }                        else if(downBlock1() == -2){                            if(grade1==grade2){                            printf("平     局");break;                            }                            else{                            printf("蓝 方 胜!");break;                            }                        }             }            time1 = time2;        }     } else if(mode == 3){        setPos(2,10);        printf("剩余时间:%3DS",counter);        setPos(50,10);        printf("剩余时间:%3dS",counter);   if((float)(time2-time1)/CLOCKS_PER_SEC > speed){                counter--;                setPos(27,2);                if(counter == 0){                    if(grade2>grade1){                            printf("蓝 方 胜!");break;                        }                    if(grade1==grade2){                            printf("平     局");break;                    }                    else{                            printf("红 方 胜!");break;                        }                }             if(downBlock1() == -2) {                    if(grade2>grade1){                            printf("蓝 方 胜!");break;                        }                        else if(downBlock2() == -2){                            if(grade1==grade2){                            printf("平     局");break;                            }                            else{                            printf("红 方 胜!");break;                            }                        }                    }                setPos(27,3);            if(downBlock2() == -2) {                  if(grade1>grade2){                            printf("红 方 胜!");break;                        }                        else if(downBlock1() == -2){                            if(grade1==grade2){                            printf("平     局");break;                            }                            else{                            printf("蓝 方 胜!");break;                            }                        }             }            time1 = time2;      } }} if(mode == 1){         mciSendString("close d",NULL,0,NULL);     }    if(mode == 2){        mciSendString("close e",NULL,0,NULL);     }    if(mode == 3){        mciSendString("close f",NULL,0,NULL);     }Sleep(1150);printOver();printFinish(mode);}

初始界面动画打印

void printStart(int x,int y){     //随机产生颜色    int color = rand()%0x10;    //处理黑色的情况    if(color == 0x00)    {        color = 0x0f;    }     setColor(color);    setPos(x,y);    printf("■■■■■  ■■■■■  ■■■■■  ■■■■  ■■■  ■■■■");    setPos(x,y+1);    printf("    ■      ■              ■      ■    ■    ■    ■");    setPos(x,y+2);    printf("    ■      ■■■■        ■      ■■■      ■      ■■■");    setPos(x,y+3);    printf("    ■      ■              ■      ■  ■      ■          ■");    setPos(x,y+4);    printf("    ■      ■■■■■      ■      ■    ■  ■■■  ■■■");     setPos(25,14);    printf("按任意键开始游戏!");    setPos(50,30);    printf("author 赵敬轩");    }

game.c 完整代码

源码地址

gitee:https://gitee.com/i-dream-code/Tetris/

GitHub:Https://github.com/zhaojingxuan123/StrongestTetris

百度云盘:链接:https://pan.baidu.com/s/1PX1gALLB0znXnE8e2c_YSQ
提取码:1234

导入方法

博主使用的是codeblocks,一款很好用的编译器

网盘链接:链接:https://pan.baidu.com/s/18bYwcgggK9mLjca4GCkxtQ
提取码:1234

安装好codeblocks后,将 20200705.cbp 直接拖到codeblocks的左侧面板即可

C语言怎么实现俄罗斯方块的六种模式

上方build=>run即可运行

C语言怎么实现俄罗斯方块的六种模式

感谢你能够认真阅读完这篇文章,希望小编分享的“C语言怎么实现俄罗斯方块的六种模式”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

--结束END--

本文标题: C语言怎么实现俄罗斯方块的六种模式

本文链接: https://lsjlt.com/news/323538.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言怎么实现俄罗斯方块的六种模式
    这篇文章主要介绍了C语言怎么实现俄罗斯方块的六种模式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最终效果主页模式选择按1进入单人模式按2进入双人模式标准模式:除了左右下移动...
    99+
    2023-06-29
  • C语言实现俄罗斯方块的六种模式详程建议收藏
    --------写在前面--------         第一次做标题党,大家轻喷哈。这个游戏是博主在...
    99+
    2024-04-02
  • c语言俄罗斯方块怎么实现
    在C语言中实现俄罗斯方块游戏需要用到控制台字符界面和一些基本的游戏逻辑。以下是一个简单的实现思路: 界面设计:使用控制台字符来表示...
    99+
    2024-04-02
  • 如何用C语言实现俄罗斯方块
    这篇文章主要介绍“如何用C语言实现俄罗斯方块”,在日常操作中,相信很多人在如何用C语言实现俄罗斯方块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用C语言实现俄罗斯方块”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-08
  • C语言实现俄罗斯方块课程设计
    本文实例为大家分享了C语言实现俄罗斯方块的具体代码,供大家参考,具体内容如下 该课程设计用VC++6.0操作如下: 1、文件->新建->文件->左边选C/C++ ...
    99+
    2024-04-02
  • C++实现俄罗斯方块源码
    本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下 先是效果图: 主菜单: 游戏: 设置: 错误处理: 代码: #include <ios...
    99+
    2024-04-02
  • C/C++实现俄罗斯方块游戏
    目录一、游戏效果展示二、完整代码三、所需开发环境四、具体项目实现①游戏欢迎界面 welcome( )②游戏背景 initGameScreen( ) ③方块表示 int bl...
    99+
    2024-04-02
  • C++实现俄罗斯方块小游戏
    本文实例为大家分享了C++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下 操作说明: D F:左右旋转 J  L:左右移动 E(一堆键都行): 加快下落速度 空格...
    99+
    2024-04-02
  • C语言俄罗斯方块游戏课程设计
    本文实例为大家分享了C语言实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 1、设计流程 2、相关程序 #include<stdio.h> #include&...
    99+
    2024-04-02
  • c++如何实现俄罗斯方块游戏
    这篇文章主要介绍“c++如何实现俄罗斯方块游戏”,在日常操作中,相信很多人在c++如何实现俄罗斯方块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c++如何实现俄罗斯方块游戏”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-22
  • c++实现俄罗斯方块游戏代码
    俄罗斯方块c++ 1.创建项目2.总共需要创建两个文件,一个main.cpp,一个是elsfk2.h。本人使用的编译器是vs2019. 3.在项目的源文件夹下创建一个文件夹image...
    99+
    2024-04-02
  • java实现简单的俄罗斯方块
    本文实例为大家分享了java实现简单俄罗斯方块的具体代码,供大家参考,具体内容如下 结合网上的资料刚做完课程设计,具体代码如下: public class TetrisPanel e...
    99+
    2024-04-02
  • python实现简单的俄罗斯方块
    本文实例为大家分享了python实现简单的俄罗斯方块的具体代码,供大家参考,具体内容如下 1. 案例介绍 俄罗斯方块是由 4 个小方块组成不同形状的板块,随机从屏幕上方落下,按方向键...
    99+
    2024-04-02
  • 怎么用Javascript实现俄罗斯方块游戏
    这篇文章主要介绍“怎么用Javascript实现俄罗斯方块游戏”,在日常操作中,相信很多人在怎么用Javascript实现俄罗斯方块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • HTML5怎么实现WebGL 3D版俄罗斯方块
    今天小编给大家分享一下HTML5怎么实现WebGL 3D版俄罗斯方块的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2024-04-02
  • python是怎么实现简单的俄罗斯方块
    本篇文章为大家展示了python是怎么实现简单的俄罗斯方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-26
  • Java实现俄罗斯方块的代码怎么写
    本文小编为大家详细介绍“Java实现俄罗斯方块的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现俄罗斯方块的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体实现代码: ...
    99+
    2023-06-30
  • 使用canvas怎么实现一个俄罗斯方块
    本篇文章给大家分享的是有关使用canvas怎么实现一个俄罗斯方块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。界面的实现整个面板就是以左上角(0,0)为原点的坐标系,右上角(1...
    99+
    2023-06-09
  • C#游戏开发之实现俄罗斯方块游戏
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2023-01-05
    C#俄罗斯方块游戏 C#俄罗斯方块 C# 游戏
  • Python实现简单的俄罗斯方块游戏
    本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。 源码分享: import o...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作