资源描述
C语言程序设计 课程设计
题 目: 俄罗斯方块
系 别: 数计系
专业(含班级): 09计应
学 号: 20090821103
姓 名: 江和椿
指导教师: 王红雨 职称 讲师
填表日期: 2010 年 01 月 22 日
一、 选题的依据及意义:
依据自定义函数的利用,结合循环结构、数组、结构体还有点指针与文件只是进行编译。通过对学生选课管理系统的操作来进一步掌握和利用C语言进行设计的能力;不仅可以练习而且积累经验逐渐培养编程能力。
二、 本课程设计内容
俄罗斯方块
提示:
(1)可能要用的函数:
①int kbhit( )函数用于判断是否有按键,若有返回非零值,否则返回零。在conio.h中定义。
②int bioskey(int cmd);返回按键扫描码和ASCII码,VC++6.0中不能用。在bios.h中定义。
③TC下"conio.h"头文件中定义的用于清屏的函数是clrscr();
④VC下"stdlib.h"头文件中定义的用于清屏的函数是system("CLS");
⑤int random(int num):返回一个0到(num-1)之间的随机整数。在stdlib.h中定义。
⑥void randomize( ):生成随机种子。在stdlib.h中定义。
(2)俄罗斯方块包括如下图形,其中“*”可以用其它字符表示。
* * *
* * * ** ** **
** *** ** ** * *
(3)当前状态可用字符数组存储,启动时从指定文件中读取,按Esc退出并保存在指定文件中。如下图可以用7*7字符数组存储,定义如下:
* ***
* * *
******
char s[7][7]={
"0000000",
"0000000",
"0000000",
"0000000",
"1000222",
"1001002",
"1111110"}
(4)其中可以用“2”表示移动的俄罗斯方块,“1”表示静止的俄罗斯方块,“0”或空格表示空白。
(5)移动或旋转俄罗斯方块所用按键可自己定义。
C语言课程设计 实现方案
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "windows.h"
#include "time.h"
#define random(x) (rand()%x)
#define N 13
#define M 10
#define K 5
int s[N][M]={{0,0,0,2,2,2},{0,0,0,0,2},{0},{0},{0},{0},{0},{0},{0},{0},
{1},{1,0,0,1},{1,1,1,1,1,1,0,1,1,1}};/*当前状态*/
int a[K][3][3]={{0,2,0,2,2,2},{2,0,0,2,2,2},{2,0,0,2,0,0,2,2},{2,2,2,0,0,2},
{{2},{2},{2}}};
void Disp()
{
int i,j;
for(i=0;i<N;i++)
{for(j=0;j<M;j++)printf("%c",s[i][j]?48+s[i][j]:' ');
printf("\n");}
printf("\n\n操作说明:按4左移,按6右移,按2下移\n");
}
void Down()
{
int i,j,k;
for(j=0;j<M;j++)if(s[N-1][j]==2)break;/*判断是否在下边界*/
if(j<M)/*若方块在下边界则将方块由2变1*/
{for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;
for(i=N-1;i>=0;i--)
{for(j=0;j<M;j++)if(s[i][j]==0)break;//判断第i行是否有空格
if(j==M)/*若第i行没空格消去第i行*/
for(k=i++-1;k>=0;k--)for(j=0;j<M;j++)s[k+1][j]=s[k][j];
}
return;}
for(i=0;i<N-1;i++)
{for(j=0;j<M;j++)
if(s[i][j]==2)if(s[i+1][j]!=0&&s[i+1][j]!=2)break;/*方块下方不空退出内循环*/
if(j<M)break;/*方块下方不空退出外循环*/
}
if(i<N-1||j<M)//若已触到则将方块由2变1*/
{for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;
for(i=0;i<N;i++)for(j=0;j<M;j++)if(s[i][j]==2)s[i][j]=1;
for(i=N-1;i>=0;i--)
{for(j=0;j<M;j++)if(s[i][j]==0)break;//判断第i行是否有空格
if(j==M)/*若第i行没空格消去第i行*/
for(k=i++-1;k>=0;k--)for(j=0;j<M;j++)s[k+1][j]=s[k][j];
}
return;}
for(i=N-1;i>=0;i--)
for(j=0;j<M;j++)
if(s[i][j]==2)s[i+1][j]=s[i][j],s[i][j]=0;/*方块下移*/
}
void Right()
{
int i,j;
for(i=0;i<N;i++)if(s[i][M-1]==2)return;/* 已经在右边界退出 */
for(i=0;i<N;i++)
for(j=0;j<M-1;j++)
if(s[i][j]==2)if(s[i][j+1]!=0&&s[i][j+1]!=2)return;/* 方块右方不空退出 */
for(j=M-2;j>=0;j--)
for(i=0;i<N;i++)
if(s[i][j]==2)s[i][j+1]=s[i][j],s[i][j]=0;/* 方块右移 */
}
void Left()
{
int i,j;
for(i=0;i<N;i++)if(s[i][0]==2)return;/* 已经在左边界退出 */
for(i=0;i<N;i++)
for(j=1;j<M;j++)
if(s[i][j]==2)if(s[i][j-1]!=0&&s[i][j-1]!=2)return;/* 方块左方不空退出 */
for(j=1;j<M;j++)
for(i=0;i<N;i++)
if(s[i][j]==2)s[i][j-1]=s[i][j],s[i][j]=0;/* 方块左移 */
}
int Have()/*判断是否有可移动方块,没有返回1,否则返回0*/
{
int i,j;
for(i=0;i<N;i++)for(j=1;j<M;j++)if(s[i][j]==2)return 0;
return 1;
}
void Add()/*随机生成方块*/
{
int t=random(K),x=random(M-3);/*生成两随机数t和x分别作为第t种方块和第x位置出现*/
int i,j; if(x<0)x=-x%(M-3);
for(i=0;i<3;i++)for(j=x;j<x+3;j++)s[i][j]=a[t][i][j-x];return;
}
void main()
{
char c='A';
while(1)/*判断是否有按键,没有循环输出i,否则停,conio.h*/
{
if(!kbhit())c='2';else c=getch();
if(c=='p')getch();
system("CLS");/*清屏,TC用clrscr();,VC用system("CLS");*/
switch(c)
{
case '4':Left();break; /*左移*/
case '6':Right();break; /*右移*/
case '9':case 27: return; /*按9或Esc(=27)另存后退出*/
case '2':; /*下移*/
default:Down();
}
c='2';if(Have())Add();Disp();Sleep(600);/*睡眠600ms,windows.h*/
}
}
5
C语言 课程设计小结
学习C语言的起步就是学习它的方法规则,如果把它学习得好在学习后面的时候就比较容易理。比如变量,首先要了解变量的定义方式(格式),其意义是什么(定义变量有什么用);其次就是要我要怎么去运用它(我要用什么型式去应用它)。在C语言的命令行中所有的语句都是有它自己的一定格式和形式出现在我们面前,所以在学习某种语句或命令时你首先要了解的就是它的规则是什么、有什么用、怎么实现等。这些都是语法基础,如果把它们都了解很好了,那么编起程序来就很得心应手。比如说if语句和switch语句,这两种条件语句都是用来执行判断功能的,那什么时侯用if什么时侯用switch,如果很好地了解它们的结构和作用的话那么就能灵活运用:若它的条件分支是多个而且条件的值是一个确定的值时就可以选用switch。反之,在大多数情况下就用if。
掌握了语言法规则,不一定就能编出程序来,其实学习编程就是要学习一种思想,一种思维方法,首先要确定一种算法,如从1加到100,判断润年等,我认为这些算法都是一种思维方法。画流程图就是在构建编写程序思路的过程,当画好一个流程图时编程思想也就出来了,程序也差不多了,再结合掌握的语言的方法规则,在计算机里实现就可以了。任何程序只要有思维,有想法,那么实现程序时就不会觉得无从下手。而要学习这种思维方法就是多做题,多读程序,学习别人好的思维方法,多想想一个程序还可不可以有另外一种方法来实现它。这样久而久之,自然会形成一种自己的思维方法。因此我认为不管学什么语言都是这样。
另外,良好的编程习惯也是学好C语言的重要因素。例如编写程序时用缩进的方式、写注释、程序写到一定的阶段时要做一下测试等。这些工作可以帮我们在调试程序时有很大的帮助。程序代码实现后,错误是难免的,所以也要锻炼自己的调试查错能力,而良好的编程习惯可以使我们在调试时减小工作量和提高调试效率,也有助于形成自己的编程风格
2
展开阅读全文