C语⾔—俄罗斯⽅块(萌新向)
废话不多说,我尽可能⽤最直⽩的⽅法写下代码思路
数据类型设计:
就是提前设置好起始的X,Y(不是从(0,0) 开始的)长度宽度,定义好上下左右, 后⾯⽤到就很⽅便;
关键是:
1. ⽤⼀个结构体表⽰俄罗斯⽅块的中⼼块(不是全部),包含它的坐标x y,类型(1到19),对应的颜⾊,下⼀个⽅块类型 ,
2. ⽤⼀个坐标数组储存每个坐标的状态(0. 空⽩, 1. 已下落的⽅块,2.墙壁 ,
3. 还在下落的⽅块 )
游戏整体框架:
乍⼀看好像挺简单的样⼦。但是实际操作起来。需要主要注意两个模块。
⼀. 怎么移动俄罗斯⽅块
写过贪吃蛇的都知道。或者说没有写过应该也知道:
移动就是把旧的⼀部分擦掉, 把新的打印出来
怎么打印 / 消除当前⽅块?
这⾥我们⽤⼀个中⼼⽅块(⼀个结构体类型,储存当前坐标的x,y值,当前⽅块的类型编号)来代表当前的俄罗斯⽅块。因为每个俄罗斯⽅块都是由4个⼩⽅块组成的,因此我们可以通过他们和中⼼⽅块的相对位置来表⽰。
我⽤的(其实是视频中的⽅法)办法:写⼀个传递函数, 传⼊中⼼块结构体地址,把俄罗斯⽅块全部的19种类型的排列⽅式都写好对应的坐标赋值为3,就可以按照各种编号打印出⽅块的整体了。
这⾥对19种类型说明⼀下:
举个栗⼦,⽐如:
我们要打印⼀个⽥字形:
中⼼块坐标已经赋值好了是x= tetris->x, y= tetris->y, 那么根据相对位置:1号是 x=tetris->x+1; y=tetris->y;
2号的 x=tetris->x; y=tetris->y+1;(向下是y+1)
3号的 x=tetris->x+1; y=tetris->y+1;
我们把它们赋值为sign(是1,或者是0,或者是3)
19种慢慢写就好了;
然后我们对标记为3的进⾏打印, 对标记为0的进⾏消除;
打印就是对这4×4的矩阵遍历⼀遍, 如果遇到3,那么打印⼀个⼩⽅块’■’;如图:
消除同理遍历⼀遍, 如果遇到0,那么打印⼀个空格‘ ’。
另外再写这2个函数即可。
⼆. 怎么判断能否移动
不能移动就代表着:**如果移动了,那么会碰到(或者说重叠)墙壁或者其他⽅块。**这样⼦我们可以写⼀个ifmove函数来判断。这个函数很长, 我⽤的是笨办法, 对传⼊的中⼼块类型进⾏对应的判断,
如果有⼀个值不是0,那么说明不能移动,结构与上⾯差不多,这⾥就不赘述了;
虽说还有其他的函数, 但是理解了这两个其他的就很容易上⼿了。
上代码:*(⼀些关键的函数说明放在后⾯)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<conio.h>
#define FrameX 13
#define FrameY 3
#define Frame_width 18
#define Frame_hight 20
#define UP    72
#define DOWN  80
#define LEFT  75
#define RIGHT 77
#define ESC  27
#define SPACE 32
int a[80][80]={0}/*存储每个坐标的状态*/,gr=1/*游戏结束标注*/,co[80][80]={0}/*储存对应的颜⾊*/;                                                //0 空⽩, 1 块 2 墙int speed=200 /*速度*/, score = 0 /*得分*/, highest=0  /*最⾼得分*/, m=0 /*是否第⼀个⽣成的⽅块*/;
struct Tetris{
int x;
int y;
int flag;                                        //类型序号
int color;
int next;                                          //下⼀个的类型
};
///
void gotoxy(int x,int y);
void DrawGameframe();
void creat_tetris();
///移动光标
void gotoxy(int x,int y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
///改变打印颜⾊
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);        //更改⽂字颜⾊
return 0;
}
///隐藏光标(调⽤⼀次就⾏了)
void hidden_cursor()//隐藏光标
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut,&cci);
cci.bVisible=0;//赋1为显⽰,赋0为隐藏
SetConsoleCursorInfo(hOut,&cci);
}
///标题
void title(){
color(11);
gotoxy(30,2);
printf("趣味俄罗斯");
c语言贪吃蛇编程代码
color(14);
gotoxy(18,4);
printf("■");
gotoxy(18,5);
printf("■■");
gotoxy(18,6);
printf("■");
color(13);
gotoxy(26,4);
printf("■■");
gotoxy(28,5);
printf("■■");
color(12);
gotoxy(36,4);
printf("■■");
gotoxy(36,5);
printf("■■");
color(11);
gotoxy(44,4);
printf("■");
gotoxy(44,5);
printf("■");
gotoxy(44,6);
printf("■");
gotoxy(44,7);
printf("■");
color(3);
gotoxy(54,4);
printf("■");
gotoxy(50,5);
printf("■■■");
}
void welcome(){                                            //欢迎界⾯
int i,j=1;
color(10);
for(i=15;i<60;i++){
for(j=8;j<18;j++){
gotoxy(i,j);
if(j==8||j==17)printf("=");
else if(i==15||i==59)printf("||");}}
gotoxy(26,11);
color(11);
printf("1. 开始游戏");
gotoxy(26,15);
printf("3. 最⾼记录");
gotoxy(41,11);
printf("2. 游戏说明");
gotoxy(41,15);
printf("4. 退出游戏");
gotoxy(30,19);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。