五子棋游戏的设计说明书及源代码
Python-大作业之五子棋游戏(附代码)
Python 大作业——五子棋游戏姓名:学号:姓名:学号:一游戏介绍:我们设计的是五子棋游戏,支持两人一个鼠标对下,黑方用左键单击,白方用右键单击,谁先下均可,落子无悔,下过的棋子对方点击后不会变色,程序可自行判断输赢并在五子连珠时弹出结果对话框,游戏双方需遵守不在空地点击和一次下一子的规则。
二游戏代码设计:代码均为原创,没有借鉴和抄袭,首先是用户GUI界面设计,点击start进入游戏界面,点击quit则退出程序,为了方便判断和记录,我们按从左到右,从上到下的顺序给15x15=225颗棋子编号225,左键绑定函数callback1,点击后可算出它位于哪颗棋子上再画出来黑子,并把对应编号计入record这个列表,之后进入判断函数。
右键绑定函数callback2,点击后画出白子,对应编号计入recor这个列表,之后进入判断函数,其中总列表rec的作用是使棋子不被下第二遍。
三作业感想这个游戏虽然很小但是可以供室友们晚上娱乐之用,我们倾注了很多心血,之前采用模块化编程失败了很多次,有事件响应问题,参数传递问题,到第七个程序才成功,感谢张同珍老师指点了很多,我们学会了使用类,受益匪浅,对Python产生了浓厚的兴趣。
四过程截图五、实验代码from Tkinter import *from tkMessageBox import *class Game:def __init__(self):self.A=[]self.B=[]self.record=set()self.recor=set()self.rec=self.record|self.recorself.root=Tk()self.root.geometry("180x250")self.root.title("Wu Zi Qi Game")self.r=Canvas(self.root,width=180,height=210,bg="purple")pic=PhotoImage(file="beijing.gif")self.r.create_image(90,100,image=pic)self.r.place(x=0,y=15)Label(self.root,text="***Wu Zi Qi Game***",fg="red").place(x=20,y=0)Button(self.root,text="start",command=self.start).place(x=30,y=230)Button(self.root,text="quit ",command=self.root.destroy).place(x=100,y=230) self.r.mainloop()def start(self):self.root.destroy()self.top=Tk()self.top.title("Game Start")self.c=Canvas(self.top,width=480,height=480,bg="white")self.c.pack()self.c.create_rectangle(25,25,455,455,fill="gray")for i in range(30,451,30):for j in range(30,451,30):self.c.create_oval(i-2,j-2,i+2,j+2,fill="blue")for i in range(1,16):self.c.create_line(30,30*i,450,30*i)self.c.create_line(30*i,30,30*i,450)self.c.create_oval(234,234,246,246,fill="black")self.c.create_oval(115,115,125,125,fill="black")self.c.create_oval(355,115,365,125,fill="black")self.c.create_oval(115,355,125,365,fill="black")self.c.create_oval(355,355,365,365,fill="black")self.c.bind("<Button-1>",self.callback1)self.c.bind("<Button-3>",self.callback2)self.c.mainloop()def callback1(self,event):u,v=event.x,event.ys=u/15if s%2==1:self.x=(s+1)/2else:self.x=s/2l=v/15if l%2==1:self.y=(l+1)/2else:self.y=l/2g=(self.y-1)*15+self.xwhile g not in self.rec:self.c.create_oval(self.x*30-12,self.y*30-12,self.x*30+12,self.y*30+12,fill="black") self.A.append(g)self.record=set(self.A)self.rec=self.record|self.recorjudge=panduan(g,self.record)if judge==1:answer=showinfo("Game over","Black wins!")self.top.destroy()def callback2(self,event):u,v=event.x,event.ys=u/15if s%2==1:self.m=(s+1)/2else:self.m=s/2l=v/15if l%2==1:self.n=(l+1)/2else:self.n=l/2k=(self.n-1)*15+self.mwhile k not in self.rec:self.c.create_oval(self.m*30-12,self.n*30-12,self.m*30+12,self.n*30+12,fill="white") self.B.append(k)self.recor=set(self.B)self.rec=self.record|self.recorjudge=panduan(k,self.recor)if judge==1:answer=showinfo("Game over","White wins!")self.top.destroy()def panduan(g,record):#判断横排是否出现赢的情况if {g-4,g-3,g-2,g-1}<=record:return 1elif {g-3,g-2,g-1,g+1}<=record:return 1elif {g-2,g-1,g+1,g+2}<=record:return 1elif {g-1,g+1,g+2,g+3}<=record:return 1elif {g+1,g+2,g+3,g+4}<=record:return 1#判断竖列是否出现赢的情况elif {g-60,g-45,g-30,g-15}<=record:return 1elif {g-45,g-30,g-15,g+15}<=record:return 1elif {g-30,g-15,g+15,g+30}<=record:return 1elif {g-15,g+15,g+30,g+45}<=record: return 1elif {g+15,g+30,g+45,g+60}<=record: return 1#判断\列是否出现赢的情况elif {g-16,g-32,g-48,g-64}<=record:return 1elif {g-48,g-32,g-16,g+16}<=record:return 1elif {g-32,g-16,g+16,g+32}<=record:return 1elif {g-16,g+16,g+32,g+48}<=record: return 1elif {g+16,g+32,g+48,g+60}<=record: return 1#判断/列是否出现赢的情况elif {g-14,g-28,g-42,g-56}<=record:return 1elif {g-14,g-28,g-42,g+14}<=record:return 1elif {g-14,g-28,g+14,g+28}<=record:return 1elif {g-14,g+14,g+28,g+42}<=record:elif {g+14,g+28,g+42,g+56}<=record:return 1else:return 0def main():print "欢迎来到五子棋战场!黑方用左键,白方用右键,谁先下都可以,落子无悔,不要在棋盘周围空地点击。
c五子棋课设说明书含完整源代码解读
*******************实践教学***********************大学计算机与通信学院2016年春季学期C程序设计课程设计题目:五子棋游戏专业班级:16级物联网1班姓名:******__学号:1616520147指导教师:******成绩:摘要五子棋是一种两人对弈或者人机对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现人机对弈五子棋功能。
人机对弈五子棋程序由开始界面,棋盘,判断胜负和计分等子程序构成;程序中应用了数组、全局变量、按键处理和图形编程等元素和语句。
程序通过棋盘和棋子图像生成、玩家移子与电脑判断分数高低而落子和判断胜负等功能的实现,在计算机上用VC++6.0实现了人机五子棋对弈。
关键词:C语言;VC++6.0目录摘要 (I)第1章序言 (1)1.1设计背景 (1)1.2设计目的 (1)第2章需求分析 (2)第3章程序总体设计 (3)3.1程序总体框架图 (3)3.2程序流程图 (4)第4章程序详细设计 (5)4.1各类头文件及自定义函数 (5)4.2棋盘数组 (5)4.3开始界面函数 (5)4.4棋盘界面函数 (5)4.5胜负判断函数 (6)4.6得分判断函数 (6)4.7主函数 (6)第5章系统测试 (7)5.1开始界面测试 (7)5.2棋盘界面测试 (8)5.3玩家输赢界面测试 (11)设计总结 (13)参考文献 (14)致谢 (155)附录(源代码) (166)第1章序言1.1 设计背景五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。
”李善注引三国魏邯郸淳《艺经》中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。
五子棋实验报告(含代码)
实验报告实验一五子棋游戏北方工业大学 2013级计算机技术米鹏一、实验原理及方法五子棋游戏开发借用Visual Studio 2012软件开发平台,选用C#语言进行编写。
整体程序主要分为三部分:界面操作部分、AI逻辑部分和棋子定点分析部分。
1、界面操作部分界面操作部分代码主要针对图像呈现、对应矩阵存储、下棋过程控制等可见的操作环节进编写。
同时负责整个程序的初始化工作。
图像呈现采用C#中Graphics进行绘制。
棋盘被划分为15行15列,每个划分出的小方格均为30*30的正方形,棋盘可操作的范围规定在(20,20)、(460,460)两点的确定的正方形区域内。
通过鼠标左击来确定下子地点。
程序会根据鼠标鼠标点击的位置进行计算,计算得到时对应矩阵的行列,之后再改变对应矩阵的内容后,在通过行列值乘以小方格边长计算得到在显示区域中的具体位置,再稍加变动后画到显示区域中。
以X点坐标为例,下面是计算X(Column)的流程图:在对应矩阵存储方面,后面AI逻辑和棋子分析所用到的矩阵都是来源这里。
同时AI 逻辑和棋子分析不能去修改对应矩阵内容。
图像呈现点的位置、重绘的根据都是来源这里。
在下棋过程控制方面采用信号亮的机制,当操作者下过后,根据信号AI会立即计算将要下点的位置同时改变信号亮变量。
当AI下过棋子后,由于信号亮的的限制就等待操作者去下棋,同时改变信号亮变量内容。
AI和操作者的所有下子、修改矩阵、显示棋子的过程都是统一的。
在每一盘游戏开始时程序会对一些重要的变量进行初始化这里包括矩阵、信号亮、第一步棋子颜色、呈现图像等内容进行初始化。
同时AI会在棋盘中央下第一子。
2、AI逻辑部分AI逻辑部分算是整个程序策略的灵魂。
其中的一些关键性判别的前后关系将影响AI 的下棋的结果。
同时加大和降低AI的难度也是这里。
下面是我设计的策略过程:从下棋者的考虑角度进行考虑,尽可能保证每一次下子都是有必要的、都是在情理当中的。
我所设计的策略并不是完整,漏洞在与没有考虑三棋子连续的情况。
程序设计课程设计五子棋实验报告(附代码)
程序设计课程设计报告书
1、引言
1.1 编写目的
学会 MFC 的一些基本操作,会使用其中的部分函数,编写一个五子连珠的小游戏, 游戏由两人对弈,用鼠标操作,执黑子者先下。
1.2 读者对象
计算机专业的学生或对编程感兴趣的学生
1.3 软件项目概述
项目名称:五子棋游戏 简称:五子棋 项目代号:无 软件项目的大致功能和性能要求
4、界面要求
人机界面要容易操作,有比较舒适的背景,遇到禁手、悔棋、保存、胜利 等可弹出对话框。人机交互和谐。
5、测试方案
1. 检验判断胜利:
6
程序设计课程设计报告书
若胜利,则弹出对话框,并显示是何种胜利 2. 检验禁手
7
程序设计课程设计报告书
以上仅列出六种禁手,当然还有跟多情况 3. 检验保存
当按下“保存”图标菜单时,会弹出对话框,可给棋局取个文件名,如“1” 然后单击“保存(S)” 4. 检验打开 重现打开游戏,按下“打开”图标菜单,现在打开“1” 会显示对话框,选择要打开的文件“1” 单击“打开”,则会复盘,显示上次未完成的游戏,继续对弈 5. 悔棋(有个撤销按钮,不便验收展示) 6. 综上,基本实现新局、保存棋局、打开棋局、悔棋、禁手、判断胜利
1.1 编写目的..............................................................................................................................4 1.2 读者对象..............................................................................................................................4 1.3 软件项目概述......................................................................................................................4 1.4 文档概述..............................................................................................................................4 1.5 定义......................................................................................................................................5 1.6 参考资料..............................................................................................................................5 2、任务概述....................................................................................................................................... 5 2.1 目标....................................................................................................................................... 5 2.2 软件的开发和运行环境.......................................................................................................5 2.3 用户特征..............................................................................................................................5 2.4 假设与约束..........................................................................................................................5 2.5 进度要求..............................................................................................................................5 2.6 验收要求...............................................................................................................................5 3、功能需求描述............................................................................................................................... 6 3.1 基本功能........................................................................................... 错误!未定义书签。 3.2 增加功能........................................................................................... 错误!未定义书签。 4、界面要求....................................................................................................................................... 6 5、测试方案....................................................................................................................................... 6 6、功能设计..................................................................................................................................... 10 6.1 类的关系描述.....................................................................................................................10 6.2 类的设计............................................................................................................................. 11 7、使用指南..................................................................................................................................... 11 8、维护接口..................................................................................................................................... 11 9、总结............................................................................................................................................. 12
java五子棋小游戏实验报告(附源代码)
手机五子棋游戏的设计与实现专业:姓名:班级:学号:指导教师:J2ME(Java 2 Micro Edition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项开发技术。
它因其“write once,run anywhere”的Java特性而提高了开发的效率。
随着手机性能的不断提高,手机休闲娱乐应用将成为PC休闲娱乐应用之后又一重要业务增长点。
棋类游戏规则单一,比较适合在手机等便携终端推广。
由于具有跨平台、易于移植、占用空间小的优势,J2ME成为移动应用开发平台的主流,并提供了很多用以支持移动应用软件的开发的API。
现将该技术用于这次的手机游戏开发,可以实现游戏的快速开发,不但便于查看游戏运行过程中内存的占用量和程序的每一部分代码消耗了多少处理器时间,而且可以不断地优化代码,使代码具有高度的复用性、可扩展性、可维护性。
游戏的开发以J2ME为平台,利用Java技术,结合J2ME的MIDP技术,并对于程序设计思想,重要类、方法等展开讨论。
在对弈部分,分析设计走棋算法,选择合适的方式组织成代码,实现基本的人工智能。
过程中使用了J2ME中的CLDC/MIDP软件体系,主要运用了MID Profile的特定类的支持,来完成游戏的开发。
关键词:J2ME;CLDC;MIDPJ2ME is a kind of fast developing technology implemented on various devices especially mobile communication equipments. It improves the efficiency of the development process because of its "write once, run anywhere" nature. The development trend of the entertainment market based on the cell phone is very obvious because the handset performance enhances unceasingly. The entertainment market based on the cell phone will to be the new important business growth point follow the PC entertainment market. As the rules of a single chess game, it is more suitable for mobile phones and other portable terminal extension.J2ME has been the preferred platform for development because of its platform independent and compatibility, and provides a lot of APIs to support the development of mobile application software. The technology for mobile game development, can achieve the rapid development of the game. It is not only easy to observe the memory consumption and processor consumed time during the operation of the game, but also can optimize the code, so that the code has a high degree of reusability, scalability, maintainability.The game has designed by J2ME, the Java technology and the MIDP technology. I studied the procedure thought, the important class and the method. In the playing chess part, I have analyzed the algorithm, choosed the appropriate way to organize the code and realized the basic artificial intelligence. On the other hand,I learned software system of CLDC/MIDP and the specific class of the MID Profile to complete the game development.Key words: J2ME;CLDC;MIDP目录1 概述 (5)1.1 课题研究背景 (5)1.2 课题研究意义 (5)2 开发技术背景 (6)2.1 JAVA语言概述 (6)2.2 J2ME简介 (6)2.3 移动信息设备简表 (6)3 系统分析及总体设计 (7)3.1 可行性分析 (7)3.2 需求分析 (8)3.3 系统概要设计 (8)4 系统详细设计 (9)4.1 界面设计 (9)4.1.1 图形的低级绘制 (10)4.1.2 用户按键设计 (10)4.2 走棋算法 (11)4.3 胜负判断 (11)5 系统测试 (11)5.1 测试方案 (11)5.2 测试结果 (12)6总结 (13)基于J2ME的手机五子棋游戏的设计与实现1 概述1.1 课题研究背景五子棋是当前非常流行的一种棋。
C++课程设计--五子棋游戏
C++课程设计--五子棋游戏课程设计说明书五子棋游戏The Game of Gobang学院名称:机械工程学院专业班级:测控10xx 学生姓名:江x 指导教师姓名:张xx 指导教师职称:副教授2012年6月目录第一章需求分析 (7)1.1系统概述 (7)1.1.1概述: (7)1.2系统运行环境 (7)1.2.1运行环境 (7)1.3功能需求描述 (7)1.3.1功能需求 (7)第二章总体设计 (8)2.1开发与设计的总体思想 (8)2.1.1总体设计思路 (8)2.1.2屏幕的组成 (9)2.1.3形状的组成 (9)2.1.4形状的统一 (10)第三章概要设计 (10)3.1系统流程图 (10)3.2 软件功能模块 (12)3.3 系统功能模块 (13)第四章详细设计 (13)4.1.界面的设计 (13)4.1.1总体界面的设计 (13)4.1.2界面棋子的设计 (13)4.2.显示界面的准备 (15)4.2.1在窗体类中添加存放黑白棋两维数组和背景棋盘、黑棋、白棋位图对象 (15)4.2.2 在窗体构造函数中初始化wb,装入棋盘、黑棋、白棋位图 (15)4.3. 显示棋盘和棋子代码 (15)4.4. 轮流下子代码 (16)4.5. 判断输赢 (19)4.5.1判断是否白棋胜代码 (19)4.5.2判断是否黑棋胜代码 (20)4.5.3判断是否平局代码 (21)4.6. 悔棋 (21)4.7. 重新开始 (22)4.8. 背景音乐 (23)4.9. 保存读取游戏文件 (23)4.9.1保存文件: (24)4.9.2读取文件: (25)第五章测试分析 (26)结论和心得体会 (27)致谢 (28)参考文献: (29)课程设计任务书一、课程设计目的课程设计是工科各专业的主要实践性教学环节之一,是围绕一门主要基础课或专业课,运用所学课程的知识,结合实际应用设计而进行的一次综合分析设计能力的训练。
课程设计旨在培养学生在本课程范围内,初步掌握解决实际应用问题时所应具有的查阅资料、综合运用所学知识的能力,为课程设计及今后从事专业工作打下基础。
c语言设计五子棋代码
c语言设计五子棋代码五子棋,亦称五目、五子、顺手拍子、连珠、下五子、悔棋、先手必胜等,是一种两人对弈的纯策略型棋类游戏。
通常用黑白两色的棋子在白色棋盘上进行游戏,以先把五个棋子连成一线者获胜。
实现五子棋游戏需要完成以下步骤:1. 棋盘的绘制2. 棋子的下落判断,包括判断是否胜利3. 玩家之间的交替下棋首先是棋盘的绘制。
采用二维数组来表示棋盘,用“+”、“-”、“|”等符号来绘制边框和交叉点。
同时还要用“ ”表示空白区域,用“●”和“○”代表黑白棋子。
然后是棋子的下落判断。
需要记录下棋子的位置,并判断落子是否在棋盘范围内,以及是否与已落下的棋子位置冲突。
在判断胜负时,需要遍历棋盘上所有的落子情况,检查是否存在连续的五个同色棋子。
最后是玩家之间的交替下棋。
可以使用一个计数器来记录当前下棋者,每次下完一子后,计数器加1,判断下一个下棋者,直到游戏结束为止。
下面是一份实现五子棋游戏的 C 代码:#include <stdio.h>#include <stdlib.h>#define ROW 15 // 棋盘行数#define COL 15 // 棋盘列数#define BLACK '●' // 黑色棋子#define WHITE '○' // 白色棋子#define SPACE ' ' // 空白区域char board[ROW][COL]; // 棋盘二维数组// 初始化棋盘void init_board() {for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {board[i][j] = SPACE;}}}// 打印棋盘void print_board() {for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (j == 0) printf("%2d ", i + 1); printf("%c ", board[i][j]);}printf("\n");}for (int i = 0; i < COL; i++) {if (i == 0) printf(" ");printf("%c ", 'A' + i);}printf("\n");}// 判断是否胜利int is_win(int row, int col, char ch) {int count = 1;// 判断横向for (int i = col - 1; i >= 0; i--) { if (board[row][i] == ch) {count++;} else {break;}}for (int i = col + 1; i < COL; i++) { if (board[row][i] == ch) {count++;} else {break;}}if (count >= 5) {return 1;}// 判断纵向count = 1;for (int i = row - 1; i >= 0; i--) { if (board[i][col] == ch) {count++;} else {break;}}for (int i = row + 1; i < ROW; i++) {if (board[i][col] == ch) {count++;} else {break;}}if (count >= 5) {return 1;}// 判断左上到右下斜向count = 1;for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (board[i][j] == ch) {count++;} else {break;}}for (int i = row + 1, j = col + 1; i < ROW && j < COL; i++, j++) { if (board[i][j] == ch) {count++;} else {break;}}if (count >= 5) {return 1;}// 判断左下到右上斜向count = 1;for (int i = row + 1, j = col - 1; i < ROW && j >= 0; i++, j--) { if (board[i][j] == ch) {count++;} else {break;}}for (int i = row - 1, j = col + 1; i >= 0 && j < COL; i--, j++) { if (board[i][j] == ch) {count++;} else {break;}}if (count >= 5) {return 1;}return 0;}。
五子棋源代码(2)
设计题目:五子棋。
一、程序目的和功能实现图形用户界面的五子棋双人对战。
二、各个类的功能说明1.ChessPad面板类,用于绘制棋盘,实现用鼠标进行走棋的动作。
棋盘如下:关键代码:public void paint(Graphics g){for (int i=40;i<=400;i=i+20){g.drawLine(40,i,400,i);}for(int j=40;j<=400;j=j+20){g.drawLine(j,40,j,400);}g.fillOval(97,97,6,6);g.fillOval(337,97,6,6);g.fillOval(97,337,6,6);g.fillOval(337,337,6,6);g.fillOval(217,217,6,6);}定义鼠标在棋盘上的走棋,关键代码:public void mousePressed(MouseEvent e)//走棋2.ChessPoint_black画布类,绘制黑棋,实现黑棋的悔棋,关键代码:public void paint(Graphics g){g.setColor(Color.black);g.fillOval(0,0,18,18);}public void mousePressed(MouseEvent e){if(e.getModifiers()==InputEvent.BUTTON3_MASK){chesspad.remove(this);chesspad.棋子颜色=1;chesspad.i--;chesspad.text_3.setText("这是第"+chesspad.i+"步");chesspad.text_2.setText("");chesspad.text_1.setText("请黑棋下子");}}3.ChessPoint_white画布类,绘制白棋,实现白棋的悔棋,关键代码与ChessPoint_black类似。
JAVA课程设计 五子棋(内附完整代码)
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式private int width,height,modeChess;规定棋盘方格的横向、纵向坐标private int x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子private int[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){ this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}设置交换棋手的标识符public void setisOdd(boolean isodd){ if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}获取棋盘宽度public int getWidth(){return this.width;}获取棋盘高度public int getHeight(){return this.height;}获取棋盘模式public int getModeChess(){return this.modeChess;}获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标public void setX(int x){this.x=x;}记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}获取电脑下子的横向坐标public int getX(){return this.x;}获取电脑下子的纵向坐标public int getY(){return this.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){ int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度private int width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){ int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
五子棋游戏的论文及源代码
本科生课程论文论文题目五子棋游戏五子棋游戏【摘要】为了设计人人对弈模式的五子棋游戏系统,采用了C语言函数模块化程序设计方法,利用Visual C++ 6.0编译器运行游戏,实现一方执白棋,一方执黑棋,通过屏幕上的文字提示,轮流走棋,最先使五子相连一方获胜的人人对弈功能。
通过本程序的训练,加深对C 语言的了解,掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础。
【关键字】五子棋函数设计目的:本程序旨在进一步训练学生游戏开发的技巧,掌握C语言图形模式下的编程。
本程序设计很多图形函数,包括坐标定位;颜色设置(背景色和文本颜色设置)、线条颜色、填充颜色;直线风格、文本风格、填充风格;画线、画圆、画矩形函数;PC扬声器的打开、延迟、关闭;图形系统的初始化和关闭;图形屏幕和文字屏幕的清除;从键盘获取键值等。
功能:实现界面的初始化功能、下棋功能、胜负判断功能和帮助功能。
1)初始化功能。
程序初始化屏幕和棋盘,默认Player1先行。
2)实现下棋功能。
程序能实现下棋操作,在下棋过程中能随时退出。
3)胜负判断。
程序能对下棋的结果进行判断,分出胜负,并显示获胜信息。
4)显示帮助信息。
程序能提示玩家轮到哪方下棋了。
问题分析:首先要实现五子棋的行棋功能,在程序中可以通过坐标来定位棋子的位置,用不同的字符表示黑白棋子,并通过变量的交替实现黑白棋子的交替显示。
另一个难点就是对于胜负的判断,这需要通过循环函数的嵌套使用,难点在于逻辑调理的把握,循环之间的对应关系。
还有一个难点就是在游戏中能随时返回主菜单,这需要一个选择结构来实现,将主菜单的程序编入主函数,在得到特定指令时返回主函数,从而返回主菜单。
下棋过程中对于不断地输入坐标,可以用一个死循环来是实现,在特定的条件下退出循环,返回主函数。
程序设计:一、主要函数介绍本程序主要用到了main ()[1]、startGame()、printState()、judge()、help()、aboutThanks()等函数。
c语言-五子棋游戏-代码-源代码-解释
C语言教程:简易五子棋程序收集于网络/* 纯用字符和数组编的五子棋,棋盘也是用字符画的。
、编了1上午了,主要是算法跟按键比较烦,发现有bug-- 按键速度过快会产生延时显示,可能是算法不好。
操作:玩家1:a,s,w,d(方向)空格(落子)玩家2:上、下、左、右回车(落子)ESC:退出编译测试环境:`*/#include <>#include <>#include <>#include <>/#define CRRU 0xbf /*右上角点197*/#define CRLU 0xda /*左上角点218*/#define CRLD 0xc0 /*左下角点192*/#define CRRD 0xd9 /*右下角点217*/<#define CRL 0xc3 /*左边195*/#define CRR 0xb4 /*右边190*/#define CRU 0xc2 /*上边194*/#define CRD 0xc1 /*下边193*/#define CR 0xc5 /*十字交叉点197*/-#define size 19char a[size][size];int i,j; int x=10;int y=3; return ;}void pressct(int m){switch(m){¥case 19200: //左if(i>0) {i--;x--;gotoxy(x,y);} break;case 20480: //下if(j<size-1){j++;y++;gotoxy(x,y);} break;case 18432: //上$if(j>0) {j--;y--;gotoxy(x,y);} break;case 19712: //右if(i<size-1){i++;x++;gotoxy(x,y);} break;case 7181: //回车if(a[i][j]!=CB&&a[i][j]!=CW){a[i][j]=CW;putch(CW);gotoxy(x,y);side=1;}break; {default: break;}return ;}>int judge(int pa) //判断是否胜利,胜利则返回1,否则返回0;// 其中i,j为当前的落子位;{int m;int sum=1;for(m=1;m<=i&&m<=j;m++) {if(a[i-m][j-m]!=pa) break;sum++;}for(m=1;m<(size-i)&&m<(size-j);m++) {if(a[i+m][j+m]!=pa) break;sum++;}if(sum>=5) return 1;else sum=1;for(m=1;m<=i;m++) {if(a[i-m][j]!=pa) break;sum++;}for(m=1;m<(size-j);m++) {if(a[i+m][j]!=pa) break;sum++;}if(sum>=5) return 1;else sum=1;for(m=1;m<=j;m++) {if(a[i][j-m]!=pa) break;sum++;}for(m=1;m<(size-j);m++) {if(a[i][j+m]!=pa) break;sum++;}if(sum>=5) return 1;else sum=1;for(m=1;m<=i&&m<(size-j);m++) {if(a[i-m][j+m]!=pa) break;sum++;}for(m=1;m<(size-i)&&m<=j;m++) {if(a[i+m][j-m]!=pa) break;sum++;}if(sum>=5) return 1;else return 0;本文章来自21视频教程网C语言教程:简易五子棋程序_C语言程序设计教程原文链接:。
五子棋游戏 C语言 代码 源代码
#include <stdio.h>#include <stdlib.h>#define m 30int main (void){int count;//计数器算横纵行的结果int w,h;int u;int l;int i,size;//i声明步数。
size声明int r[m][m] = {0};//数组声明(棋子位置)int x, y;//声明落子坐标int n;//声明棋盘大小nchar a[20],b[20];printf ("请输入棋盘大小n\n");//编辑棋盘直到棋盘长度宽度大于4小于30 scanf ("%d", &n);if (n<=4 || n>m){do{printf ("输入的棋盘大小:4<n<%d\n", m);scanf ("%d", &n);}while (n<=4 || n>m);}getchar ();//声明玩家printf ("请输入玩家1姓名:\n");gets(a);printf ("请输入玩家2姓名:\n");gets(b);for ( i = 1, size = n*n;i <= size; i++)//编辑棋盘{if (i%2 == 1)//如果i能被2整除,为玩家a相关信息{do//玩家a棋子信息{printf ("%s该你下棋了,第%d个棋子\n", a, i);scanf ("%d%d", &x, &y);if (x > n || x < 0)//判断坐标是否在棋盘内,如果不是则重新输入{do{printf ("0<=横坐标<=%d请重新输入横坐标\n", n);scanf ("%d", &x);}while (x>m || x<0);}if (y > n || y < 0)//判断坐标是否在棋盘内,如果不是则重新输入{do{printf ("0<=纵坐标<=%d请重新输入纵坐标\n", n);scanf ("%d", &y);}while (y < 0 || y > n);}}while ((r[x][y] == 1 && (printf ("这个位置上已经有棋子了,请重新输入\n")))|| r[x][y] == 2&& (printf ("这个位置上已经有棋子了,请重新输入\n")) );r[x][y] = 1;for (u = 0;u < n; u++)//不同情况下判断玩家a获胜方式{for (l = 0;l < n;l++){count = 0;for (w = u,h = l;r[w][h] == 1 && h < n; h++)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;//直接跳转,其余代码不在运行count = 0;for (w = u, h = l; r[w][h] == 1 && w < n; w++)count ++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}count = 0;for (w = u,h = l; r[w][h] == 1 && w < n && h<n;w++,h++)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}count = 0;for (w =u ,h =l;r[w][h] == 1 && h > 0;h--)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}}}}system("cls");for (int j = n;j>=0;j--){printf ("%-2d", j);for (int k = 0;k < n;k++)//画棋盘,声明两玩家棋子图片{if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●"); }printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k);}else if (i%2 == 0)//如果i不能被2整除,为玩家b相关信息{do{printf ("\n%s该你下棋了,第%d个棋子\n", b, i);scanf ("%d%d", &x, &y);if (x > n || x < 0){do{printf ("0<=横坐标<=%d请重新输入横坐标\n", n);scanf ("%d", &x);}while (x>n || x<0);}if (y >n|| y < 0){do{printf ("0<=纵坐标<=%d请重新输入纵坐标\n", n);scanf ("%d", &y);}while (y < 0 || y > n);}}while ((r[x][y] == 1 && (printf ("这个位置上已经有棋子了,请重新输入\n")))|| r[x][y] == 2&& (printf ("这个位置上已经有棋子了,请重新输入\n")) );r[x][y] = 2;system("cls");for (int j = n;j>=0;j--){printf ("%-2d", j);for (int k = 0;k < n;k++){if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●");}printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k); printf ("\n");count = 0;for (u = 0;u < n; u++){for (l = 0;l < n;l++){count = 0;for (w = u,h = l;r[w][h] == 2 && h < n; h++)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w = u, h = l; r[w][h] == 2 && w < n; w++)count ++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w = u,h = l; r[w][h] == 2 && w < n && h<n;w++,h++)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w =u ,h =l;r[w][h] == 2 && h > 0;h--)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}}}}}e: for (int j = n;j>=0;j--)//游戏结束界面棋盘固定重新显示{printf ("%-2d", j);for (int k = 0;k < n;k++){if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●");}printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k); printf ("\n");printf ("\a游戏愉快,Powered by Techmessager\n");//结束语句return 0;}。
JAVA课程设计-五子棋(内附完整代码)
JAVA课程设计设计题目:五子棋游戏一.简要的介绍五子棋1.五子棋的起源五子棋,又被称为“连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋”。
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
2.现在五子棋标准棋盘(如图所示)3.五子棋的棋子五子棋采用两种颜色棋子,黑色棋子和白色棋子,和围棋相同,4.五子棋规则五子棋就是五个棋子连在一起就算赢,黑棋先行,下棋下在棋盘交叉线上,由于黑棋先行,优势太大,所以对黑棋设了禁手,又规定了“三手交换”,就是黑棋下第 2 手棋,盘面第 3 着棋之后,白方在应白 2 之前,如感觉黑方棋形不利于己方,可出交换,即执白棋一方变为执黑棋一方。
和“五手两打法”,就是黑棋在下盘面上关键的第 5 手时,必须下两步棋,让白方在这两步棋中任选一步,然后再续下。
不过一般爱好者不需要遵循这么多规则。
二.程序流程三.代码设计与分析main方法创建了ChessFrame类的一个实例对象(cf),并启动屏幕显示显示该实例对象。
publicclass FiveChessAppletDemo {publicstaticvoid main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}用类ChessFrame创建五子棋游戏主窗体和菜单import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import;import;import;class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"标准棋盘","改进棋盘","扩大棋盘"}; private String[] strmode={"人机对战","人人对战"}; publicstaticboolean iscomputer=true,checkcomputer=true; privateint width,height;private ChessModel cm;private MainPanel mp;构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(14,14);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", null,"棋盘",null,"模式", null, "退出"}, this));JMenu lookMenu =new JMenu("外观");mbar.add(makeMenu(lookMenu,new Object[] {"类型一","类型二","类型三"},this));JMenu helpMenu = new JMenu("版本");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;elseif(parent instanceof String)m = new JMenu((String)parent);elsereturnnull;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();elseif(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elseif(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);elseif(item instanceof JMenuItem)r = (JMenuItem)item;elsereturnnull;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);elseif(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturnnull;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}publicvoid MapSize(int w,int h){setSize(w * 24, h * 27);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}publicboolean getiscomputer(){returnthis.iscomputer;}publicvoid restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 0){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}}publicvoid actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("类型三"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); elseif(arg.equals("类型二"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("标准棋盘")){this.width=14;this.height=14;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("改进棋盘")){this.width=18;this.height=18;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("扩大棋盘")){this.width=22;this.height=22;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对战")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对战")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(null, "第一版", "版本",JOptionPane.PLAIN_MESSAGE );if(arg.equals("退出"))System.exit(0);}}用类ChessModel实现了整个五子棋程序算法的核心import java.awt.*;import.*;import java.applet.*;import javax.swing.*;import;import;import javax.swing.JPanel;class ChessModel {规定棋盘的宽度、高度、棋盘的模式privateint width,height,modeChess;规定棋盘方格的横向、纵向坐标privateint x=0,y=0;棋盘方格的横向、纵向坐标所对应的棋子颜色,数组arrMapShow只有3个值:1,2,3,-1,其中1代表该棋盘方格上下的棋子为黑子,2代表该棋盘方格上下的棋子为白子,3代表为该棋盘方格上没有棋子,-1代表该棋盘方格不能够下棋子privateint[][] arrMapShow;交换棋手的标识,棋盘方格上是否有棋子的标识符privateboolean isOdd,isExist;public ChessModel() {}该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(14, 14, modeChess);}if(modeChess == 2){PanelInit(18, 18, modeChess);}if(modeChess == 3){PanelInit(22, 22, modeChess);}}按照棋盘模式构建棋盘大小privatevoid PanelInit(int width, int height, int modeChess){this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = newint[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -1;}}}获取是否交换棋手的标识符publicboolean getisOdd(){returnthis.isOdd;}设置交换棋手的标识符publicvoid setisOdd(boolean isodd){if(isodd)this.isOdd=true;elsethis.isOdd=false;}获取某棋盘方格是否有棋子的标识值publicboolean getisExist(){returnthis.isExist;}获取棋盘宽度publicint getWidth(){returnthis.width;}获取棋盘高度publicint getHeight(){returnthis.height;}获取棋盘模式publicint getModeChess(){returnthis.modeChess;}获取棋盘方格上棋子的信息publicint[][] getarrMapShow(){return arrMapShow;}判断下子的横向、纵向坐标是否越界privateboolean badxy(int x, int y){if(x >= width+20 || x < 0)returntrue;return y >= height+20 || y < 0;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下publicboolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)returntrue;returnfalse;}判断该坐标位置是否可下棋子publicvoid readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}在该坐标位置下棋子publicvoid play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}计算机走棋说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,下子publicvoid computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋 ...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){算法判断是否下子if(!chessExist(i,j)){判断白子的最大值max_white=checkMax(i,j,2);判断黑子的最大值max_black=checkMax(i,j,1);max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}记录电脑下子后的横向坐标publicvoid setX(int x){this.x=x;}记录电脑下子后的纵向坐标publicvoid setY(int y){this.y=y;}获取电脑下子的横向坐标publicint getX(){returnthis.x;}获取电脑下子的纵向坐标publicint getY(){returnthis.y;}计算棋盘上某一方格上八个方向棋子的最大值,这八个方向分别是:左、右、上、下、左上、左下、右上、右下publicint checkMax(int x, int y,int black_or_white){int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;判断右边for(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}判断左边x_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;判断上面x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断下面y_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断左上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断右下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;判断右上方x_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}判断左下方x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}判断胜负publicboolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;判断右边胜负for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}判断左边胜负x_temp1=x_temp;for(int i=1;i<6;i++){x_temp1-=1;break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)returntrue;判断上方胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断下方胜负y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)returntrue;判断左上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断右下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width) break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)returntrue;判断右上胜负x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}判断左下胜负x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)returntrue;returnfalse;}赢棋后的提示publicvoid showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了","结果",RMATION_MESSAGE);}输棋后的提示publicvoid showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了","结果",RMATION_MESSAGE);}}用类MainPanel主要完成如下功能:1、构建一个面板,在该面板上画上棋盘;2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import;import;import javax.swing.JPanel;class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{设定棋盘的宽度和高度privateint width,height;private ChessModel cm;根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}根据棋盘模式设定棋盘的宽度和高度publicvoid setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),然后调用draw方法在棋盘上画出相应的棋子publicvoid paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}根据提供的棋子信息(颜色、坐标)画棋子publicvoid draw(Graphics g, int i, int j, int v){int x = 20 * i+20;int y = 20 * j+20;画棋盘if(i!=width && j!=height){g.setColor(Color.darkGray);g.drawRect(x,y,20,20);}画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}响应鼠标的点击事件,根据鼠标的点击来下棋,根据下棋判断胜负等publicvoid mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]); repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){cm puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){ cm.showDefeat(this);evt.consume();}}}}publicvoid mouseClicked(MouseEvent evt){}publicvoid mouseReleased(MouseEvent evt){}publicvoid mouseEntered(MouseEvent mouseevt){}publicvoid mouseExited(MouseEvent mouseevent){} publicvoid mouseDragged(MouseEvent evt){}响应鼠标的拖动事件publicvoid mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;响应退出窗口class ChessWindowEvent extends WindowAdapter{publicvoid windowClosing(WindowEvent e){System.exit(0);}ChessWindowEvent(){}}四.程序调试与运行运行:标准棋盘改进棋盘:扩大棋盘:外观类型二:外观类型三:人机对战:结果:五.结论通过对五子棋游戏的编写,使自己对java语言有了更深的了解。
C语言课程设计五子棋源代码_+设计报告
C语言程序设计综合实验设计报告题目:班级;人数:小组成员:时间:目录1 课程设计报告1.1课题描述1.2需求分析1.3概要设计2源程序代码3详细设计1.课题设计报告1.1课题分析:游戏介绍:在一个18*18的方格中下棋,两个玩家,根据键盘上的上、下、左、右键及W、S、A、D来控制棋的走向,空格键及回车键表示确定棋子的落下位置,两个玩家为交替下棋,如果于其中任何一家下的五个棋子能够练成一线那么为胜者,游戏结束。
1 、五子棋是两个人之间进行的竞技活动,开始是由P1先下,把棋落在方框内,然后P2下,如此下棋直到一方在棋盘的横,竖,斜将同色的五个棋子连成一条线,则此方获胜。
游戏由玩家决定继续或结束。
1.2需求分析(1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;(2)画出棋盘的大小;(3)画棋子并确定棋子的大小;(4)判断键盘输入哪个键执行操作;(5)玩家P1先落棋;(6)玩家轮流下棋;(7)判断赢家。
(8)由玩家决定是否继续新游戏。
1.3 概要设计(1)功能模块2. 主流程图五子棋游戏初始化模块下棋操作模块 判断胜负模块 帮助模块 开始 欢迎界面帮助信息画出18*18棋盘遇到的一个问题:图形一闪而过解决方法因为Win-TC 的图形驱动程序EGAVGA.BGI 文件安装路径为c:\\Win-TC\\projects int gdriver=DETECT, gmode;initgraph(&gdriver, &gmode, "c:\\tc")改为initgraph(&gdriver, &gmode, "c:\\Win-TC\\projects")2程序代码#include <bios.h>#include "stdio.h"#include "graphics.h"/*定义1号玩家的操作键键码*/ 定义数组a[X] [Y ]设置初始点设置为(240,170),调用p1move函数,调用p2move函数Enter SpaceESC 用WIN函数判断胜负 游戏结束#define W 0x1177/*上移--'W'*/#define S 0x1f73/*下移--'S'*/#define A 0x1e61/*左移--'A'*/#define D 0x2064/*右移--'D'*/#define SP 0x3920/*落子--空格键*//*定义2号玩家的操作键键码*/#define UP 0x4800/*上移--方向键up*/#define DOWN 0x5000/*下移--方向键down*/#define LEFT 0x4b00/*左移--方向键left*/#define RIGHT 0x4d00/*右移--方向键right*/#define ENTER 0x1c0d/*落子--回车键Enter*/#define ESC 0x011b#define X (getx()-140)/20 /*将棋盘上光标所在点的横坐标X转化为0-18的数*/ #define Y (gety()-70)/20 /*将棋盘上光标所在点的横坐标Y转化为0-18的数*/int k,w=DETECT,gmode,j,i;int a[20][20];void p1move(); /*定义函数*/void p2move();void win();p1win();p2win();yellow();white();black();heqi();welcome();help();csz();qipang();p1turn();p2turn();p1del();p1turn()/*画左上角的白棋*/{setcolor(7);setfillstyle(1,7);circle(60,110,9);floodfill(60,110,7);}p1del() /*将左上角白棋檫去*/ {setfillstyle(1,14);floodfill(60,110,14);}p2turn() /*画右上角的黑棋*/ {setcolor(0);setfillstyle(1,0);circle(578,115,9);floodfill(578,115,0);}p2del() /*画右上角的黑棋*/ {setfillstyle(1,14);floodfill(578,115,14);}white() /*在当前位置画白棋*/ {setcolor(7);setfillstyle(1,7);circle(getx(),gety(),9); floodfill(getx(),gety(),7); }black() /*在当前位置画黑棋*/ {setcolor(0);setfillstyle(1,0);circle(getx(),gety(),9); floodfill(getx(),gety(),0); }yellow() /*补棋盘的颜色*/ {setcolor(6);setfillstyle(1,6);circle(getx(),gety(),9);floodfill(getx(),gety(),6);setcolor(15);line(getx()-9,gety(),getx()+9,gety());line(getx(),gety()+9,getx(),gety()-9);}qipang() /*画棋盘*/{ setfillstyle(1,6);bar(120,50,520,450);setfillstyle(1,14);bar(540,50,620,150);bar(20,50,100,150);for(k=0;k<19;k++){moveto(140+20*k,70);linerel(0,360);moveto(140,70+20*k);linerel(360,0);}moveto(240,170);setcolor(5);settextstyle(3,0,4);outtextxy(50,60,"P1");outtextxy(560,60,"P2");}welcome() /*欢迎界面*/{ initgraph(&w ,&gmode,"c:\\Win-TC\\projects") ; clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"Welcome");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");delay(1000) ; /*delay(1000000000) ; delay(1000000000) ; */ }help() /*帮助界面*/{initgraph(&w ,&gmode,"c:\\Win-TC\\projects");clearviewport();setcolor(4);settextstyle(0,0,2);outtextxy(80,100,"P1 move; 'W S A D' ");outtextxy(80,120," set : space ");outtextxy(80,180,"P2 move: up down left right ");outtextxy(80,200," set: Enter");outtextxy(80,280,"Whoever is first to gather five ");/*same color pieces in a line without any different color piece among them,then he win */ outtextxy(80,300,"same color pieces in a line without");outtextxy(80,320,"any different color piece among ");outtextxy(80,340,"them, then he win.");outtextxy(80,360,"When you want to quit the game,");outtextxy(80,380,"press Esc.");outtextxy(220,440,"press any key to continue");while(bioskey(1)==0);}p1win() /*玩家1获胜界面*/{initgraph(&w ,&gmode,"c:\\Win-TC\\projects") ;clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"P1 WIN");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");while(bioskey(1)==0);main();}p2win() /*玩家2获胜界面*/{clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"P2 WIN");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");while(bioskey(0)!=0) main();}heqi() /*和棋界面*/{clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(180,180,"tie");settextstyle(0,0,2);outtextxy(280,440,"press any key to begin");while(bioskey(0)!=0) main();}csz() /*将所在位置的A[X][Y]赋初值6*/{for(i=0;i<19;i++)for(j=0;j<19;j++){a[i][j]=6;}}void win() /*判断输赢*/{int sum1,sum2,sum3,sum4,sum=0,n,i,j;for(i=X-4,j=Y-4,n=0;i<=X,j<=Y;i++,j++,n-=2){sum1=a[i][Y]+a[i+1][Y]+a[i+2][Y]+a[i+3][Y]+a[i+4][Y];sum2=a[i][j]+a[i+1][j+1]+a[i+2][j+2]+a[i+3][j+3]+a[i+4][j+4];sum3=a[X][j]+a[X][j+1]+a[X][j+2]+a[X][j+3]+a[X][j+4];sum4=a[i][j+8+n]+a[i+1][j+7+n]+a[i+2][j+6+n]+a[i+3][j+5+n]+a[i+4][j+4+n]; if(sum1==5||sum2==5||sum3==5||sum4==5)p2win();if (sum1==0||sum2==0||sum3==0||sum4==0)p1win(); }for(i=0;i<18;i++)for(j=0;j<18;j++)sum=sum+a[i][j];if(sum<181)heqi();}void p1move() /*玩家1的移动*/{switch(bioskey(0)){case ESC: {closegraph(); exit(0);}/*如果按键为ESC就退出游戏*/case SP:/*落子*/if(a[X][Y]==6) {p1del();p2turn();a[X][Y]=0;white();win(); p2move();}else p1move();case A: /*向左移*/if(a[X][Y]==0){if(getx()==140) moveto(520,gety());moverel(-20,0);white();}else if(a[X][Y]==1){if(getx()==140) moveto(520,gety());black();moverel(-20,0);white();} else{ yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);white();} p1move();case D: /*向右移*/if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());moverel(20,0);white();}else if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());black();moverel(20,0);white();}else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);white();}p1move();case W: /*向上移*/if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}else if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);black();moverel(0,-20);white();}else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);white();}p1move();case S: /*向下移*/if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);moverel(0,20);white();}else if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);black();moverel(0,20);white();}else { yellow();if(gety()==430) moveto(getx(),50);moverel(0,20);white(); } p1move();default: p1move();}}void p2move() /*玩家2的移动*/{switch(bioskey(0)) /*如果按键为ESC就退出游戏*/{case ESC: {closegraph(); exit(0);}case ENTER: /*落子*/if(a[X][Y]==6) {p2del();p1turn();a[X][Y]=1;black();win();p1move();}else p2move();case LEFT: /*向左移*/if(a[X][Y]==1) {if(getx()==140) moveto(520,gety());moverel(-20,0);black();}else if(a[X][Y]==0) {if(getx()==140) moveto(520,gety());if(getx()==140) moveto(500,gety());white();moverel(-20,0);black();}else { yellow();if(getx()==140) moveto(520,gety());moverel(-20,0);black();} p2move();case RIGHT: /*向右移*/if(a[X][Y]==1) {if(getx()==500) moveto(120,gety());moverel(20,0);black();}else if(a[X][Y]==0) {if(getx()==500) moveto(120,gety());white();moverel(20,0);black();}else { yellow();if(getx()==500) moveto(120,gety());moverel(20,0);black();}p2move();case UP: /*向上移*/if(a[X][Y]==1) {if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}else if(a[X][Y]==0) {if(gety()==70) moveto(getx(),450);white();moverel(0,-20);black();}else { yellow();if(gety()==70) moveto(getx(),450);moverel(0,-20);black();}p2move();case DOWN: /*向下移*/if(a[X][Y]==1) {if(gety()==430) moveto(getx(),50);moverel(0,20);black();}else if(a[X][Y]==0) {if(gety()==430) moveto(getx(),50);white();moverel(0,20);black();}else {if(gety()==430) moveto(getx(),50); yellow();moverel(0,20);black();}p2move();default: p2move();}}main() /*主函数*/{ welcome(); /*调用欢迎界面*/help(); /*调用帮助界面*/initgraph(&w ,&gmode,"c:\\Win-TC\\projects") ; /*清屏*/clearviewport();csz();qipang(); /*调用棋盘*/p1move(); /*调用玩家1的移动*/p2move();getch();}3详细设计1部分:以下是我负责的模块的函数,由于个人水平问题,我只负责画图部分。
五子棋游戏 C语言 代码 源代码
#include <stdio.h>#include <stdlib.h>#define m 30int main (void){int count;//计数器算横纵行的结果int w,h;int u;int l;int i,size;//i声明步数。
size声明int r[m][m] = {0};//数组声明(棋子位置)int x, y;//声明落子坐标int n;//声明棋盘大小nchar a[20],b[20];printf ("请输入棋盘大小n\n");//编辑棋盘直到棋盘长度宽度大于4小于30 scanf ("%d", &n);if (n<=4 || n>m){do{printf ("输入的棋盘大小:4<n<%d\n", m);scanf ("%d", &n);}while (n<=4 || n>m);}getchar ();//声明玩家printf ("请输入玩家1姓名:\n");gets(a);printf ("请输入玩家2姓名:\n");gets(b);for ( i = 1, size = n*n;i <= size; i++)//编辑棋盘{if (i%2 == 1)//如果i能被2整除,为玩家a相关信息{do//玩家a棋子信息{printf ("%s该你下棋了,第%d个棋子\n", a, i);scanf ("%d%d", &x, &y);if (x > n || x < 0)//判断坐标是否在棋盘内,如果不是则重新输入{do{printf ("0<=横坐标<=%d请重新输入横坐标\n", n);scanf ("%d", &x);}while (x>m || x<0);}if (y > n || y < 0)//判断坐标是否在棋盘内,如果不是则重新输入{do{printf ("0<=纵坐标<=%d请重新输入纵坐标\n", n);scanf ("%d", &y);}while (y < 0 || y > n);}}while ((r[x][y] == 1 && (printf ("这个位置上已经有棋子了,请重新输入\n")))|| r[x][y] == 2&& (printf ("这个位置上已经有棋子了,请重新输入\n")) );r[x][y] = 1;for (u = 0;u < n; u++)//不同情况下判断玩家a获胜方式{for (l = 0;l < n;l++){count = 0;for (w = u,h = l;r[w][h] == 1 && h < n; h++)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;//直接跳转,其余代码不在运行count = 0;for (w = u, h = l; r[w][h] == 1 && w < n; w++)count ++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}count = 0;for (w = u,h = l; r[w][h] == 1 && w < n && h<n;w++,h++)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}count = 0;for (w =u ,h =l;r[w][h] == 1 && h > 0;h--)count++;if (count == 5){printf ("%s是胜利者\n", a);goto e;}}}}system("cls");for (int j = n;j>=0;j--){printf ("%-2d", j);for (int k = 0;k < n;k++)//画棋盘,声明两玩家棋子图片{if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●"); }printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k);}else if (i%2 == 0)//如果i不能被2整除,为玩家b相关信息{do{printf ("\n%s该你下棋了,第%d个棋子\n", b, i);scanf ("%d%d", &x, &y);if (x > n || x < 0){do{printf ("0<=横坐标<=%d请重新输入横坐标\n", n);scanf ("%d", &x);}while (x>n || x<0);}if (y >n|| y < 0){do{printf ("0<=纵坐标<=%d请重新输入纵坐标\n", n);scanf ("%d", &y);}while (y < 0 || y > n);}}while ((r[x][y] == 1 && (printf ("这个位置上已经有棋子了,请重新输入\n")))|| r[x][y] == 2&& (printf ("这个位置上已经有棋子了,请重新输入\n")) );r[x][y] = 2;system("cls");for (int j = n;j>=0;j--){printf ("%-2d", j);for (int k = 0;k < n;k++){if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●");}printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k); printf ("\n");count = 0;for (u = 0;u < n; u++){for (l = 0;l < n;l++){count = 0;for (w = u,h = l;r[w][h] == 2 && h < n; h++)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w = u, h = l; r[w][h] == 2 && w < n; w++)count ++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w = u,h = l; r[w][h] == 2 && w < n && h<n;w++,h++)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}count = 0;for (w =u ,h =l;r[w][h] == 2 && h > 0;h--)count++;if (count == 5){printf ("%s是胜利者\n", b);goto e;}}}}}e: for (int j = n;j>=0;j--)//游戏结束界面棋盘固定重新显示{printf ("%-2d", j);for (int k = 0;k < n;k++){if (r[k][j] == 0)printf ("╋");else if(r[k][j] == 1)printf ("○");else if (r[k][j] == 2)printf ("●");}printf ("\n");}printf (" ");for (int k = 0;k < n;k++)printf ("%-2d", k); printf ("\n");printf ("\a游戏愉快,Powered by Techmessager\n");//结束语句return 0;}。
Python五子棋游戏代码
Python五子棋游戏代码五子棋游戏涉及到的内容较多,这里给出一个简化版的五子棋游戏实现。
首先需要安装pygame库,可以使用以下命令安装:bashpip install pygame接下来是五子棋游戏的代码:import pygameimport sys# 初始化pygamepygame.init()# 设置屏幕大小screen_size = (600, 600)screen = pygame.display.set_mode(screen_size)# 设置颜色white = (255, 255, 255)black = (0, 0, 0)# 加载棋盘图片board_image = pygame.image.load("board.png")# 设置棋盘大小board_size = board_image.get_rect().size# 设置棋盘坐标def get_position(x, y):return x * board_size[0], y * board_size[1]# 绘制棋盘def draw_board():for x in range(15):for y in range(15):rect = get_position(x, y)screen.blit(board_image, rect)pygame.draw.line(screen, black, get_position(x, y), get_position((x + 1) % 15, y), 2)pygame.draw.line(screen, black, get_position(x, y), get_position((x - 1) % 15, y), 2)# 主循环player = 1while True:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posx, y = x // board_size[0], y // board_size[1]if board_image.get_at((x, y)) == (0, 0, 0):if player == 1:player = 2else:player = 1screen.fill(white)draw_board()pygame.display.flip()注意:这个示例需要你提供一张名为"board.png"的棋盘图片。
五子棋程序设计说明书
}
printf("\n");
}
}
int judge(int x,int y) /*判断各方向五子是否连成一线*/ //x,y分别为横纵坐标//
设计背景及意义
我们的五子棋程序是在Visual C++ 环境下运行的。
Visual C++
Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。目前最新的版本是Microsoft Visual C++ 2010。Visual C++集成了,于1998发行。发行至今一直被广泛地用于大大小小的项目开发。
case 97: *y=*y-1;break; //a键控制棋子左移//
case 115: *x=*x+1;break; //s键控制棋子下移//
case 100: *y=*y+1;break; //d键控制棋子右移//
case 111: flag=0;break; //o键确定落子//
}
if(flag==0) break; //判断某步是否移动完成//
for(i=0;i<2000;i++) //改变玩家//{来自if(flag==1)
flag=0;
else
C语言五子棋源代码_设计报告1
C语言五子棋源代码_设计报告1C语言五子棋源代码_设计报告1设计报告一、概述本项目是一个基于C语言的五子棋游戏,实现了双人对战的功能。
通过控制台界面显示棋盘和棋子,并进行相应的逻辑判断,以确定游戏的胜负。
二、设计思路1.棋盘的显示使用二维数组来表示棋盘,通过循环遍历数组并打印相应的字符来显示棋盘。
2.棋子的放置根据玩家的输入即坐标位置,在对应的数组下标位置放置相应的字符表示棋子。
3.游戏逻辑设计了胜利的条件判断函数,通过检查棋盘中的连续五个相同的字符来判断是否已经获胜。
4.玩家输入的处理使用循环来等待玩家输入,输入合法的坐标后进行相应的处理,包括棋盘上棋子的放置、胜利判断以及游戏结束的处理。
5.游戏结束的判断游戏结束时,根据胜利的条件判断结果进行相应的处理,可以继续游戏或退出游戏。
三、关键函数说明1. void displayBoard(char board[ROW][COL])该函数用于显示棋盘,根据棋盘数组的值打印相应的字符来显示棋盘。
2. int isWin(char board[ROW][COL], int x, int y)该函数用于判断当前位置的棋子是否连成五子线,如果是胜利则返回1,否则返回0。
3. void playerMove(char board[ROW][COL], int player)该函数用于玩家输入坐标,并将相应的棋子放置在棋盘上,同时进行胜利判断。
4. void playGame该函数用于游戏的整体流程,循环进行玩家的输入和处理,直到出现胜利或平局。
四、总结通过本项目的设计和实现,我进一步熟悉了C语言的编程技巧和逻辑思维,学会了如何通过编写函数来组织代码和实现功能。
同时,我也了解了五子棋游戏的规则和胜利判断的逻辑。
通过不断调试和优化代码,我成功地实现了一个简单但完整的五子棋游戏,提升了自己的编程能力和解决问题的能力。
这个项目的完成使我对C语言的应用有了更加深入的理解,也锻炼了我的团队合作和解决问题的能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*******************实践教学*******************软件学院2012年秋季学期C语言课程设计说明书题目:五子棋游戏的设计专业班级:姓名:学号:指导教师:成绩:目录目录 (I)摘要 (I)序言 (II)1、需求分析 (1)1.1总体分析 (1)1.2初始化 (1)1.3主循环控制模块 (1)1.4玩家下子 (1)1.5盘面分析填写棋型表 (2)1.6对方下子 (2)1.7胜负判断 (2)2、设计思路 (3)2.1五子棋的起源与发展 (3)2.2五子棋的基本术语及规则 (3)2.2.1五子棋的基本术语: (3)2.2.2五子棋的规则 (4)2.3功能描述 (5)3、详细设计 (6)3.1流程图 (6)4、运行调试与分析讨论 (7)4、运行调试与分析讨论 (8)4.1运行结果 (8)4.2分析讨论 (12)5、设计体会与小结 (13)5.1课设中的体会及小结 (13)参考文献 (14)致谢 (15)附录一源代码 (16)摘要游戏设计已经成为现在社会的一种热门行业。
五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,只需两人即可进行,非常富有趣味性和消遣性。
这里设计和实现了一个双人对下的黑白五子棋单机游戏。
主要应用了Visual C++编程来完成这个游戏的设计的。
本文主要介绍了本游戏开发环境Microsoft Visual C++ 6.0,使用当前优秀的开发工具VC++编程。
包含了五子棋程序的棋盘初始化、游戏规则、胜负判断方法,及帮助等。
关键词:五子棋;初始化;VC++编程;判断;单机游戏。
序言五子棋是起源于中国古代的传统黑白棋种之一,是一种训练人逻辑思维严密性的游戏。
该设计以五子棋游戏业务为背景,设计、开发一套“五子棋游戏”软件。
通过该题目的设计过程,可以提高基本编程能力和游戏开发的技巧,熟悉C语言图形模式下的编程。
本程序中涉及很多图形函数,包括:坐标定位;颜色设置(背景色和文本颜色设置),线条颜色、填充颜色;直线风格、文本风格、填充风格;画线、画圆、画矩形函数;图形系统的初始化和关闭;图形屏幕和文字屏幕的消除;从键盘获取键值等。
通过本程序的训练,可以使我们加深对C语言的更深刻的了解,掌握五子棋游戏开发的基本原理,为开发出高质量的游戏软件打下坚实的基础。
1、需求分析1.1 总体分析软件需求分析是软件开发周期的第一个阶段,也是关系到软件开发的关键一步。
对于任何一个软件而言,需求分析工作都是至关重要的一步。
只有通过软件需求分析,才能把软件的功能和性能由总体的概念性描述转化为具体的规格说明,进而建立软件开发的基础。
实践表明,需求分析工作进行得好坏,在很大程度上决定了软件开发的成败。
软件需求分析的任务是:让客户和开发者共同明确将要开发的是怎样一个软件。
具体而言,就是通过对问题和环境的理解、分析和综合,建立逻辑模型,完成新软件的逻辑方案设计。
基于本游戏,首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组table[15][15](15*15是五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用‘0’表示空位、‘1’表示自己的子,‘2’表示对方的子;这张表也是今后分析的基础。
在此之后还要为两个玩家双方各建立一张棋型表Computer[15][15][4]和Player[15][15][4],用来存放棋型数据。
1.2 初始化首先,建立盘面数组Table[15][15]、对战双方的棋形标Computer[15][15][4]和Player[15][15][4]并将它们清零以备使用;然后初始化显示器、键盘、鼠标等输入设备并在屏幕上画出棋盘(棋盘可以不显示)。
1.3 主循环控制模块控制下期顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。
1.4 玩家下子当轮到玩家下时,您通过键盘或鼠标在棋盘上落子,程序会根据该点的位置,在Table[15][15]数组的相应地方记录‘2’,以表明该子是玩家下的。
1.5 盘面分析填写棋型表您在下五子棋时,一定会先根据棋盘上的情况,找出当前最重要的一些位点,如“活三”、“冲四”等;然后再在其中选择落子点。
先来分析己方的棋型,我们从棋盘左上角出发,向右逐行搜索,当遇到一个空白点时,以它为中心向左挨个查找,如果遇到己方的子则记录然后继续,如果遇到对方的子、空白点或边界就停止查找。
左边完成后再向右进行同样的操作;然后把左右两边的记录合起来,得到的数据就是该点横向上的棋型,然后把棋型的编号填入到Computer[x][y][n]钟就行了(x、y代表作标,n=0、1、2、3分别表示横、竖、左斜、右斜四个方向)。
而其他三个方向的棋型也可用同样的方法得到,当搜索完整张棋盘后,己方的棋型表也就填写完毕了。
然后再用同样的方法填写对方棋型表。
注意:所有棋型的编号都要事先定义好,越重要的号数越大!1.6 对方下子有了上面填写的两张棋型表,就是遍历棋型表Computer[15][15][4]和Player[15][15][4]找出其中数值最大的一点,在该点下子即可。
但这种算法的弱点非常明显,只顾眼前利益,不能顾全大局,这就和许多五子棋初学者一样犯了“目光短浅”的毛病。
如果在这儿下子将会形成对手不得不防守的棋型(例如‘冲四’、‘活三’);那么下一步对手就会照您的思路下子来防守您,如此一来便完成了第一步的预测。
这时再调用模块四对预测后的棋型进行分析,如果出现‘四三’、‘双三’或‘双四’等制胜点,那么己方就可以获胜了(当然,对黑棋而言‘双三’或‘双四’是禁手,另当别论);否则照同样的方法向下分析,就可预测出第二步、第三步……等一等,要是盘面上没有对手必须防守的棋型,那该怎么办呢?进攻不成的就得考虑防守了,将自己和对手调换一下位置,然后用上面的方法何乐而不为呢!1.7 胜负判断无需多言,某方形成五子连即获胜;若黑棋走出‘双三’、‘双四’或长连即以禁手判负。
2、设计思路2.1 五子棋的起源与发展五子棋是起源于中国古代的传统黑白棋种之一。
五子棋不仅能增强思维能力,提高智力,而且富有哲理,有助于修身养性。
它简单易学的特征,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源远流长,且具有东方的神秘和西方的直观;既有“场的”概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
五子棋起源于古代中国,发展于日本,风靡于欧洲。
据日本史料文献记载介绍,中国古代的五子棋经由高丽(朝鲜),于1688年至1704年的日本元禄时代传到日本。
到去日本明治32年(公元1899年),经过公开征名,连珠这一名称才被正式确定下来。
从此,连珠活动经过了不断改良,主要是规则变化(即限制黑棋一方)。
例如,1899年规定,禁止黑白双方走“双三”;1903年规定,只禁止黑方走“双三”;1912年规定黑方被迫走“双三”亦算输;1916年规定,黑方不准走“长连”;1918年规定,黑方不准走“四,三,三”;1931年规定,黑方不准走“双四”,并规定将19*19的围棋棋盘改为15*15的连珠专用棋盘。
本世纪初五子棋传入欧洲并迅速风靡全欧。
通过一系列的变化,使五子棋这一简单游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为国际性比赛。
2.2 五子棋的基本术语及规则2.2.1五子棋的基本术语:(1)先手:进攻的着法,也指对弈双方执黑棋先在棋盘上落子的一方;(2)四三:指同时具备两个先手,其中一个四,另一个是活三;(3)活三(包括连三和跳三):[1]连三:紧紧相连的同色三子[2]跳三:中间间隔一子的活三;(4)四四:一子落下形成两个“四”的棋形;(5)三三:一子落下形成两个活三的棋形;(6)长连:相同颜色的连续六子或六子以上;(7)禁手:对局中禁止使用的战术或被判为负的行棋手段;(8)胜局:对局的一方获胜,成为“胜局”。
(9)和棋:不分胜负的对局或双方同意平局。
2.2.2 五子棋的规则五子棋游戏的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。
五子棋的比赛规则如下:(1)黑棋先手、白棋后手,从天元开始互相顺序落子;(2)最先在棋盘横向、纵向或斜向形成连续的同色五子的一方为胜;(3)黑棋禁手判负、白棋无禁手。
黑棋禁手有“三,三”、“四,四”和“长连”,包括“四,三,三”和“四,四,三”。
黑棋只能以“四,三”取胜;(4)如分不出胜负,则以平局结束;(5)五连与禁手同时形成,判胜;(6)黑方禁手形成时,白方应立即指出。
若白方未发现或发现后不立即指出,反而继续落子,则禁手失败,不再判黑方负。
五子棋是黑白双方或两个人之间的竞技活动,由于对黑白双方规则不同,黑棋必须先行。
2.3 功能描述功能说明该五子棋游戏基本上实现了五子棋的游戏功能,有双方下棋的界面及最终判定结果的界面。
同时该游戏采用二维坐标实现,明了易懂,方便玩家在游戏过程中的基本操作,使游戏更加简便。
在细节方面,该系统提供实时存储功能,随时记录以完成的游戏,使用户可以很好的处理以外中断的情况。
该游戏基本实现了游戏的一些要求和特征。
在游戏的源程序和文档方面,我们也严格遵守软件工程的思想,立足实验要求,确定任务,需求分析,设计和编码,每个步骤都力求清晰易懂。
源代码注释详尽,各功能模块分明,可移植性强。
当然该系用也有不足的地方,第一次进行独立的课程设计,也有许多细节方面是考虑不到的,这款游戏也是在不断的调试和修改中产生和完善的。
希望老师能够指出不足,帮助我们不断提高。
3、详细设计3.1 流程图本程序定义了各种操作函数、各种状态判定,思想明确,思路清晰。
各个判断选择了不同路径,因此继续进行或输出结果。
程序中,“循环”的利用非常直接和清晰,双方交替下棋,因此循环往复。
最终决出胜负或最终平局。
分析时,也考虑了许多情况,针对各个情况均作出了相应措施和解决方案。
程序采用循环进行双方交替下棋,并进行了很多判断。
首先判断棋盘是否已满,若棋盘已满,则输出平局,结束游戏;若棋盘未满,则继续进行。
然后判断“o”方是否胜出,若“o”方胜出,则输出“o”方获胜,若未获胜,则继续判断棋盘是否已满,若已满则输出平局,结束游戏;若未满,则继续游戏。
由“x”方选择位置,继续前面的操作,以此类推。
4、运行调试与分析讨论4.1 运行结果图1 运行结果初始图图2 游戏过程图图 3图 4图 5图 6图 7图 84.2 分析讨论该五子棋游戏经过多次调试运行,能够顺利进行二人对弈。
但由于其能力有限,不能够制作出拥有美观界面的五子棋游戏。
该游戏由于是由15x15的棋盘构成,应此,可以先让一方将棋子落在(7,7)这个空格上,然后另一方可以在起周围进行落子对弈。