欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    五子棋对战游戏课程设计C语言.doc

    • 资源ID:67651076       资源大小:575KB        全文页数:40页
    • 资源格式: DOC        下载积分:9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    五子棋对战游戏课程设计C语言.doc

    .XX远东理工学院C语言课程设计论文题目:五子棋对战游戏姓名:分院:机器人科学与技术学院专业:电子信息工程学号: 指导教师:二0一四年九月五日五子棋(C语言)摘要五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。早在“尧造围棋”之前,可能民间就已有五子棋游戏。发展于日本,流行于欧美。五子连珠棋五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征 “ 短、平、快 ” ,又有古典哲学的高深学问 “ 阴阳易理 ” ;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有 “ 场 ” 的概念,亦有 “ 点 ” 的连接。它是中西文化的交流点,是古今哲理的结晶。AbstractsGobang is a kind of right as two pure strategy type chess game, is originated from the ancient Chinese traditional black white kind of one. Long before "YaoZao go", may be the folk has gobang game. Development in Japan, popular in Europe and the United States. A row chess gobang easier, for young and old, and fun, fascinating; Can not only enhance thinking ability, improve intelligence, and high in philosophy, helps to cultivate one's morality raises a gender.Gobang can not only enhance thinking ability, improve intelligence, and high in philosophy, helps to cultivate one's morality raises a gender. Gobang has obvious characteristics of modern leisure "short, flat, fast", and has a profound knowledge of classical philosophy "Yin and Yang yi" It has the characteristics of easy to learn, are very popular among the people, and profound skills and a high level of international petition; It's chess culture source YuanLiu long, have the mysterious Oriental and western intuitive; Both the concept of "field", also has a "dot" connection. It is the point of munication between Chinese and western culture, it is the crystallization of ancient and modern philosophy.目录1. 前言12. 功能描述23. 总体设计33.1 功能模块设计33.1.1 游戏执行主流程33.1.2 游戏棋子控制53.1.3 游戏帮助53.2 函数功能描述64. 程序实现84.1.程序预处理84.1.1 主函数main()114.1.2 改变玩家124.1.3 胜负及帮助显示134.1.4 切换背景154.2 运行结果164.2.1 游戏初始状态164.2.2 游戏进行状态175. 结论186. 程序附录19致谢32参考文献3335 / 401. 前言五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。早在“尧造围棋”之前,可能民间就已有五子棋游戏。发展于日本,流行于欧美。五子连珠棋五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。C语言则是目前国际上比较流行的计算机高级编程语言之一,因其简洁、使用方便且具备强大的功能而受到编程人员的普遍青睐。它既适合作为系统描述语言,也可以用来编写系统软件,还可以来编写应用软件。 用C语言来编写俄罗斯方块这个游戏有较大优势:C语言具有各种各样的数据类型,并引入了指针概念,使得程序效率更高;C语言还包含很广泛的运算符;另外C语言具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断能力也比较强大。 选择此论文题是旨在训练基本编程能力和游戏开发技巧,熟悉C语言图形模式下的编程。本程序中涉及结构体、数组、时钟中断及绘图等方面的知识。通过本程序的训练,能对C语言有一个更深刻的了解,掌握五子棋游戏开发的基本原理,为将来开发出高质量的游戏软件打下坚实的基础。2. 功能描述如图2.1所示,本游戏主要实现一下几种功能:五子棋游戏初始化模块下棋操作模块判断胜负模块帮助模块图2.1 五子棋游戏功能描述图(1) 初始化模块。进入程序后按提示操作游戏。(2) 下棋操作模块。按1进入游戏 UP DOWN LIGHT RIGHT 为方向操作键,空格为落子键(3) 判断胜负模块。玩家游戏过程中,一方达到获胜条件后系统自动判定胜负,并进入主界面,重新开始下轮游戏。(4) 帮助模块,帮助玩家了解游戏操作等功能。3. 总体设计3.1 功能模块设计3.1.1 游戏执行主流程 本五子棋游戏执行主流程图3.1所示。在判断键值时,有判断五子是否练成一线,玩家是否获胜的判断:图3.1 游戏执行主流程图3.1.2 游戏棋子控制(1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;(2)画出棋盘的大小; (3)画棋子并确定棋子的大小; (4)判断键盘输入哪个键执行操作; (5)玩家 P1 先落棋; (6)玩家轮流下棋; (7)判断赢家。这是此游戏开发的重点和难点部分。下面分别较少左移、右移、下移、上移及胜负判断的实现。棋盘设计为18×18格,初始状态光标在棋盘的中央,玩家1先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋)。当游戏一方胜利后显示胜利信息。从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。这样程序的主要工作是接收棋手按键操作,棋手用Up、Down、Left、Right控制光标移动,空格键表示落子。一旦接收到空格键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。落子成功后,马上判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。如果想退出游戏,可以按Esc键3.1.3 游戏帮助实现比较简单,使用outtextxy()函数实现。3.2 函数功能描述1定义全局变量1. int statusNN; /*定义的数组,表示棋盘某点的状态(棋手1或棋手2)*/2. int step_x,step_y; /*行走的坐标,即每一步光标移动的距离*/3. int key ; /*获取按下的键盘的键*/4. int flag; /*玩家标志,当flag=0时,表示该点无棋子,flag=1表示玩家1的棋子,flag=2表示玩家2的棋子*/2Main()主函数按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组int status1919,初值为0,表示空格。函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。3DrawBoard()画棋盘函数背景颜色设为蓝色,从坐标(100,100)开始每隔20个单位用黄色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle()可以设置填充模式和填充颜色,circle(x,y,8)以x和y为圆心画圆(这里半径为8),用它表示棋子。4ResultCheck(int x,int y)判断是否胜出函数本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:红方获胜),否则继续落子。5Done()执行下棋函数这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:(1) 按Esc键程序可以随时结束。(2) 按上下左右光标键,则改变棋子移动的坐标值。(3) 按空格键后判断:1) 如落子的位置已经有棋则无效,继续按键。2) 如落子位置是空格,可以将棋子落入格内,调用ResultCheck(int x,int y)函数。3) 如果棋子变化后,棋盘已下满了棋子,则游戏结束。显示平局信息。(4) 重复上述步骤,直到游戏结束。6图形功能函数以下函数原形都在graphics.h中。(1)registerbgidriver():(2)initgraph(int *driver, int *mode, char *path):用于初始化图形系统,并装入相应的图形驱动器。该函数把由driver所指向的图形驱动器代码装入内存。如果图形驱动器未装入内存,图形函数将不能操作。图形函数所用的屏显模式由mode所指向的整数值确定。最后,图形驱动器的路径是由path所指向的字符串给出。如果没有指定路径,就在当前工作路径上寻找。(3)rectangle(int left,int top,int right,int bottom):函数rectangle()用当前画出由坐标left,top及right,bottom所定义的矩形。(4)setcolor(int color):把当前画线颜色设置为color所指定的颜色。(5)closegraph():该函数使图形状态失效,并且释放用于保存图形驱动器和字体的系统内存。当你的程序既用到图形输出又用到非图形输出时,应该用此函数。该函数还把系统屏显模式返回到调用initgragh()前的状态。4.程序实现4.1.程序预处理 包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。/*加载头文件*/#include <stdio.h>#include <stdlib.h>#include <dos.h>#include <graphics.h> /*图形函数库*/*编译预处理,定义按键码*/#define LEFT 0x4b00 /*向左*/#define RIGHT 0x4d00 /*向右*/#define DOWN 0x5000 /*向下*/#define UP 0x4800 /*向上*/*若想在游戏中途退出, 可按 Esc 键*/#define ESC 0x011b /*退出键*/*SPACE键表示落子*/#define SPACE 0x3920 /*落子键*/*定义常量*/*设置偏移量,即定义每一步光标移动的距离*/#define OFFSET 20#define OFFSET_x 4#define OFFSET_y 3/*定义棋盘数组大小,即棋盘的大小,这里为18x18格*/#define N 19/*移动的方向*/#define LEFT 0x4b00 /*向左*/#define RIGHT 0x4d00 /*向右*/#define DOWN 0x5000 /*向下*/#define UP 0x4800 /*向上*/zi=-1;/竖向for(i=x,j=y;i>=0&&chipij=p;i-)zi+;for(i=x,j=y;i<ChessRow&&chipij=p;i+)zi+;if(zi>=5)return p;zi=-1;/横向for(i=x,j=y;j>=0&&chipij=p;j-)zi+;for(i=x,j=y;j<ChessCol&&chipij=p;j+)zi+;if(zi>=5)return p;zi=-1;/''斜向for(i=x,j=y;i>=0&&j>=0&&chipij=p;i-,j-)zi+;for(i=x,j=y;i<ChessRow&&j<ChessCol&&chipij=p;i+,j+)zi+;if(zi>=5)return p;zi=-1;/'/'斜向for(i=x,j=y;i>=0&&j<ChessCol&&chipij=p;i-,j+)zi+;for(i=x,j=y;i<ChessRow&&j>=0&&chipij=p;i+,j-)zi+;if(zi>=5)return p;return 0;/*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的圆形*/*定义全局变量*/int pingju()int i,j;for(i=0;i<ChessRow;i+)for(j=0;j<ChessCol;j+)if(chipij=0)return 0;return 1;void xianshou()int xian;step=0;if(language=49)printf("ttt按1 方先手nttt按2 方先手n");else printf("tttpress 1 to let on the offensiventttpress 2 to let on the offensiven");while(1)xian=getch();if(xian=49)player=1;break;else if(xian=50)player=0;break;elseif(language=49)printf("ttt输入有误,请重新输入.r");else printf("tttInput error,please try again.r");void KeyPress(int n)/按键动作switch(n)case 72:/光标上移if(site.y<=0)site.y=ChessCol-1;else site.y-;gotoxy(site.x,site.y);break;case 80:/光标下移if(site.y>=ChessCol-1)site.y=0;else site.y+;gotoxy(site.x,site.y);break;case 75:/光标左移if(site.x<=0)site.x=ChessRow-1;else site.x-;gotoxy(site.x,site.y);break;case 77:/光标右移if(site.x>=ChessRow-1)site.x=0;else site.x+;gotoxy(site.x,site.y);break;case 32:/空格落子并判定胜负luozi();winner=check(site.x,site.y);break;4.1.1 主函数main() Main()函数主要是实现了对整个程序的运行控制,以及相关功能模块的调用。void gotoxy(int x,int y)COORD cursor;/cursor为结构体COORD的变量,存储光标坐标cursor.X=2*x;cursor.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cursor);/修改光标位置void DrawChessBoard()/绘制棋盘及光标位置初始化void ChangePlayer()/更换玩家chipsite.xsite.y=player+1;/2为黑子落点,1为白子落点if(player)player=0;/变为白子else player=1;/变为黑子void luozi()/玩家落子if(chipsite.xsite.y=0)step+;CurrentSitestep.x=site.x;CurrentSitestep.y=site.y;if(player)ChangePlayer();printf("");elseChangePlayer();printf("");gotoxy(site.x,site.y);void huiqi()/悔棋if(step=0);4.1.2改变玩家 玩家进行游戏时,需要对游戏界面进行初始化工作。此代码被main()函数调用。主要进行的工作如下:ChangePlayer();chipsite.xsite.y=0;gotoxy(CurrentSitestep.x,CurrentSitestep.y);chipCurrentSitestep.xCurrentSitestep.y=0;if(CurrentSitestep.x=0)if(CurrentSitestep.y=0)printf("");else if(CurrentSitestep.y=ChessCol-1)printf("");else printf("");else if(CurrentSitestep.x=ChessRow-1)if(CurrentSitestep.y=0)printf("");else if(CurrentSitestep.y=ChessCol-1)printf("");else printf("");else if(CurrentSitestep.y=0)printf("");else if(CurrentSitestep.y=ChessCol-1)printf("");else printf("");site.x=CurrentSitestep.x,site.y=CurrentSitestep.y;step-;gotoxy(site.x,site.y);4.1.3胜负及帮助显示帮助提示void help2(int language)/游戏结束帮助if(language=49)printf("你想要再玩一次吗?n");printf("按n键退出游戏.n");printf("按其它任意键继续玩.");elseprintf("Do you want to play again?n");printf("Press n to exit game.n");printf("Press any other key to play again.");void game()help(language);胜负判断while(1)xianshou();DrawChessBoard();press=getch();while(1)KeyPress(press);if(winner!=0)gotoxy(0,ChessCol);if(winner=2)if(language=49)printf("执的一方获胜!n");elseprintf("The side of win!n");elseif(language=49)printf("执的一方获胜!n");elseprintf("The side of win!n");elseif(pingju()gotoxy(0,ChessCol);if(language=49)printf("t平局n");elseprintf("tA draw!n");elsepress=getch();continue;4.1.4切换背景help2(language);press=getch();if(press='n'|press='N')exit(0);elsewinner=0;system("cls");break;int main(void)system("color 9f");/9蓝色背景 f亮白色前景chooselanguage();game();return 0;4.2 运行结果4.2.1 游戏初始状态 当用户刚进入游戏时,如图4.1所示。按1进入游戏。用户可使用键盘左移键、右移键、上移键和下移键,分别进行左移、右移、旋转和下落操作。用户可按ESC键退出游戏。图4.1 游戏初始状态4.2.2 游戏进行状态图4.2为游戏进行状态图4.2 游戏进行状态5.结论本文介绍了五子棋游戏的设计思路及其编程实现。重点介绍各功能模块的设计原理和数据结构的实现。通过本论文程序的编写和开发,进一步的提高了自己的基本编程能力和游戏开发技巧,熟悉了C语言图形模式下的编程。深入的理解了程序中有关结构体、数组、时钟中断及绘图等方面的知识。通过本程序的训练,使我对C语言有了一个更能深刻的了解。本文的程序设计借鉴了参考书籍和互联网上相关程序的设计思想,在此对相关的源代码提供者表示衷心的感谢。由于时间、经验及水平的原因,论文中难免有不足之处。许多问题往往都不是只有一种解决方法,本游戏的开发也是如此,可以对此程序进行优化和功能完善或者使用不同方法来实现某些功能,以达到学以致用的目的。6.程序附录#include<stdio.h>#include<windows.h>#include<conio.h>#define ChessRow 19#define ChessCol 19struct zuobiao/坐标结构体int x;int y;site,CurrentSiteChessRow*ChessCol=(ChessRow-1)/2,(ChessCol-1)/2;int player=1,step=0,language,press,winner=0;int chipChessRowChessCol=0;/棋谱记录void gotoxy(int x,int y)COORD cursor;/cursor为结构体COORD的变量,存储光标坐标cursor.X=2*x;cursor.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cursor);/修改光标位置void DrawChessBoard()/绘制棋盘及光标位置初始化int i,j;system("cls");for(i=0;i<ChessRow;i+)for(j=0;j<ChessCol;j+)chipij=0;if(i=0)if(j=0)printf("");else if(j=ChessCol-1)printf("");else printf("");else if(i=ChessRow-1)if(j=0)printf("");else if(j=ChessCol-1)printf("");else printf("");else if(j=0)printf("");else if(j=ChessCol-1)printf("");else printf("");printf("n");site.x=(ChessRow-1)/2;site.y=(ChessCol-1)/2;/坐标初始化gotoxy(ChessRow-1)/2,(ChessCol-1)/2);void ChangePlayer()/更换玩家chipsite.xsite.y=player+1;/2为黑子落点,1为白子落点if(player)player=0;/变为白子else player=1;/变为黑子void luozi()/玩家落子if(chipsite.xsite.y=0)step+;CurrentSitestep.x=site.x;CurrentSitestep.y=site.y;if(player)ChangePlayer();printf("");elseChangePlayer();printf("");gotoxy(site.x,site.y);void huiqi()/悔棋if(step=0);elseChangePlayer();chipsite.xsite.y=0;gotoxy(CurrentSitestep.x,CurrentSitestep.y);chipCurrentSitestep.xCurrentSitestep.y=0;if(CurrentSitestep.x=0)if(CurrentSitestep.y=0)printf("");else if(CurrentSitestep.y=ChessCol-1)printf("");else printf("");else if(CurrentSitestep.x=ChessRow-1)if(CurrentSitestep.y=0)printf("");else if(CurrentSitestep.y=ChessCol-1)printf("");else printf("");else if(CurrentSitestep.y=0)printf("");else if(CurrentSitestep.y=ChessCol-1)printf("");else printf("");site.x=CurrentSitestep.x,site.y=CurrentSitestep.y;step-;gotoxy(site.x,site.y);int check(int x,int y)/判断是否有五连子int i,j,zi=-1,p=player=0?2:1;zi=-1;/竖向for(i=x,j=y;i>=0&&chipij=p;i-)zi+;for(i=x,j=y;i<ChessRow&&chipij=p;i+)zi+;if(zi>=5)return p;zi=-1;/横向for(i=x,j=y;j>=0&&chipij=p;j-)zi+;for(i=x,j=y;j<ChessCol&&chipij=p;j+)zi+;if(zi>=5)return p;zi=-1;/''斜向for(i=x,j=y;i>=0&&j>=0&&chipij=p;i-,j-)zi+;for(i=x,j=y;i<ChessRow&&j<ChessCol&&chipij=p;i+,j+)zi+;if(zi>=5)return p;zi=-1;/'/'斜向for(i=x,j=y;i>=0&&j<ChessCol&&chipij=p;i-,j+)zi+;for(i=x,j=y;i<ChessRow&&j>=0&&chipij=p;i+,j-)zi+;if(zi>=5)return p;return 0;int pingju()int i,j;for(i=0;i<ChessRow;i+)for(j=0;j<ChessCol;j+)if(chipij=0)return 0;return 1;void xianshou()int xian;step=0;if(language=49)printf("ttt按1 方先手nttt按2 方先手n");else printf("tttpress 1 to let on the offensiventttpress 2 to let on the offensiven");while(1)xian=getch();if(xian=49)player=1;break;else if(xian=50)player=0;break;elseif(language=49)printf("ttt输入有误,请重新输入.r");else printf("tttInput error,please try again.r");void KeyPress(int n)/按键动作switch(n)case 72:/光标上移if(site.y<=0)site.y=ChessCol-1;else site.y-;gotoxy(site.x,site.y);break;case 80:/光标下移if(site.y>=ChessCol-1)site.y=0;else site.y+;gotoxy(site.x,site.y);break;case 75:/光标左移if(site.x<=0)site.x=ChessRow-1;else site.x-;gotoxy(site.x,site.y);break;case 77:/光标右移if(site.x>=ChessRow-1)site.x=0;else site.x+;gotoxy(site.x,site.y);break;case 32:/空格落子并判定胜负luozi();winner=check(site.x,site.y);break;case 27:/ESC重启游戏system("cls");xianshou();DrawChessBoard();break;case 98:/b键悔棋huiqi();break;case 66:/B键悔棋huiqi();break;void chooselanguage()printf("ttt 按 1 进入 中文版n");printf("tttpress 2 to Enter English versionn");while(1)language=getch();if(language=49|language=50)break;else printf("tt输入有误,请重新输入(Input error,please try again).r");void help(int language)/游戏帮助if(language=49)system("cls");printf("tttt五子棋nn");printf("ttt帮助:nttt按移动光标");printf("nttt按空格键落子");printf("nttt按b或B键悔棋");printf("nttt按ESC键重启游戏nn");elsesystem("cls");printf("tttThe Game of Five-In-a-rownn");printf("tttHelp:ntttPress to move cursor");printf("ntttPress spacebar to play chess");printf("ntttPress b or B to withdraw");printf("

    注意事项

    本文(五子棋对战游戏课程设计C语言.doc)为本站会员(知****量)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开