辽宁工业大学C语言程序设计课程设计(论文)题目:黑白棋游戏设计院(系):软件学院专业班级:学号:学生姓名:指导教师:**教师职称:讲师起止时间: 2008.12.29至2009.1.9课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1程序功能介绍 (2)2.2程序整体设计说明 (2)2.2.1设计思路 (2)2.2.2数据结构设计及用法说明 (2)2.2.3程序结构(流程图) (3)2.2.4各模块的功能及程序说明 (3)2.2.5程序结果 (6)2.3程序源代码及注释 (6)第3章课程设计总结 (18)参考资料 (21)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识熟悉C语言及C语言开发工具。
1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍黑白棋游戏是一个深受人们喜爱的游戏,通常是人机对弈,本课题设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。
按键盘上的方向键可以上下左右移动棋子,按回车键可以摆放棋子。
2.2程序整体设计说明2.2.1设计思路程序界面是一个二维平面图,所以数据的表示用二维数组,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格中的状态,共有三种情况,分别是空格、黑棋和白棋。
这样给数组元素的取值设定为0、1、2,其中0代表空格,1代表白色棋子,2代表黑色棋子。
这样程序的主要工作是接收棋手按键操作,一旦接收到回车键,说明棋手摆子,先判断是不是有效位置,也就是能不能包围住对方棋子,如果能,便为棋子所在的位置往上下、左右、左上、左下、右上、右下8个方向寻找被包围住的所有棋子(必须是连续的,中间不能有空格),将这些被包围住的对方棋子都变成自己的棋子,然后对当前棋盘中的黑白棋个数进行统计并输出结果。
如果没有这样的位置可以落子,则停步,让对方走棋,重复上述步骤,直到游戏结束。
如果想提前终止游戏,可以按Esc键。
2.2.2数据结构设计及用法说明int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/void playtoplay(void);/*人人对战函数*/void DrawQp(void);/*画棋盘函数*/void SetPlayColor(int x);/*设置棋子第一次的颜色*/void MoveColor(int x,int y);/*恢复原来棋盘状态*/int QpChange(int x,int y,int z);/*判断棋盘的变化*/void DoScore(void);/*处理分数*/void PrintScore(int n);/*输出成绩*/void playWin(void);/*输出胜利者信息*/2.2.3程序结构(流程图)黑白棋游戏流程图如下:2.2.4各模块的功能及程序说明(1)main()主函数首先初始化图形模式,然后通过调用函数先画出棋盘,再开始游戏,一旦游戏结束则关闭图形模式,程序结束。
(2)DrawQp()画棋盘函数先设置背景色,然后通过循环利用水平和垂直直线画出棋盘,再利用填充圆画出初始棋子。
(3)SetPlayColor()设置棋子的颜色目的是为判断棋手和棋盘的变化,根据函数参数的值来设计填充棋子的当前颜色,值为1代表白棋,值为2代表黑棋。
(4)MoveColor()恢复原来棋子的状态棋手要通过移动光标键走到落子的位置,在经过的路程上显示当前棋子,则会覆盖原来的棋盘状态,所以一旦棋子走过后,就应恢复原来的状态。
(5)playbplay()人人对战函数这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:1)按Esc键程序可以随时结束。
2)按上下左右光标键,则改变棋子移动的坐标值。
3)按回车键后判断:①如落子的位置已经有棋则无效,继续压键。
②如落子位置是空格,可以将棋子落入格内,调用函数QpChange()判断是否引起棋盘的变化,函数值为1有变化,为0没变化。
如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋,可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。
③如果棋子变化后,格子已占满64格或一方棋子为0,则游戏结束,显示胜利方信息。
按任意键程序结束。
④重复上述步骤,直到游戏结束。
(6)QpChange()判断棋盘变化当棋手按回车键落子后,就要分别往8个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。
表示黑白棋的图形用屏幕上的像素坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x和y计算出对应数组元素a的下标i和j。
i代表行,j代表列,对于8×8的棋盘,它们的值为0-7,如果j<6,往右边判断,从当前位置开始,用循环语句判断右边是否有一个或连续多个对方的棋子,遇到自己的棋子或空格则结束循环,如果循环结束不是遇到空白,且列坐标小于8,则说明这些位置的棋子是被自己包围的对方棋子,将它们吃掉.也就是改变为自己的棋子,如果有棋子发生了变化,给棋盘变化标志值yes赋值为1,同样的方法向左、上、下等8个方向进行判断,并作相应的变化。
如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标志值yes为0,返回yes,结束本函数。
(7)DoScore ()处理分数根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为1,白棋棋子数累加;如果数组元素值为2,则黑棋棋子数累加。
(8)PrintScore()输出成绩利用设置实体填充模式填充矩形条消除掉前次的成绩,再利用索赔sprintf()函数将整数转换为字符串的形式,再利用outtextxy0函数将成绩输出。
(9)playWin()输出胜利者结果根据分数值score1和score2的大小得出下棋的结果,输出赢者信息。
2.2.5程序结果2.3程序源代码及注释#include "graphics.h" /*图形系统头文件*/#define LEFT 0x4b00 /*光标左键值*/#define RIGHT 0x4d00 /*光标右键值*/#define DOWN 0x5000 /*光标下键值*/#define UP 0x4800 /*光标上键值*/#define ESC 0x011b /* ESC键值*/#define ENTER 0x1c0d /* 回车键值*/int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/void playtoplay(void);/*人人对战函数*/void DrawQp(void);/*画棋盘函数*/void SetPlayColor(int x);/*设置棋子第一次的颜色*/void MoveColor(int x,int y);/*恢复原来棋盘状态*/int QpChange(int x,int y,int z);/*判断棋盘的变化*/void DoScore(void);/*处理分数*/void PrintScore(int n);/*输出成绩*/void playWin(void);/*输出胜利者信息*//******主函数*********/#include<io.h>#include<stdio.h>#include<dos.h>#include<string.h>#include<math.h>#include<bios.h>#include<mem.h>#include<fcntl.h>#include<stdlib.h>#include<conio.h>#include <graphics.h>#define HH '0'#define N 6int Q=0;char key;int fine=1;int A=0,B=0;char s[N][N],m[N][N];void *ball;int maxx;unsigned int size;loading(){ int z=1;while(z){ if(z>77)break;printf("<");delay(5000);z++;}delay(2000);cleardevice();}unsigned char Get_Ascii_Key(void) {if(bioskey(1))return(bioskey(0));else return(0);}int Test_Ascii_Key(int ascii){if(Get_Ascii_Key()==ascii)return(1);elsereturn(0);}void tu(){maxx=getmaxx();size=imagesize(210,390,450,420);ball=malloc(size);setfillstyle(1,10);bar(160,170,473,253);setfillstyle(1,9);bar(163,173,470,250);setcolor(13);outtextxy(200,200,"Welcome to BLACK & WHITE chess"); setcolor(14);outtextxy(250,220,"Developer :Wu siyuan ");outtextxy(290,240,"2002.8");outtextxy(210,390,"Press any key to contunue...");getimage(210,390,450,420,ball);while(!kbhit()){putimage(210,390,ball,XOR_PUT);delay(30000);}cleardevice();}void sou(void){}void print(){ int i=0,j=30;setcolor(11);outtextxy(35,20," 0 1 2 3 4 5");outtextxy(14,50,"0");outtextxy(14,100,"1");outtextxy(14,150,"2");outtextxy(14,200,"3");outtextxy(14,250,"4");outtextxy(14,300,"5");setbkcolor(0);setlinestyle(SOLID_LINE,0,2);for(i=0;i<7;i++){ setcolor(GREEN);line (j,30,j,330);j+=50;}j=30;for(i=0;i<7;i++){ setcolor(GREEN);line(30,j,330,j);j+=50;}for(i=0;i<6;i++)for(j=0;j<6;j++){ if(s[i][j]=='o'){setcolor(WHITE);circle(55+j*50,55+i*50,15);}else if(s[i][j]=='x'){ setcolor(RED);circle(55+j*50,55+i*50,15); }}}int cal(char z){ int *p=0;int num=0,i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)if(s[i][j]==z)num++;p=#return(*p);}void save(){int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)m[i][j]=s[i][j];}void load(){ int i,j;for(i=0;i<N;i++)for(j=0;j<N;j++)s[i][j]=m[i][j];}snew(int x,int y,char z1,char z2){int i,j,a;int can[]={0,0,0,0,0,0,0,0,0},k[N*N]; if(s[x][y-1]==z1&&(y-1)>=0){i=0;while(i<y){if(s[x][i]==z2){ can[1]=1;break; }i++;}}if(s[x][y+1]==z1){i=y+2;while(i<N){if(s[x][i]==z2){ can[2]=1;break;}i++;}}if(s[x-1][y]==z1&&(x-1)>=0){i=0;while(i<x){if(s[i][y]==z2){can[3]=1;break;}i++;}}if(s[x+1][y]==z1){i=x+2;while(i<N){if(s[i][y]==z2){can[4]=1;break;}i++;}}if(s[x-1][y+1]==z1&&(x-1)>=0){i=2;while(y+i<N&&(x-i>=0)){if(s[x-i][y+i]==z2){can[5]=1;break;}i++;}}if(s[x+1][y-1]==z1&&(y-1)>=0){i=2;while(i<N&&(y-i>=0)){if(s[x+i][y-i]==z2){can[6]=1;break;}i++;}}if(s[x-1][y-1]==z1&&(x-1)*(y-1)>=0){i=2;while(x-i>=0&&y-i>=0){if(s[x-i][y-i]==z2){can[7]=1;break;}i++;}}if(s[x+1][y+1]==z1){i=2;while(i+x<N){if(s[x+i][y+i]==z2){can[8]=1;break;}i++;}}for(i=1,j=0;i<=8;i++)if(can[i]==0)j++;if(j==8&&Q==1) {printf("error!");exit(1); }else if(j!=8)s[x][y]=z2;if(can[1]==1){ i=1;while(s[x][y-i]==z1){s[x][y-i]=z2;i++;}can[1]=0;}if(can[2]==1){i=1;while(s[x][y+i]==z1){s[x][y+i]=z2;i++;}can[2]=0;}if(can[3]==1){i=1;while(s[x-i][y]==z1){ s[x-i][y]=z2;i++;}can[3]=0;}if(can[4]==1){i=1;while(s[x+i][y]==z1){s[x+i][y]=z2;i++;}can[4]=0;}if(can[5]==1)while(s[x-i][y+i]==z1){s[x-i][y+i]=z2;i++;}can[5]=0;}if(can[6]==1){i=1;while(s[x+i][y-i]==z1){s[x+i][y-i]=z2;i++;}can[6]=0;}if(can[7]==1){i=1;while(s[x-i][y-i]==z1){s[x-i][y-i]=z2;i++;}can[7]=0;}if(can[8]==1){i=1;while(s[x+i][y+i]==z1){s[x+i][y+i]=z2;i++;}can[8]=0;}} /* snew */void one(){ int a,b;char g='o';load();setcolor(15);printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\n To exit the Game press the 'q' key.\n");printf("Please input x (0 to 5):");while(1){a=Get_Ascii_Key();if(a==113||a==81){printf("\nQuit?(y or n)");while(1){if(Test_Ascii_Key(89)||Test_Ascii_Key(121))exit(0);else if(Test_Ascii_Key(110)||Test_Ascii_Key(78)){printf("\n\tWelcome to return the Game !\n");break; }}}if(a>=48&&a<=53){printf("\tGood! x has get!\n");break;}}a=a-48;printf("Please input y (0 to 5):");while(1){b=Get_Ascii_Key();if(b==113||b==81){printf("\nQuit?(y or Y)");while(1){if(Test_Ascii_Key(89)||Test_Ascii_Key(121))exit(0);else if(Test_Ascii_Key(110)||Test_Ascii_Key(78))break;}}if(b>=48&&a<=53){printf("\tGood! y has get!");break;}}b=b-48;Q=1;snew(a,b,'x','o');Q=0;save();A=cal(g);B=cal('x');/* printf("\t\t\t\t\t\t\rA=%d,B=%d",A,B);*/}/* one */void search(){int i,j,r=0;for(i=0;i<N;i++)for(j=0;j<N;j++)if(s[i][j]==HH)r++;if(r==0)fine=0;}void two(){ char h='x';int row[N*N],col[N*N];int a=1,ii,j,t,t1,k[N*N];load();for(ii=0;ii<N;ii++)for(j=0;j<N;j++)if(s[ii][j]==HH){row[a]=ii;col[a]=j;a++;}/* space right */for(ii=1;ii<a;ii++){load(); /*two*/snew(row[ii],col[ii],'o','x');k[ii]=cal(h);}t=k[1];ii--;t1=ii;while(ii){if(t<=k[ii]){t=k[ii];t1=ii;}ii--;}a=t1;A=cal('o');B=t;load();snew(row[a],col[a],'o','x');save();cleardevice();printf("\n\n\t\t\t\t\t Computer located :%d,%d",row[a],col[a]); }main(){ int i,j;int gd=DETECT,gm;clrscr();initgraph(&gd,&gm,"d:\\tc\\bgi");setbkcolor(BLACK);tu();sou();setbkcolor(0);for(i=0;i<N;i++)for(j=0;j<N;j++)s[i][j]='0';s[2][2]=s[3][3]='x';s[2][3]=s[3][2]='o';save();loading();cleardevice();while(fine){print();one();two();search();if(key==113||key==81){printf("\nQuit?(y or Y)");while(!Test_Ascii_Key(89)&&!Test_Ascii_Key(121)); break;}}if(A>B)outtextxy(400,200, " You win!");else if(A<B)outtextxy(400,200," I win!");else outtextxy(400,200," It's a draw!");printf("\n You:%d I:%d",A,B);getch();}第3章课程设计总结回想这次C程序课程设计,至今我仍有许多感慨,自从知道题目到完成整个编程,从理论到实践,在这些日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。