C语言小游戏 ——俄罗斯方块

#include<stdio.h> 
#include<stdlib.h> 
#include<windows.h>//Sleep()函数的头文件 
#include<time.h> 
#include<conio.h> 
#define MOD 28 
#define SIZE_N 19//控制边框的高度
#define SIZE_M 12 //控制边框的宽度
int a[100]={200,30,20};//定义排行榜
int cur_x,cur_y,score,mark,next,map[SIZE_N][SIZE_M],Gamespeed=300; 
char key1,key; 
int shape[28][6]={//这是个比较偷懒的方法,就是7种方块,加上旋转总共28种 
{0,-1,0,-2,1,0}, {0,1,1,0,2,0}, {-1,0,0,1,0,2}, {0,-1,-1,0,-2,0}, 
{0,-1,0,1,-1,0}, {0,1,1,0,-1,0},{1,0,0,-1,0,1}, {1,0,-1,0,0,-1}, 
{-1,1,0,1,1,0}, {0,-1,1,0,1,1},{-1,0,0,-1,1,-1}, {-1,-1,-1,0,0,1}, {-1,0,0,1,1,1}, {0,1,1,-1,1,0},{-1,0,0,1,1,1}, {0,1,1,-1,1,0}, 
{-1,0,0,-1,0,-2}, {-1,0,-2,0,0,1},{0,1,0,2,1,0}, {0,-1,1,0,2,0}, 
{0,1,1,0,1,1}, {0,-1,1,0,1,-1}, {-1,0,0,-1,-1,-1}, {-1,0,-1,1,0,1}, 
{0,1,0,2,0,3}, {1,0,2,0,3,0}, {0,-1,0,-2,0,-3}, {-1,0,-2,0,-3,0} 
};                     
void gotoxy(int x,int y)
{COORD c; //定义了一个结构体变量c,有两个成员x,yc.X=x-1; c.Y=y-1; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);//设置控制台光标位置 
} 
//游戏结束的判断函数
void Gameover()
{//游戏结束的判断 int i,j,flag=0; for(j=1;j<SIZE_M-1;j++){if(map[1][j]!=0){ flag=1;break; } } if(flag==1){ for(i=1;i<SIZE_N-1;i++){ gotoxy(2,i+1); for(j=1;j<SIZE_M-1;j++){ printf("■"); }puts(""); } gotoxy(7,3); int t;for(j=0;j<3;j++)for(i=0;i<3-j;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("GAME OVER!"); gotoxy(8,9); //输出下面一行内容的位置是9行7列printf(" 排行榜 \n");for(i=0,j=6;i<3;i++,j++){gotoxy(8,j); printf(" 第%d名 %d\n",i+1,a[i]);} gotoxy(1,SIZE_N+1); exit(0); //游戏结束} 
} 
//显示游戏底板的函数
void ShowMap(int id)
{ int i,j; gotoxy(1,1); if(id!=-1){ for(i=0;i<SIZE_N;i++){ for(j=0;j<SIZE_M;j++){ if(i==0&&j==0 || i==0&&j==SIZE_M-1 || j==0&&i==SIZE_N-1 || j==SIZE_M-1&&i==SIZE_N-1)printf(" "); else if(i==0 || i==SIZE_N-1)printf("--"); //控制游戏上下边框的图案else if(j==0 || j==SIZE_M-1)printf("|"); //控制游戏左右边框的图案else if(map[i][j]==2) printf("■"); //图形落地时里边的图案else if(i==cur_x+shape[id][0] && j==cur_y+shape[id][1] || i==cur_x+shape[id][2] && j==cur_y+shape[id][3] || i==cur_x+shape[id][4] && j==cur_y+shape[id][5] || i==cur_x && j==cur_y) printf("■"); //图形开始出现时的图案else if(map[i][j]==0) printf("  ");  //游戏边框里的填充图案} if(i==1)printf("   next:"); //表示提示下一次出现的图形的条件if(i==11)printf("   score :   %d",score); //计算所得的分数if(i==13)printf("   speed :   %d",score/100+1); //控制图形下落的速度if(i==15)printf("   空格键:   暂停");if(i==16)printf("   左方向键左移-右方向键右移");if(i==17)printf("   上方向键变形-下方向键下降");puts(""); } } else { mark=1; for(i=0;i<SIZE_N;i++){ for(j=0;j<SIZE_M;j++){ if(i==0&&j==0 || i==0&&j==SIZE_M-1 || j==0&&i==SIZE_N-1 || j==SIZE_M-1&&i==SIZE_N-1)printf("  "); //控制else if(i==0 || i==SIZE_N-1)printf("--"); //控制图形落地消除时上下边界的变化else if(j==0 || j==SIZE_M-1)printf("|"); //控制图形落地消除时左右边界的变化else if(map[i][j]==2) printf("■"); //控制图形落地消除时形状的变化else if(map[i][j]==0) printf("  ");  //控制图形落地消除时边框内部填充图案的变化} if(i==1)printf("   next:"); //表示提示下一次出现的图形的条件if(i==11)printf("   score :   %d",score); //计算所得的分数if(i==13)printf("   speed :   %d",score/100+1); //控制图形下落的速度if(i==15)printf("   空格键:   暂停");if(i==16)printf("   左方向键左移-右方向键右移");if(i==17)printf("   上方向键变形-下方向键下降");puts(""); } } /*对于next 方块的处理,先擦除再画图*/ for(i=2;i<=10;i++){ for(j=23;j<=34;j++){ gotoxy(j+1,i+1);printf("  "); } }  gotoxy(29,6); printf("■"); //控制下一个图形出现提示图形的位置,29是列,6是行for(i=0;i<6;i=i+2){ gotoxy(29+2*shape[next][i+1],6+shape[next][i]); printf("■"); } Sleep(Gamespeed); //Sleep是一个库函数,是表示时间的函数,这里用来控制图形下落的速度
} 
//初始化函数,cur_x,cur_y是全局变量,标记了移动方块的位置 
void init(int id){memset(map,0,sizeof(map)); //memset函数重新申请内存空间for(int i=0;i<SIZE_N;i++){ for(int j=0;j<SIZE_M;j++) if(i==SIZE_N-1 || j==0 || j==SIZE_M-1) map[i][j]=-1; } cur_x=0; cur_y=6; ShowMap(id); 
}
//颜色函数
void color(int n_color)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n_color);
}
//判断是否出界,或者说是否合法的函数 
int judge_in(int x,int y,int id){if(map[x][y]!=0)return 0; for(int i=0;i<6;i=i+2){ if(map[ x+shape[id][i] ][ y+shape[id][i+1] ]!=0)return 0; }return 1; 
} 
//得分,擦除行的闪烁,还有图形的向下平移 
void fun_score(){for(int i=1;i<SIZE_N-1;i++){ int flag=0;for(int j=1;j<SIZE_M-1;j++){if(map[i][j]!=2){ flag=1;break;} } if(flag==0){ int k=3; while(k--){ gotoxy(2,i+1); for(int ii=1;ii<SIZE_M-1;ii++){if(map[i][ii]==2){ if(k%2==1) {printf("  ");srand(time(NULL));int a=rand()%12;switch(a){case 0:color(0x0E);break;//case 1:color(0x03);break;//lancase 2:color(0x04);break;//hongcase 3:color(0x05);break;//zihongcase 4:color(0x06);break;//huangcase 5:color(0x07);break;//baicase 6:color(0x08);break;//huicase 7:color(0x09);break;//shenlancase 8:color(0x0A);break;//case 9:color(0x0B);break;case 10:color(0x0C);break;case 11:color(0x0D);break;}}//控制消除的行数else printf("■"); } }Sleep(100); //执行到Sleep()函数时,程序在那里等100毫秒} for(int ii=i;ii>1;ii--){ for(int jj=1;jj<SIZE_M-1;jj++)map[ii][jj]=map[ii-1][jj]; } ShowMap(-1); score+=10; //控制每次得分时所加的分数if(score%100==0 && score!=0)Gamespeed-=50;// 控制形状下落的速度} } 
} 
//主函数
int main()
{ int i,id,set=1; srand(time(NULL)); id=rand()%MOD; id=(id+MOD)%MOD; next=rand()%MOD; next=(next+MOD)%MOD; //使随机出现图形init(id); while(1){ 
Here:   mark=0;// 标志位if(set==0){ id=next; next=rand()%MOD; next=(next+MOD)%MOD; cur_x=0;cur_y=6; set=1; } while(!kbhit())//kbhit()在执行时,检测是否有按键按下,有按下返回键值,//没有按下返回0;是非阻塞函数getch() 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数.{ Gameover(); if(judge_in(cur_x+1,cur_y,id)==1) cur_x++; //判断图形是否出界else { map[cur_x][cur_y]=2; for(i=0;i<6;i=i+2) map[ cur_x+shape[id][i] ][ cur_y+shape[id][i+1] ]=2; set=0; } fun_score(); if(mark!=1)ShowMap(id); //当标志的那一行为1时,就把那一行消掉goto Here; }//end of while(!kbhit()) key=getch(); if(key1==-32 && key==72)//控制转换图形变形的操作{ int tmp=id ;id++; if( id%4==0 && id!=0 )id=id-4; if(judge_in(cur_x,cur_y,id)!=1)id=tmp; } else if(key1==-32 && key==80 && judge_in(cur_x+1,cur_y,id)==1)cur_x++; //使图形向下移动的操作else if(key1==-32 && key==75 && judge_in(cur_x,cur_y-1,id)==1)cur_y--; //使图形向左移动的操作else if(key1==-32 && key==77 && judge_in(cur_x,cur_y+1,id)==1)cur_y++; //使图形向右移动的操作//****************************else if(key==32)   //按空格键,暂停{Sleep(1);while(1){if(kbhit())   //再按空格键,继续游戏{key=getch();if(key==32){goto label;}}}}//*****************************else if(key==27)return 0; 
label:key1=key; }return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++课程设计 之职工管理系统

文章目录 (一) 题目内容及简介(二) 概要设计(三) 详细设计(四) 实现代码(五) 相关案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十案例十一(一) 题目内容及简介 1.课题来源 课题名称和来源,主要介绍为何选择此题目来开展课程设计,此课题的开展能体现面向…

C++ 知识要点

1.类与对象 类是事物的抽象。类的对象就是类的具体化&#xff0c;实际化 2.C三大特性 继承、封装、多态 3.C父类与子类继承过程中&#xff0c;子类的特点&#xff1f; 子类拥有父类的所有属性和行为 子类就是一种特殊的父类 子类对象可以当作父类对象使用 子类中可以添加父类…

C/C++小游戏 ——贪吃蛇

文章目录案例一案例二案例三案例四案例五案例六案例七案例八案例九案例一 #include <stdio.h>#include <windows.h>#include <conio.h>#include <time.h>//游戏窗口#define FrameX 4//游戏窗口左上角的X轴坐标#define FrameY 4//游戏窗口左上角的Y轴坐…

C/C++课程设计 新生入学管理系统(二)

文章目录 案例十六案例十七案例十八案例十九案例二十案例二十一案例二十二案例二十三案例二十四案例二十五案例二十六案例二十七案例二十八案例十六 #include<iostream> #include<cstring> //strcpy,strcmp #

Java类名.方法和变量

文章目录(1) 类名.方法(2) 变量(1) 类名.方法 要是类名直接调用的方法&#xff0c;那这个方法就是静态的(static)方法&#xff0c;是不用new出新对象实例就可以直接调用的方法。看下面例子&#xff1a; class A {public static void Method1(int a, int b) {//方法体}public …

Java小案例(二) 用数组实现增删查改排序

文章目录案例一案例二案例三案例四案例五案例一 Student.Java package curd;public class Student {private String stuid;private String name;private int chinese;private int math;private int english;private int avg;private int sum;public int getAvg() {return avg;…

有趣的一行代码

文章目录爱心曼德勃罗集合打印99乘法表实现快速排序禅语漫画迷宫爱心 print(\n.join([.join([(❤❤❤❤❤❤❤❤❤❤❤❤[(x-y)%12]if((x*0.05)**2(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<0 else )for x in range(-30,30)])for y in range(15,-15,-1)]))效果图&#xff1…

Python练习之 对文件进行创建,然后重命名文件最近进行文件删除

import os os.mkdir("D:\\1815925603") context ("序号&#xff1a;1815925603\n""姓名&#xff1a;阿信\n""班级&#xff1a;18云计算2班\n") with open (D:\\1815925603\\file1.txt,a) as fp:fp.write(context)fp.seek(0, 0) with …

Java接口中的成员变量为什么必须是static ?

接口的含义 接口就是提供一种统一的协议, 而接口中的属性也属于协议中的成员。它们是公共的,静态的,最终的常量。相当于全局常量。 在interface里面的变量都是public static final 的。 public static final int i10;等价于int i10;(可以省略掉一部分) //注意在声明的时候要…

Java函数式编程和面向对象编程

文章目录什么是函数式编程&#xff1f;什么是面向对象编程&#xff1f;函数式编程和面向对象编程的优缺点什么是函数式编程&#xff1f; 函数式编程的核心&#xff1a;在思考问题时&#xff0c;使用不可变对象和函数&#xff0c;函数将一个值经过处理&#xff0c;映射成另一个…

JDBC实现图书管理小案例

文章目录项目文件结构项目运行效果项目详细代码项目文件下载相关案例案例一案例二案例三案例四案例五案例六案例七案例八项目文件结构 项目运行效果 项目详细代码 JDBCUtils.java package jdbc;import java.sql.*; import com.mysql.jdbc.Driver;public class JDBCUtils {pri…

Java实现多线程售票

文章目录Synchronized和Lock的区别是什么&#xff1f;案例一方法一 继承Thread类方法二 实现Runnable接口案例二方法一 继承Thread类方法二 实现Runnable接口案例三方法一 继承Thread类方法二 实现Runnable接口案例四方法一 继承Thread类方法二 实现Runnable接口案例五方法一 继…

基于TCP原理,采用Socket通信技术,实现聊天室

文章目录案例一案例二案例三案例四案例五相关案例案例一 Client.java package SocketCode;import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import java.io.*; import …

HTML+CSS+JS 实现登录注册界面

文章目录案例一 滑动样式案例二 滑动样式案例三 动态样式案例四 普通样式案例五 滑动样式案例六 普通样式具体怎么获取呢&#xff1f;案例一 滑动样式 login.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

数据结构课程设计 迷宫问题

文章目录一、 目的与要求二、 问题描述和求解方法三、 解题过程四、 实现源码五、 相关案例案例一案例二一、 目的与要求 1、目的&#xff1a; 通过布置具有一定难度的实际程序设计项目&#xff0c;使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和…

html+css 小案例(一)

文章目录点击下载index.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><title>Demo_Test</title><link rel"stylesheet" href"css/Dec.css"> </head> <body…

HTML+CSS+JS 表白代码

文章目录案例一 爱你到天昏地暗案例二 带有音乐的表白代码案例三 带有图片旋转的表白案例源码案例一 爱你到天昏地暗 <html> <style type"text/css"> <!-- .STYLE1 {font-size: medium} --> </style> <center><br><br>…

Linux常用命令与基本操作、填空题、简答题

文章目录基本知识点基本操作叙述什么是shell?重启虚拟机网络分区查看当前进程查看主机名重启关机查看IP地址文件搜索挂载查看网络配置linux系统中Vi的三种模式磁盘分区查看硬盘信息df&#xff0c;fdisk&#xff0c;lsblk区别进程用户用户信息查看用户密码信息修改密码添加用户…

Java中List、Map、Set三个接口,存取元素时,各有什么特点?

特点 List与Set都是单列元素的集合&#xff0c;它们有一个功共同的父接口Collection。 1.Set里面不允许有重复的元素&#xff0c; 存元素&#xff1a;add方法有一个boolean的返回值&#xff0c;当集合中没有某个元素&#xff0c;此时add方法可成功加入该元素时&#xff0c;则…

客户端与服务器(C/S架构与B/S架构)、AJax学习

文章目录HTTP请求与服务器客户端与服务器1.C/S架构与B/S架构2.web资源介绍3.资源访问流程HTTP协议1.什么是协议&#xff1f;2.什么是HTTP协议3.HTTP组成部分4.请求的发送方式什么是Ajax技术Ajax可以做什么&#xff1f;伪造AjaxHTTP请求与服务器 客户端与服务器 1.C/S架构与B/…