资源描述
成 绩 评 定 表
学生姓名
郭雨佳
班级学号
1409060103
专 业
光电信息科学与工程
课程设计题目
五子棋小游戏
评
语
组长签字:
成绩
日期
20 年 月 日
课程设计任务书
学 院
理学院
专 业
光电信息科学与工程
学生姓名
郭雨佳
班级学号
1409060103
课程设计题目
五子棋小游戏
实践教学要求与任务:
要求:
1、进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解。
2、针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
3、掌握C语言的编程技巧和上机调试程序的方法。
4、掌握程序设计中的常用算法。
任务:
1、联系已学过的内容,巩固所学的理论,增强独立工作能力。
2、通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。
3、通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。
工作计划与进度安排:
第一周:查阅资料 、算法设计
第二周: 第一、二天:算法设计 第三、四天:程序实现
第五天:答辩
指导教师:
201 年 月 日
专业负责人:
201 年 月 日
学院教学副院长:
201 年 月 日
摘要
C语言是国际上广泛流行的计算机高级语言,它适合作为系统描述语言,即可以用来编写系统软件,也可以编写应用软件。在早期的操作系统软件主要是汇编语言编写的,但汇编语言依赖于计算机硬件程序的可读性和可移植性级语言,而C语言兼具一般语言优点还能克服其他语言的缺点。
五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。二人对弈五子棋程序由图像生成、光标移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现二人五子棋对弈。同时也对其他系统游戏的开发设计有一定的借鉴作用。
关键词:C语言;数组;结构体;全局变量;按键处理
目录
1引言 1
1.1五子棋介绍 1
1.2程序需求分析 1
1.3编程方案 2
2五子棋游戏的设计与实现 2
2.1模块图 2
2.2流程图 3
3对应程序: 4
4运行结果截屏: 11
5总结 14
6参考文献 14
19
1引言
1.1五子棋介绍
五子棋是起源于中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修生养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源远流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。他是东西文化的交流点,是古今哲理的结晶。
1.2程序需求分析
根据功能需求将程序分为图形显示、玩家控制、胜负判断三个模块,以下分析各模块的需求。
图形显示模块:游戏开始后要求棋盘生成为15*15,游戏运行中要求显示已落棋子情况。
玩家控制模块:游戏过程中玩家需移动光标选择落子。
胜负判断模块:一旦某一颜色棋子出现物资连续,终止游戏,弹出改色游戏玩家胜出。
1.3编程方案
棋子的移动与落子在键盘上按键控制,本程序选取按键为↑、→、↓、←和空挡键。分别代表上移、左移、下移、右移和落子。在光标移动过程中,光标按照玩家按键移动;在玩家按下落子键后,程序自动调用棋子显示子程序和判断胜负子程序。
2五子棋游戏的设计与实现
五子棋游戏
2.1模块图
胜负判断
图形显示
玩家控制
是否有五子
黑白棋落子
棋盘的拼成
2.2流程图
开始
画15*15界面
开始游戏
白子落子
白子落子<5?
N
白子获胜?
输出白方获胜!
Y Y
黑子落子
N
黑子落子
黑子获胜?
输出黑方获胜!
Y
N
白子落子
输出平局!
棋盘铺满?
Y
N
结束
3对应程序:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAXIMUS 15
int p[MAXIMUS][MAXIMUS];
char buff[MAXIMUS*2+1][MAXIMUS*4+3];
int Cx,Cy;
int Now;
int wl,wp;
char* showText;
int count;
char* Copy(char* strDest,const char* strSrc)
{
char* strDestCopy = strDest;
while (*strSrc!='\0')
{
*strDest++=*strSrc++;
}
return strDestCopy;
}
void Initialize()
{
int i,j;
showText="";
count=0;
for(i=0;i<MAXIMUS;i++)
{
for(j=0;j<MAXIMUS;j++)
{
p[i][j]=0;
}
}
Cx=Cy=MAXIMUS/2;
Now=1;
}
char* getStyle(int i,int j)
{
if(p[i][j]==1)
return "●";
else if(p[i][j]==2)
return "○";
else if(i==0&&j==0)
return "┏";
else if(i==MAXIMUS-1&&j==0)
return "┓";
else if(i==MAXIMUS-1&&j==MAXIMUS-1)
return "┛";
else if(i==0&&j==MAXIMUS-1)
return "┗";
else if(i==0)
return "┠";
else if(i==MAXIMUS-1)
return "┨";
else if(j==0)
return "┯";
else if(j==MAXIMUS-1)
return "┷";
return "┼";
}
char* getCurse(int i,int j){
if(i==Cx){
if(j==Cy)
return "┏";
else if (j==Cy+1)
return "┗";
}
else if(i==Cx+1)
{
if(j==Cy)
return "┓";
else if (j==Cy+1)
return "┛";
}
return " ";
}
void write(char* c)
{
Copy(buff[wl]+wp,c);
wp+=strlen(c);
}
void ln()
{
wl+=1;
wp=0;
}
void Display()
{
int i,l=strlen(showText);
int Offset=MAXIMUS*2+2-l/2;
if(Offset%2==1)
{
Offset--;
}
Copy(buff[MAXIMUS]+Offset,showText);
if(l%2==1)
{
*(buff[MAXIMUS]+Offset+l)=0x20;
}
system("cls");
for(i=0;i<MAXIMUS*2+1;i++){
printf("%s",buff[i]);
if(i<MAXIMUS*2)
printf("\n");
}
}
void Print()
{
int i,j;
wl=0;
wp=0;
for(j=0;j<=MAXIMUS;j++)
{
for(i=0;i<=MAXIMUS;i++)
{
write(getCurse(i,j));
if(j==0||j==MAXIMUS)
{
if(i!=MAXIMUS)
write(" ");
}
else
{
if(i==0||i==MAXIMUS-1)
write("┃");
else if(i!=MAXIMUS)
write("│");
}
}
if(j==MAXIMUS)
{
break;
}
ln();
write(" ");
for(i=0;i<MAXIMUS;i++)
{
write(getStyle(i,j));
if(i!=MAXIMUS-1)
{
if(j==0||j==MAXIMUS-1)
{
write("━");
}
else
{
write("—");
}
}
}
ln();
}
Display();
}
int Put(){
if(p[Cx][Cy]==0)
{
p[Cx][Cy]=Now;
return 1;
}
else
{
return 0;
}
}
int Check(){
intw=1,x=1,y=1,z=1,i; for(i=1;i<5;i++)if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==Now)w++;else break;
for(i=1;i<5;i++)if(Cy-i>0&&p[Cx][Cy-i]==Now)w++;else break;
if(w>=5)return Now;
for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==Now)x++;else break;
for(i=1;i<5;i++)if(Cx-i>0&&p[Cx-i][Cy]==Now)x++;else break;
if(x>=5)return Now;
for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy+i<MAXIMUS&&p[Cx+i][Cy+i]==Now)y++;else break;
for(i=1;i<5;i++)if(Cx-i>0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;
if(y>=5)return Now;
for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy-i>0&&p[Cx+i][Cy-i]==Now)z++;else break;
for(i=1;i<5;i++)if(Cx-i>0&&Cy+i<MAXIMUS&&p[Cx-i][Cy+i]==Now)z++;else break;
if(z>=5)return Now;
return 0;
}
int RunGame(){
int input;
int victor;
Initialize();
while(1){
Print();
input=getch();
if(input==27)
{
exit(0);
}
else if(input==0x20)
{
if(Put())
{
victor=Check();
Now=3-Now;
count++;
if(victor==1)
{
showText="白方获得了胜利!";
Print();
if(getch()==0xE0)
{
getch();
}
return Now;
}
else if(victor==2)
{
showText="黑方获得了胜利!";
Display();
if(getch()==0xE0)
{
getch();
}
return Now;
}else if(count==MAXIMUS*MAXIMUS)
{
showText="平局!";
Display();
if(getch()==0xE0)
{
getch();
}
return 0;
}
}
}
else if(input==0xE0)
{
input=getch();
switch(input)
{
case 0x4B://
Cx--;
break;
case 0x48:
Cy--;
break;
case 0x4D:
Cx++;
break;
case 0x50:
Cy++;
break;
}
if(Cx<0)Cx=MAXIMUS-1;
if(Cy<0)Cy=MAXIMUS-1;
if(Cx>MAXIMUS-1)Cx=0;
if(Cy>MAXIMUS-1)Cy=0;
}
}
}
int main()
{
system("title 简易五子棋 ——1409060103 郭雨佳");
system("mode con cols=63 lines=32");
system("color A2f");
while(1){
RunGame();
}
}
4运行结果截屏:
5总结
C语言课程设计和现代计算机技术的实际应用相结合,是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的图形界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。使我们巩固了原有的理论知识,培养了我们灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。使我们体会到自身知识和能力能在实际中的应用和发挥。不但可以激发创新意识,还可以开发创造能力、培养沟通能力。这次实习时间虽然仅有一个星期,但确实使我受益非浅。给我们提供了一个既动手又动脑,独立实践的机会。通过实习我丰富了计算机操作经验,更加深了对C语言的了解,熟悉了其环境。
本次课程设计,使我对五子棋设计的基本过程的设计方法、步骤、思路,有一定的了解与认识。在课程设计过程中,我基本能按照规定的程序进行,先对五子棋的设计收集,调查有关资料,期间进行方案的几次修改,最后确定方案。设计方案确定后,再用c语言实现了可视化的五子棋算法。整个过程周密有序,对我按照高质量完成课程设计十分有利。
程序设计达到了预期的目的。程序设计完成后我觉得不仅动手能力有所提高,更重要的是激发了我对课程的兴趣,并能够运用其解决一些实际问题。
6参考文献
1谭浩强. C程序设计(第四版).清华大学出版社.2010年6月
2谭浩强.C程序设计(第四版)学习辅导.清华大学出版社.2010年七月
3百度文库
展开阅读全文