c语言五子棋游戏
五子棋游戏代码
1、游戏实现效果图:2、游戏代码(含详细注解):import java.awt.*;import java.awt.event.*;import java.awt.Color;import static java.awt.BorderLayout.*;public class Gobang00{Frame f = new Frame("五子棋游戏");MyCanvas border = new MyCanvas();int color = 0;// 旗子的颜色标识0:白子1:黑子boolean isStart = false;// 游戏开始标志int bodyArray[][] = new int[16][16]; // 设置棋盘棋子状态0 无子1 白子2 黑子Button b1 = new Button("游戏开始");Button b2 = new Button("重置游戏");//Label WinMess = new Label(" ");//用于输出获胜信息TextField WinMess = new TextField(40);Checkbox[] ckbHB = new Checkbox[2];//用于判断白子先下,还是黑子先下CheckboxGroup ckgHB = new CheckboxGroup();public void init(){border.setPreferredSize(new Dimension(320,310));WinMess.setBounds(100, 340, 300, 30);f.add(border);//设置游戏状态,是开始游戏,还是重置游戏Panel p1 = new Panel();//用于放置b1和b2按钮,及选择框p1.add(b1);p1.add(b2);b1.addActionListener(new gameStateListener());b2.addActionListener(new gameStateListener());//设置谁先下棋// Panel p2 = new Panel();//用于放置选择组建ckbHB[0] = new Checkbox("白子先", ckgHB, false); ckbHB[1] = new Checkbox("黑子先", ckgHB, false); p1.add(ckbHB[0]);p1.add(ckbHB[1]);ckbHB[0].addItemListener(new itemListener()); ckbHB[1].addItemListener(new itemListener());//进入下棋状态,为窗口和board添加事件监听器f.addMouseListener(new mouseProcessor()); border.addMouseListener(new mouseProcessor()); Panel p2 = new Panel();//用于放置输赢信息显示框p2.add(WinMess);gameInit();f.add(p1,BorderLayout.SOUTH);f.add(p2,BorderLayout.NORTH);f.pack();f.setVisible(true);//设置窗体关闭事件f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});}public static void main(String[] args){new Gobang00().init();}//定义事件监听器类,用于判断是开始游戏,还是重置游戏class gameStateListener implements ActionListener{public void actionPerformed(ActionEvent e){if (e.getSource() == b1){gameStart();}else{reStart();}}}public void gameStart() // 游戏开始{isStart = true;enableGame(false);b2.setEnabled(true);}public void enableGame(boolean e) // 设置组件状态{b1.setEnabled(e);//setEnabled(boolean) - 类ponent 中的方法:根据参数b 的值启用或禁用此组件。
c 课程设计报告五子棋
c 课程设计报告五子棋C++面向对象课程设计报告院(系):专业: 学生姓名: ,,班级:,,,学号:题目: 五子连珠棋 ,,,,,,,,,起迄日期: 2010-12-20,,,, ,,,,, 设计地点:指导教师:完成日期: 2010 年 12 月31 日课程设计报告内容一、需求分析1( 选做此课题目的五子棋游戏是一历史悠久,对抗性强,技巧性高的棋类游戏。
而且我对五子棋有着独特的爱好,希望自己也可以编写出一款可以实现人机对战的五子棋游戏。
把自己的思想付给电脑,让自己有些成就感,给自己继续努力的动力。
借此次课程设计的机会,把想法变成现实。
而且五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。
它是中西文化的交流点,是古今哲理的结晶。
所以此次c++课程设计选择五子棋这个题目。
2( 程序所实现的功能通过给电脑赋予人工智能,利用电脑运算速度快的特点,结合五子棋的游戏规则,给电脑设定固定的扫描方式,设定权值,使电脑能够选择最合适的落子点,然后调用加载已做好的棋盘棋子图像,最终实现简单的人机对弈。
3(该游戏为普通玩家使用,只要连成五子即获胜,没有禁手、RIF(国际连珠连盟)正式规则、“Yamaguchi”、”Tarannikov”、“Taraguchi”等规则。
二、设计内容1( 根据所选题目,给出模块图主界面开始游戏重新开始游戏游戏结束初始化棋盘初始化棋盘结束界面落子判断输赢2( 画出主程序及其主要模块的流程图游戏开始初始化棋盘加载棋盘图片1点鼠标左键落子加载棋子图片到棋盘扫描棋盘,根据预设权值,选择最佳地点落子否五子连珠,加载棋子图片到棋盘是否五子连转1 珠,是用红色显示游戏结束3( 编写程序代码加载位图(棋盘和棋子):m_board->m_hObject = (HBITMAP)::LoadImage (NULL,"checkerboard.bmp",IMAGE_BITMAP,320,320,LR_LOADFROMFILE); m_white->m_hObject = (HBITMAP)::LoadImage(NULL,"bai.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);m_black->m_hObject = (HBITMAP)::LoadImage(NULL,"hei.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);m_temp->m_hObject = (HBITMAP)::LoadImage(NULL,"mask1.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE);m_red->m_hObject=(HBITMAP)::LoadImage(NULL,"dred.bmp",IMAGE_BITMAP,20,20,LR_LOADFROMFILE); 响应左键:LButtonDown(UINT nFlags, CPoint point) { int m ,n;CDC thmem1 ;CClientDC dc(this);thmem1.CreateCompatibleDC(&dc);int curx = point.y;int cury = point.x;m =int((curx-5)/20);n = int((cury-15)/20);}没有五子连珠时简单显示棋子:显示白色棋子: if(board[i][j]==0){ thmem2.SelectObject (m_temp);dc.BitBlt(j*20+15,i*20+5,20,20,&thmem2,0,0,MERGEPAINT); thmem2.SelectObject (m_black);dc.BitBlt (j*20+15,i*20+5,20,20,&thmem2,0,0,SRCAND);m_byColour = white ;}显示黑色棋子: if(board[i][j] == 1){ thmem2.SelectObject (m_temp);dc.BitBlt(j*20+15,i*20+5,20,20,&thmem2,0,0,MERGEPAINT); thmem2.SelectObject (m_white);dc.BitBlt (j*20+15,i*20+5,20,20,&thmem2,0,0,SRCAND);m_byColour = black;}五子连珠时红色显示棋子:人赢时: if(ptable[ii][jj][j] == true){ thmem2.SelectObject(m_temp);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,MERGEPAINT); thmem2.SelectObject(m_red);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,SRCAND); } // MessageBox("你赢了");计算机赢时: if(ctable[ii][jj][j] == true){ thmem2.SelectObject (m_temp);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,MERGEPAINT); thmem2.SelectObject (m_red);dc.BitBlt(jj*20+15,ii*20+5,20,20,&thmem2,0,0,SRCAND);}电脑扫描棋盘: for(i = 0 ; i<15; i++)for(j= 0 ;j <15 ;j++)board[i][j] = 2; // 初始化棋盘数组for(i = 0 ; i <15 ; i++) //对列进行隔行扫描,for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;} count ++;}for(i = 0 ; i <15 ; i++) //对行进行隔行扫描for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <11; i++) //对交叉的情况,东南,西北走向,进行扫描for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;}count ++;}for(i = 0 ; i <11 ; i++) //对交叉的情况,东北,西南走向,进行扫描for(j=14 ; j >= 4 ; j--){for( k = 0 ; k <5 ;k++){ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true;}count ++;}Start:void CMyDlg::Onstart() {MessageBox("请落子");m_byColour = black;}Restart:再次初始化棋盘,函数类似于扫描{for(i = 0 ; i<15; i++)for(j= 0 ;j <15 ;j++)board[i][j] = 2;for(i = 0 ; i <15 ; i++)for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i][count] = true; ctable[j+k][i][count] = true; }count ++;}for(i = 0 ; i <15 ; i++)for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <11; i++)for(j=0 ; j <11 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;}count ++;}for(i = 0 ; i <11 ; i++)for(j=14 ; j >= 4 ; j--){ for( k = 0 ; k <5 ;k++){ ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true; }count ++; }三、调试分析1( 实际完成的情况说明能够判断胜负,没下一子,都要进行胜负判断,赋予电脑人工智能,玩家通过点击鼠标左键落子,电脑会根据预设的方式扫描,计算每一点的权值,从而找到最佳落子点,实现人机对弈。
五子棋对战游戏课程设计C语言
哈尔滨远东理工学院C语言课程设计论文题目:五子棋对战游戏姓名:分院:机器人科学与技术学院专业:电子信息工程学号:指导教师:二0一四年九月五日五子棋(C语言)摘要五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一。
早在“尧造围棋”之前,可能民间就已有五子棋游戏。
发展于日本,流行于欧美。
五子连珠棋五子棋容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
五子棋既有现代休闲的明显特征“ 短、平、快” ,又有古典哲学的高深学问“ 阴阳易理” ;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“ 场” 的概念,亦有“ 点” 的连接。
它是中西文化的交流点,是古今哲理的结晶。
a , . \" \", . , .A , , , ; , , , 's a ., , , 's a . \", , \", a \" \"; , , a ; 's , ; \"\", a \"\" . , .目录1. 前言......................................................................................... 错误!未指定书签。
2. 功能描述................................................................................. 错误!未指定书签。
3. 总体设计................................................................................. 错误!未指定书签。
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语言五子棋(字符版+AI)
for (qi=1;qipan[playx][playy+qi]!=qizi&&qi<5;qi++)
{
if (qipan[playx][playy+qi]==qz)qh2++;
if (qipan[playx][playy+qi]!='*'&&qipan[playx][playy+qi]!='#')space2++;
{
qipan[playx+qp2+1][playy+qp2+1]=qizi;
stop=true;
return true;
}
}
}
if (stop==false )
{
for (qi=1;qipan[playx+qi][playy-qi]==qz;qi++)
for (qi=1;qipan[playx+qi][playy+qi]==qz;qi++)
qp2++;
if (qp1+qp2+1>=3)//左斜挡棋
{
if (qipan[playx-qp1-1][playy-qp1-1]!='*'&&qipan[playx-qp1-1][playy-qp1-1]!='#'&&(playx-qp1-1>0&&playx-qp1-1<=15)&&(playy-qp1-1>0&&playy-qp1-1<=15))
C语言游戏2-五子棋(人机对战)
一、开始工作
新建工程,选 MFC AppWizard(exe),添上工程名,确定。
选基于对话框,完成,确定。
插入位图 网上的源码一般都是将棋盘和棋子用画图程序画出来,但我不会弄。我的方法是直接贴图。 先插入位图(BMP 格式),以下是我用的位图,当然你也可以用自己的位图:
插入位图流程:
有时会弹出下面这个窗口,这是完全没有问题的: 位图插入后会自动赋予 ID 值,我们可以修改一下:
pDC 是显示图片窗口的句柄
我的画图函数是下面这样的,其中要注意两个函数 BitBlt 和 TransparentBlt,程序后有解释: void CMyDlg::Draw(int x, int y, UINT bitmap, CDC *pDC) {
//装载图片 CBitmap m_bmp; m_bmp.LoadBitmap(bitmap); //创建画布,比如要在窗口显示,则 pDC 为窗口句柄 CDC dc; dc.CreateCompatibleDC(pDC); //将位图选到 dc 中,顺便保存画刷到 pOldbmp //保存画刷、恢复画刷为规范操作,但可以不用 CBitmap *pOldbmp=dc.SelectObject(&m_bmp); //创建 bm,用来获取图片信息,这里是为了获取图片尺寸 BITMAP bm; m_bmp.GetObject(sizeof(BITMAP),&bm); //画图 if(IDB_BOARD==bitmap)//画棋盘
调整一下界面,希望你没有强迫症,可不要在调整上花太多时间了。下面是我做出的效果:
三、下棋
现在要将棋子准确下到各个点上,我用的棋盘,间距为 34,点击鼠标时获取点击坐标 x,y, 然后 x/34,y/34,确定棋子下到了哪个点上。
五子棋游戏 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;}。
C语言课程设计实验报告
实验报告课程名称:C语言课程设计实验项目:五子棋游戏设计专业班级:计专1502姓名:孙奇学号:248150203 实验室号:实验组号:实验时间:批阅时间:指导教师:成绩:沈阳工业大学实验报告(适用计算机程序设计类)专业班级:计专1502 学号:248150203 姓名:孙奇实验名称:五子棋游戏设计4.程序运行结果(1)规则界面(2)对弈界面(3)获胜界面5.出现的问题及解决方法(1)游戏开始时,棋子原来初始在棋盘中央,一旦中央落子后,初始棋子与已有棋子重叠,为了解决问题将初始棋子移动到棋盘左上方棋盘以外。
(2)棋子都为空心圆,在棋盘不好区分正在控制的棋子,改为已确定落子的棋子为实心圆,正在控制的棋子为空心圆。
附件A 沈阳工业大学实验报告(适用计算机程序设计类)专业班级:计专1502 学号:248150203 姓名:孙奇实验程序:本程序在Windows XP SP3操作系统及Turbo C 2.0开发环境下调试通过。
#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>int judgeresult(int x,int y);void attention(){char ch;window(1,1,80,25);textbackground(LIGHTBLUE);textcolor(YELLOW);clrscr();gotoxy(15,4);printf("Play Rules:");gotoxy(15,8);printf("1.Press Left,Right,Up,Down Key to move Piece");gotoxy(15,12);printf("2.Press Space to place the Piece");gotoxy(15,16);printf("3.DO NOT press Space outside of the chessboard");gotoxy(15,20);printf("Do you accept the above Playing Rules? [Y/N]:");while(1){printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit.");for(x1=1,y1=1,y2=18;x1<=18;x1++)line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI);for(x1=1,y1=1,x2=18;y1<=18;y1++)line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI);for(x1=1;x1<=18;x1++)for(y1=1;y1<=18;y1++)box[x1][y1]=0;}void draw_circle(int x,int y,int color){setcolor(color);setlinestyle(SOLID_LINE,0,1);x=(x+JZ)*BILI;y=(y+JS)*BILI;circle(x,y,8);}void draw_slice(int x,int y,int color){for(i=step_x-1,j=step_y;i>=1;i--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;}if (i<1) break;step_x=i;judgewho(step_x,step_y);break;}case RIGHT:if(step_x+1>18)break;else{for(i=step_x+1,j=step_y;i<=18;i++)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;if((step_y-1)<0)break;else{for(i=step_x,j=step_y-1;j>=1;j--)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLUE);break;}if(j<1)break;step_y=j;judgewho(step_x,step_y);break;}case ESC :break;case SPACE :if(step_x>=1 && step_x<=18 && step_y>=1 && step_y<=18) {if(box[step_x][step_y]==0)setcolor(YELLOW);rectangle(0,0,439,279);floodfill(50,50,14);setcolor(12);settextstyle(1,0,5);outtextxy(20,20,"The Black Win !");setcolor(14);settextstyle(3,0,5);outtextxy(120,120,"The Black Win !");setcolor(14);settextstyle(2,0,8);getch();closegraph();exit(0);}if(flag==2){setbkcolor(BLUE);cleardevice();setviewport(100,100,540,380,1);}}void change(){if(flag==1)flag=2;elseflag=1;}void judgewho(int x,int y){if(flag==1)draw_circle(x,y,BLUE);if(flag==2)draw_circle(x,y,WHITE); }int judgeresult(int x,int y){break;}if(n1+n2-1>=5){return(1);break;}/*垂直向上数*/n1=0;n2=0;for(j=x,k=y;k>=1;k--){if(box[j][k]==flag)n1++;elsebreak;}/*垂直向下数break;}/*向右下方数*/for(j=x,k=y;j<=18,k<=18;j++,k++) {if(box[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);break;}/*向右上方数*/n1=0;return(0);break;}}void main(){int gdriver=VGA,gmode=VGAHI;clrscr();attention();initgraph(&gdriver,&gmode,"c:\\tc\\bgi"); flag=1;draw_box();do{step_x=0;step_y=0;judgewho(step_x-1,step_y-1);do{while(bioskey(1)==0);。
C语言游戏代码(里面揽括扫雷_俄罗斯方块_推箱子_五子棋_贪吃蛇)
五子棋#include <stdio.h>#include <bios.h>#include <ctype.h>#include <conio.h>#include <dos.h>#define CROSSRU 0xbf /*右上角点*/#define CROSSLU 0xda /*左上角点*/#define CROSSLD 0xc0 /*左下角点*/#define CROSSRD 0xd9 /*右下角点*/#define CROSSL 0xc3 /*左边*/#define CROSSR 0xb4 /*右边*/#define CROSSU 0xc2 /*上边*/#define CROSSD 0xc1 /*下边*/#define CROSS 0xc5 /*十字交叉点*//*定义棋盘左上角点在屏幕上的位置*/#define MAPXOFT 5#define MAPYOFT 2/*定义1号玩家的操作键键码*/#define PLAY1UP 0x1157/*上移--'W'*/#define PLAY1DOWN 0x1f53/*下移--'S'*/#define PLAY1LEFT 0x1e41/*左移--'A'*/#define PLAY1RIGHT 0x2044/*右移--'D'*/#define PLAY1DO 0x3920/*落子--空格键*//*定义2号玩家的操作键键码*/#define PLAY2UP 0x4800/*上移--方向键up*/#define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/#define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*//*若想在游戏中途退出, 可按Esc 键*/#define ESCAPE 0x011b/*定义棋盘上交叉点的状态, 即该点有无棋子*//*若有棋子, 还应能指出是哪个玩家的棋子*/#define CHESSNULL 0 /*没有棋子*/#define CHESS1 'O'/*一号玩家的棋子*/#define CHESS2 'X'/*二号玩家的棋子*//*定义按键类别*/#define KEYEXIT 0/*退出键*/#define KEYFALLCHESS 1/*落子键*/#define KEYMOVECURSOR 2/*光标移动键*/#define KEYINV ALID 3/*无效键*//*定义符号常量: 真, 假--- 真为1, 假为0 */#define TRUE 1#define FALSE 0/**********************************************************/ /* 定义数据结构*//*棋盘交叉点坐标的数据结构*/struct point{int x,y;};/**********************************************************/ /*自定义函数原型说明*/void Init(void);int GetKey(void);int CheckKey(int press);int ChangeOrder(void);int ChessGo(int Order,struct point Cursor);void DoError(void);void DoOK(void);void DoWin(int Order);void MoveCursor(int Order,int press);void DrawCross(int x,int y);void DrawMap(void);int JudgeWin(int Order,struct point Cursor);int JudgeWinLine(int Order,struct point Cursor,int direction);void ShowOrderMsg(int Order);void EndGame(void);/**********************************************************//**********************************************************/ /* 定义全局变量*/int gPlayOrder; /*指示当前行棋方*/struct point gCursor; /*光标在棋盘上的位置*/char gChessBoard[19][19];/*用于记录棋盘上各点的状态*//**********************************************************//**********************************************************/ /*主函数*/void main(){int press;int bOutWhile=FALSE;/*退出循环标志*/printf("Welcome ");Init();/*初始化图象,数据*/while(1){press=GetKey();/*获取用户的按键值*/switch(CheckKey(press))/*判断按键类别*/{/*是退出键*/case KEYEXIT:clrscr();/*清屏*/bOutWhile = TRUE;break;/*是落子键*/case KEYFALLCHESS:if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/DoError();/*落子错误*/else{DoOK();/*落子正确*//*如果当前行棋方赢棋*/if(JudgeWin(gPlayOrder,gCursor)==TRUE){DoWin(gPlayOrder);bOutWhile = TRUE;/*退出循环标志置为真*/}/*否则*/else/*交换行棋方*/ChangeOrder();ShowOrderMsg(gPlayOrder);}break;/*是光标移动键*/case KEYMOVECURSOR:MoveCursor(gPlayOrder,press);break;/*是无效键*/case KEYINV ALID:break;}if(bOutWhile==TRUE)break;}/*游戏结束*/EndGame();}/**********************************************************//*界面初始化,数据初始化*/void Init(void){int i,j;char *Msg[]={"Player1 key:"," UP----w"," DOWN--s"," LEFT--a"," RIGHT-d"," DO----space","","Player2 key:"," UP----up"," DOWN--down"," LEFT--left"," RIGHT-right"," DO----ENTER","","exit game:"," ESC",NULL,/* 先手方为1号玩家*/gPlayOrder = CHESS1;/* 棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/ for(i=0;i<19;i++)for(j=0;j<19;j++)gChessBoard[i][j]=CHESSNULL;/*光标初始位置*/gCursor.x=gCursor.y=0;/*画棋盘*/textmode(C40);DrawMap();/*显示操作键说明*/i=0;textcolor(BROWN);while(Msg[i]!=NULL){gotoxy(25,3+i);cputs(Msg[i]);i++;}/*显示当前行棋方*/ShowOrderMsg(gPlayOrder);/*光标移至棋盘的左上角点处*/gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);}/*画棋盘*/void DrawMap(void){int i,j;clrscr();for(i=0;i<19;i++)for(j=0;j<19;j++)DrawCross(i,j);}/*画棋盘上的交叉点*/void DrawCross(int x,int y){gotoxy(x+MAPXOFT,y+MAPYOFT); /*交叉点上是一号玩家的棋子*/if(gChessBoard[x][y]==CHESS1) {textcolor(LIGHTBLUE);putch(CHESS1);return;}/*交叉点上是二号玩家的棋子*/if(gChessBoard[x][y]==CHESS2) {textcolor(LIGHTBLUE);putch(CHESS2);return;}textcolor(GREEN);/*左上角交叉点*/if(x==0&&y==0){putch(CROSSLU);return;}/*左下角交叉点*/if(x==0&&y==18){putch(CROSSLD);return;}/*右上角交叉点*/if(x==18&&y==0){putch(CROSSRU);return;}/*右下角交叉点*/if(x==18&&y==18){putch(CROSSRD); return;}/*左边界交叉点*/if(x==0){putch(CROSSL); return;}/*右边界交叉点*/if(x==18){putch(CROSSR); return;}/*上边界交叉点*/if(y==0){putch(CROSSU); return;}/*下边界交叉点*/if(y==18){putch(CROSSD); return;}/*棋盘中间的交叉点*/ putch(CROSS);}/*交换行棋方*/int ChangeOrder(void) {if(gPlayOrder==CHESS1) gPlayOrder=CHESS2; elsegPlayOrder=CHESS1;return(gPlayOrder);}/*获取按键值*/int GetKey(void){char lowbyte;int press;while (bioskey(1) == 0);/*如果用户没有按键,空循环*/press=bioskey(0);lowbyte=press&0xff;press=press&0xff00 + toupper(lowbyte); return(press);}/*落子错误处理*/void DoError(void){sound(1200);delay(50);nosound();}/*赢棋处理*/void DoWin(int Order){sound(1500);delay(100);sound(0); delay(50);sound(800); delay(100);sound(0); delay(50);sound(1500);delay(100);sound(0); delay(50);sound(800); delay(100);sound(0); delay(50);nosound();textcolor(RED+BLINK);gotoxy(25,20);if(Order==CHESS1)cputs("PLAYER1 WIN!");elsecputs("PLAYER2 WIN!");gotoxy(25,21);cputs(" \\<^+^>/");getch();}/*走棋*/int ChessGo(int Order,struct point Cursor){/*判断交叉点上有无棋子*/if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL){/*若没有棋子, 则可以落子*/gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); textcolor(LIGHTBLUE);putch(Order);gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); gChessBoard[Cursor.x][Cursor.y]=Order;return TRUE;}elsereturn FALSE;}/*判断当前行棋方落子后是否赢棋*/int JudgeWin(int Order,struct point Cursor){int i;for(i=0;i<4;i++)/*判断在指定方向上是否有连续5个行棋方的棋子*/if(JudgeWinLine(Order,Cursor,i))return TRUE;return FALSE;}/*判断在指定方向上是否有连续5个行棋方的棋子*/int JudgeWinLine(int Order,struct point Cursor,int direction) {int i;struct point pos,dpos;const int testnum = 5;int count;switch(direction){case 0:/*在水平方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y;dpos.x=1;dpos.y=0;break;case 1:/*在垂直方向*/pos.x=Cursor.x;pos.y=Cursor.y-(testnum-1);dpos.x=0;dpos.y=1;break;case 2:/*在左下至右上的斜方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y+(testnum-1);dpos.x=1;dpos.y=-1;break;case 3:/*在左上至右下的斜方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y-(testnum-1);dpos.x=1;dpos.y=1;break;}count=0;for(i=0;i<testnum*2+1;i++)/*????????i<testnum*2-1*/ {if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18) {if(gChessBoard[pos.x][pos.y]==Order){count++;if(count>=testnum)return TRUE;}elsecount=0;}pos.x+=dpos.x;pos.y+=dpos.y;}return FALSE;}/*移动光标*/void MoveCursor(int Order,int press) {switch(press){case PLAY1UP:if(Order==CHESS1&&gCursor.y>0) gCursor.y--;break;case PLAY1DOWN:if(Order==CHESS1&&gCursor.y<18) gCursor.y++;break;case PLAY1LEFT:if(Order==CHESS1&&gCursor.x>0) gCursor.x--;break;case PLAY1RIGHT:if(Order==CHESS1&&gCursor.x<18) gCursor.x++;break;case PLAY2UP:if(Order==CHESS2&&gCursor.y>0) gCursor.y--;break;case PLAY2DOWN:if(Order==CHESS2&&gCursor.y<18) gCursor.y++;break;case PLAY2LEFT:if(Order==CHESS2&&gCursor.x>0) gCursor.x--;break;case PLAY2RIGHT:if(Order==CHESS2&&gCursor.x<18) gCursor.x++;break;}gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }/*游戏结束处理*/void EndGame(void){textmode(C80);}/*显示当前行棋方*/void ShowOrderMsg(int Order){gotoxy(6,MAPYOFT+20);textcolor(LIGHTRED);if(Order==CHESS1)cputs("Player1 go!");elsecputs("Player2 go!");gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); }/*落子正确处理*/void DoOK(void){sound(500);delay(70);sound(600);delay(50);sound(1000);delay(100);nosound();}/*检查用户的按键类别*/int CheckKey(int press){if(press==ESCAPE)return KEYEXIT;/*是退出键*/elseif( ( press==PLAY1DO && gPlayOrder==CHESS1) || ( press==PLAY2DO && gPlayOrder==CHESS2))return KEYFALLCHESS;/*是落子键*/elseif( press==PLAY1UP || press==PLAY1DOWN || press==PLAY1LEFT || press==PLAY1RIGHT || press==PLAY2UP || press==PLAY2DOWN ||press==PLAY2LEFT || press==PLAY2RIGHT)return KEYMOVECURSOR;/*是光标移动键*/elsereturn KEYINV ALID;/*按键无效*/}贪吃蛇#define N 200#include <graphics.h>#include <stdlib.h>#include <dos.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/ struct Food{int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/struct Snake{int x[N];int y[N];int node;/*蛇的节数*/int direction;/*蛇移动方向*/int life;/* 蛇的生命,0活着,1死亡*/}snake;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/void PrScore(void);/*输出成绩*//*主函数*/void main(void){Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/}/*图形驱动*/void Init(void){int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc");cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){/*setbkcolor(LIGHTGREEN);*/setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i<=600;i+=10)/*画围墙*/{rectangle(i,40,i+10,49); /*上边*/rectangle(i,451,i+10,460);/*下边*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边*/rectangle(601,i,610,i+10);/*右边*/}}/*玩游戏具体过程*/void GamePlay(void){randomize();/*随机数发生器*/food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/snake.life=0;/*活着*/snake.direction=1;/*方向往右*/snake.x[0]=100;snake.y[0]=100;/*蛇头*/snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/PrScore();/*输出得分*/while(1)/*可以重复玩游戏,压ESC键结束*/{while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/{if(food.yes==1)/*需要出现新食物*/{food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*画面上有食物了*/}if(food.yes==0)/*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);}for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;}for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){GameOver();/*显示失败*/snake.life=1;break;}}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墙壁*/{GameOver();/*本次游戏结束*/snake.life=1; /*蛇死*/}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/{setcolor(0);/*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/snake.node++;/*蛇的身体长一节*/food.yes=1;/*画面上需要出现新的食物*/score+=10;PrScore();/*输出新得分*/}setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;elseif(key==UP&&snake.direction!=4)/*判断是否往相反的方向移动*/snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)snake.direction=1;elseif(key==LEFT&&snake.direction!=1)snake.direction=2;elseif(key==DOWN&&snake.direction!=3)snake.direction=4;}/*endwhile(1)*/}/*游戏结束*/void GameOver(void){cleardevice();PrScore();setcolor(RED);settextstyle(0,0,4);outtextxy(200,200,"GAME OVER");getch();}/*输出成绩*/void PrScore(void){char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,"score:%d",score);outtextxy(55,20,str);}/*图形结束*/void Close(void){getch();closegraph();}扫雷游戏/*模拟扫雷游戏*/#include <graphics.h>#include <math.h>#include <stdio.h>#include <dos.h>#include <stdlib.h>#include <conio.h>#include <alloc.h>union REGS regs;int size=15;/*用于表示每个方块的大小(正方形的边长)*/int pix,piy=50;/*pix,piy是矩阵的偏移量*/char b[2]="1";/*用于显示方格周围的雷的个数*/int pan[30][16];/*用于记录盘面的情况:0:没有、9:有雷、1~8:周围雷的个数*/int pan1[30][16];/*pan1[][]纪录当前的挖雷情况,0:没有操作、1:打开了、2:标记了*/int tt;/*纪录时间参数*/int Eflags;/*用于标记鼠标按钮的有效性,0:有效,1:无效,2:这是鼠标的任意键等于重新开始*/int Msinit();void Draw(int x,int y,int sizex,int sizey);void Facedraw(int x,int y,int sizel,int k);void Dead(int sizel,int x,int y);void Setmouse(int xmax,int ymax,int x,int y);int Msread(int *xp,int *yp,int *bup,struct time t1,int k);void Draw1(int x,int y);int Open(int x,int y);float Random();void Have(int sum,int x,int y,int xx,int yy);void Help();void Coread();void Ddraw2(int x,int y);/*下面是主函数*/main(){int mode=VGAHI,devices=VGA;/*图形模式初始化的变量*/char ams; /*鼠标操作中的标志变量*/int xms,yms,bms; /*鼠标的状态变量*/int i,j,k,k1=0; /*i,j,k是循环变量*/int x=9,y=9,flags=0; /*x,y矩阵的大小*/int sum=10; /*sum 盘面的雷的总数目,是个x,y的函数*/int x1=0,y1=0; /*用于记录光标当前的位置*/int x11=0,y11=0; /*暂时保存鼠标位置的值*/int sizel=10; /*脸的大小*/int cflags=1; /*这是菜单操作标志变量,没有弹出1,弹出0*/struct time t1={0,0,0,0}; /*时间结构体,头文件已定义*/int co[3]; /*暂时纪录历史纪录*/void far *Map; /*用于保存鼠标图片*/char name[3][20]; /*名字字符串,用于记录名字*/FILE * p; /*文件指针用于文件操作*/Msinit(); /*鼠标初始化*//*registerbgidriver(EGA VGA_driver);*/initgraph(&devices,&mode,"C:\\tc"); /*图形模式初始化*//*为图片指针分配内存*/if((Map=farmalloc(imagesize(0,0,20,20)))==NULL)/*图片的大小是20*20*/{printf("Memory ererr!\n");printf("Press any key to out!\n");exit(1);}/*用于检验文件是否完整*/while((p = fopen("score.dat", "r")) == NULL) /*如果不能打开就新建一个*/{if((p = fopen("score.dat", "w")) == NULL)/*如果不能新建就提示错误并推出*/{printf("The file cannot open!\n");printf("Presss any key to exit!\n");getch();exit(1);}/*写入初始内容*/fprintf(p,"%d %d %d,%s\n%s\n%s\n",999,999,999,"xiajia","xiajia","xiajia");fclose(p);}/*暂时读出历史纪录。
c语言课程设计五子棋
c语言课程设计五子棋一、教学目标本章节的教学目标是使学生掌握C语言编程基础,学会使用C语言编写简单的五子棋游戏。
具体目标如下:1.知识目标:–了解C语言的基本语法和数据类型。
–掌握函数的定义和调用。
–理解指针的概念和使用方法。
–学习结构体的定义和运用。
2.技能目标:–能够使用C语言编写简单的程序。
–学会使用C语言进行基本的输入输出操作。
–掌握使用C语言进行条件判断和循环控制。
–能够使用C语言实现五子棋游戏的逻辑和规则。
3.情感态度价值观目标:–培养学生的编程兴趣和自信心。
–培养学生解决问题的能力和创新思维。
–培养学生的团队合作意识和沟通能力。
二、教学内容本章节的教学内容主要包括C语言的基本语法、数据类型、函数、指针、结构体等。
具体内容如下:1.C语言的基本语法和数据类型。
–变量的声明和赋值。
–控制语句的使用,如if、for、while等。
–数组的声明和使用。
2.函数的定义和调用。
–函数的声明和定义。
–函数的参数传递和返回值。
–函数的调用和调用方式。
3.指针的概念和使用方法。
–指针的声明和赋值。
–指针的解引用和取地址。
–指针与数组的关系。
4.结构体的定义和运用。
–结构体的声明和定义。
–结构体的成员访问和操作。
–结构体的数组和指针。
5.五子棋游戏的逻辑和规则实现。
–棋盘的表示和初始化。
–玩家输入和棋子放置。
–判断胜利条件和游戏结束。
三、教学方法本章节的教学方法采用讲授法、讨论法、实验法相结合的方式。
具体方法如下:1.讲授法:通过讲解和示例,使学生掌握C语言的基本语法和数据类型。
2.讨论法:通过小组讨论和问题解答,帮助学生理解函数、指针和结构体的概念。
3.实验法:通过编写五子棋游戏程序,让学生动手实践,巩固所学知识。
四、教学资源本章节的教学资源包括教材、参考书、多媒体资料和实验设备。
具体资源如下:1.教材:选用《C程序设计语言》作为主教材,辅助以《C语言编程实例解析》等参考书。
2.多媒体资料:提供C语言编程的教学视频和PPT课件,帮助学生更好地理解知识点。
五子棋双人对战C语言代码
五子棋双人对战C语言编程如何实现组成:二维数组:board[ROW][COL],定义一个ROW*COL的棋盘。
主要逻辑:显示棋盘,提示用户下子,下子后判断,1.显示棋盘很简单,慢慢凑棋盘就好2. 用户下子,注意两个条件:棋子在棋盘里,下子位置未被占用。
3.判断是最难的,方法:从下子位置的8个方向(上,下,左,右,右上,右下,左上,左下)计算相同棋子数目,然后将对角的棋子数相加,等于5说明有5子连线主要函数中用到三个主要实现函数:Showboard(board, ROW, COL);//展示棋盘Playermove(board, ROW, COL, cur);//玩家下注,cur表示哪个玩家下子Judge(board, ROW, COL);//判断5子连线Getcount(board[][COL], row, col, dir)//计算方向dir相同棋子数1234代码头文件#ifndef __FIVECHREE_H__#define __FIVECHREE_H__#include<stdio.h>#include<windows.h>#pragma warning(disable:4996)#define ROW 10//棋盘行数#define COL 10//棋盘列数#define INIT '*'//棋盘初始化#define PLAYER1 1#define PLAYER2 2#define NEXT 3//继续往下下#define DRAW 4//棋盘下满平局//8个方向#define UP 10#define RIGHT_UP 11#define RIGHT 12#define RIGHT_DOWN 13#define DOWN 14#define LEFT_DOWN 15#define LEFT 16#define LEFT_UP 17extern void Menu();extern void Game();#endif123456789101112131415161718192021222324252728293031main函数源文件#include"fivechree.h"int main(){int quit = 0;while (!quit){Menu();int select = 0;scanf("%d", &select);switch (select){case 1:Game();break;case 2:quit = 1;break;default:printf("Enter Error!\n");break;}}printf("Byebye\n");system("pause");return 0;}123456789101113141516171819202122232425函数定义源文件#include"fivechree.h"static int x = 0;static int y = 0;void Menu(){printf("+---------------------+\n");printf("+- 1.Play 2.Exit -+\n");printf("+---------------------+\n");printf("Please Enter Your Select#");}static void Showboard(int board[][COL], int row, int col){//展示棋盘o玩家1棋子,x玩家2棋子system("cls");for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){switch (board[i][j]){case PLAYER1:board[i][j] = 'o';break;case PLAYER2:board[i][j] = 'x';break;case 0:board[i][j] = INIT;break;default:break;}}}printf(" ");for (int i =1; i <= row; i++){printf("%2d ", i);}printf("\n");for (int i = 1; i <= row; i++){printf("%-2d", i);for (int j = 1; j <= col; j++){printf(" %c ", board[i - 1][j - 1]);}printf("\n");}}static void Playermove(int board[][COL], int row, int col, int who){//玩家下子,who 为哪个玩家下子while (1){printf("Please Enter PLAYER%d Postion<x,y>#", who);scanf("%d %d", &x, &y);if (x<1 || x>row || y<1 || y>col){ //超过棋盘范围printf("Postion is error!\n");continue;}if (board[x - 1][y - 1] == INIT){//判断位置是否已被下子board[x - 1][y - 1] = who;break;}printf("Postion is not empty\n");}}static int Getcount(int board[][COL], int row, int col, int dir){//判断8个方向相同棋子的数目int _x = x;//_x,_y变化,后面与x,y棋子相比较int _y = y;int count = 0;while (1){switch (dir){case UP:_x--;break;case DOWN:_x++;break;case LEFT:_y--;break;case RIGHT:_y++;break;case RIGHT_UP:_x--, _y++;break;case RIGHT_DOWN:_x++, _y++;break;case LEFT_DOWN:_x++, _y--;break;case LEFT_UP:_x--, _y--;break;default:break;}if (_x>=1 || _x<=row || _y>=1 || _y<=col){//棋子不能越界if (board[x-1][y-1] == board[_x-1][_y-1]){//printf("yes\n");count++;}else{//printf("no\n");break;}}else{return count;}}return count;}//如何判断:从下子位置的8个方向(上,下,左,右,右上,右下,左上,左下) //计算相同棋子数目,然后将对角的棋子数相加,等于5说明有5子连线static int Judge(int board[][COL], int row, int col){ int count1 = Getcount(board, row, col, UP)\+ Getcount(board, row, col, DOWN);//printf("%d\n", count1);if (count1 >= 4){return board[x-1][y-1];}count1 = Getcount(board, row, col, RIGHT_UP)\ + Getcount(board, row, col, LEFT_DOWN);//printf("%d\n", count1);if (count1 >= 4){return board[x-1][y-1];}count1 = Getcount(board, row, col, RIGHT)\+ Getcount(board, row, col, LEFT);//printf("%d\n", count1);if (count1 >= 4){return board[x-1][y-1];}count1 = Getcount(board, row, col, RIGHT_DOWN)\ + Getcount(board, row, col, LEFT_UP);if (count1 >= 4){return board[x-1][y-1];}for (int i = 0; i < row; i++){//判断棋盘是否下满for (int j = 0; j < col; j++){if (board[i][j] == INIT){return NEXT;}}}return DRAW;}void Game(){int board[ROW][COL] = { 0 };//memset(board, INIT, ROW*COL);int result = 0;int cur = PLAYER1;Showboard(board, ROW, COL);//先展示棋盘while (1){//Showboard(board, ROW, COL);Playermove(board, ROW, COL, cur);Showboard(board, ROW, COL);//棋盘将board数组变化,所以要在判断前将数组变化result = Judge(board, ROW, COL);if (result != NEXT){break;}cur = (cur == PLAYER1 ? PLAYER2 : PLAYER1);//三目表达式,注意不是PLAYER1 ? PLAYER2 : PLAYER1}Showboard(board, ROW, COL);switch (result){case 'o':printf("Player1 Win!\n");break;case 'x':printf("Player2 Win!\n");break;case DRAW:printf("Tie Game!\n");break;default://printf("%c\n", result);printf("BUG\n");break;}}。
c语言简易五子棋cmd程序代码
p=0;
}
}
p=0;
k=panding(i,j,h,s);/*判定*//*用上面定义的panding()判定这个子是否与其他子相连大于等于5个*/
}
while(b==2&&k==0)/*白棋步骤与黑棋类似*/
char h=2,w=1;/*用于上面panding()函数的输入,在上一个函数最后需要输入来判定胜利的是黑子还是白子*/
while(i<25)/*将横向数组用‘+’和‘ ’间隔表示*/
{
while(j<=50)
{
s[i][j]='+';/*将可以下子的位置显示为‘+’方便计算和观察*/
while(b==1&&k==0)/*在黑子步骤且无人胜利的情况下进行黑子步骤*/
{
printf("请下黑棋\n");
while(p==0)/*下子之前计算好输入值如实际值的对应,这里用循环是需要判定输入的坐标是否符合要求,如不符合则循环输入直到符合为止*/
{
while(p=;p);
if(p==1)
{
k=0;
b=1;
p=1;
i=0;
j=0;
while(i<25)
{
{
printf("请下白棋\n");
while(p==0)
{
scanf("%d%d",&j,&i);
if(s[24-i][j*2]=='+'&&i>0&&i<25&&j>0&&j<25)
五子棋源代码(C++),完美版
#include <iostream>#include <conio.h>using namespace std;#define WIDE_AND_LONG 20 //棋盘的长和宽#define NAME_LEN 20 //输入姓名的长度typedef class Gobang{public:int InitPlayerName(char *, char *);int CheckInput(char,int);int CheckIndexInput(char, char, char);int GetPlayerName();int InitBoard();int WriteBoard(char, char, bool);int BeginOrNot();int CheckRow();int CheckColumn();int CheckTopLeft();int CheckTopRight();int CheckDownLeft();int CheckDownRight();int CheckDraw();int CheckFinish();int Chess();int ShowBoard();private:char acBoard[WIDE_AND_LONG][WIDE_AND_LONG];char acPlayerOneName[NAME_LEN];char acPlayerTwoName[NAME_LEN];}GOBANG;//初始化姓名的缺省值int GOBANG::InitPlayerName(char *pPlayerOne,char *pPlayerTwo) {strcpy(acPlayerOneName,pPlayerOne);strcpy(acPlayerTwoName,pPlayerTwo);return 0;}//检查输入姓名时是否含非法字符空格和Tab键int GOBANG::CheckInput(char ch, int iNameLen){if(' ' == ch || '\t' == ch){cout<<"含有非法字符!"<<endl;return -1;}if(iNameLen > NAME_LEN - 1){cout<<"输入超出限定长度!"<<endl;return -1;}return 0;}//将棋子放到棋盘中int GOBANG::WriteBoard(char cRow, char cColumn, bool bJudge){int iRow = 0;int iColumn = 0;if(cRow >= '0' && cRow <= '9'){iRow = static_cast<int>(cRow - '0');}else if(cRow >= 'A' && cRow <= static_cast<char>('A' + WIDE_AND_LONG - 10 - 1)){iRow = static_cast<int>((cRow - 'A') + 10);}else{iRow = static_cast<int>((cRow - 'a') + 10);}if(cColumn >= '0' && cColumn <= '9'){iColumn = static_cast<int>(cColumn - '0');}else if(cColumn >= 'A' && cColumn <= static_cast<char>('A' + WIDE_AND_LONG - 10 - 1)) {iColumn = static_cast<int>((cColumn - 'A') + 10);}else{iColumn = static_cast<int>((cColumn - 'a') + 10);}if('+' != acBoard[iRow][iColumn]){cout<<"此处已有棋子!"<<endl;return -1;}if(!bJudge){acBoard[iRow][iColumn] = static_cast<char>(1);}else{acBoard[iRow][iColumn] = static_cast<char>(2);}return 0;}//检查坐标输入是否合法int GOBANG::CheckIndexInput(char cRow,char cSeparator,char cColumn){if(!cRow || !cSeparator || !cColumn){return -1;}if(!((cRow >= '0' && cRow <= '9') || \(cRow >= 'A' && cRow <= static_cast<char>('A' + WIDE_AND_LONG - 10 - 1)) || \ (cRow >= 'a' && cRow <= static_cast<char>('a' + WIDE_AND_LONG - 10 - 1)))){return -1;}if(' ' != cSeparator && '\t' != cSeparator && ',' != cSeparator){return -1;}if(!((cColumn >= '0' && cColumn <= '9') || \(cColumn >= 'A' && cColumn <= static_cast<char>('A' + WIDE_AND_LONG - 10 - 1)) || \ (cColumn >= 'a' && cColumn <= static_cast<char>('a' + WIDE_AND_LONG - 10 - 1)))){return -1;}return 0;}//获取玩家的昵称int GOBANG::GetPlayerName(){fflush(stdin);char cTemp = 0;int iNameLen = 0;cout<<"是否自己定义昵称?是(Y),否(任意键):";cTemp = getch();cout<<endl;if(('y' != cTemp) && ('Y' != cTemp)){return 0;}fflush(stdin);memset(acPlayerOneName,0,sizeof(acPlayerOneName)); memset(acPlayerTwoName,0,sizeof(acPlayerTwoName)); cout<<"请玩家一输入昵称:";while('\n' != (cTemp = getchar())){if(-1 == CheckInput(cTemp,iNameLen)){fflush(stdin);cout<<"请玩家一输入昵称:";continue;}acPlayerOneName[iNameLen] = cTemp;iNameLen++;}if(0 == iNameLen){strcpy(acPlayerOneName,"玩家一");}iNameLen = 0;fflush(stdin);cout<<"请玩家二输入昵称:";while('\n' != (cTemp = getchar())){if(-1 == CheckInput(cTemp,iNameLen)){fflush(stdin);cout<<"请玩家二输入昵称:";continue;}acPlayerTwoName[iNameLen] = cTemp;iNameLen++;}if(0 == iNameLen){strcpy(acPlayerTwoName,"玩家一");}return 0;}//初始化棋盘int GOBANG::InitBoard(){int iRow = 0;int iColumn = 0;for(iRow = 0; iRow < WIDE_AND_LONG; iRow++){for(iColumn = 0; iColumn < WIDE_AND_LONG; iColumn++) {acBoard[iRow][iColumn] = '+';}}return 0;}//检查棋盘横向是否存在五子连珠int GOBANG::CheckRow(){int iRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 0; iRow < WIDE_AND_LONG; iRow ++){while(iColumn < WIDE_AND_LONG){if(static_cast<char>(1) == acBoard[iRow][iColumn]){iPlayerOneLen ++;iPlayerTwoLen = 0;}else if(static_cast<char>(2) == acBoard[iRow][iColumn]){iPlayerTwoLen ++;iPlayerOneLen = 0;}else{iPlayerTwoLen = 0;iPlayerOneLen = 0;}iColumn ++;}if(iPlayerOneLen >= 5){return 1;if(iPlayerTwoLen >= 5){return 2;}iPlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = 0;}return 0;}//检查棋盘竖向是否存在五子连珠int GOBANG::CheckColumn(){int iRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iColumn = 0; iColumn < WIDE_AND_LONG; iColumn ++) {while(iRow < WIDE_AND_LONG){if(static_cast<char>(1) == acBoard[iRow][iColumn]){iPlayerOneLen ++;iPlayerTwoLen = 0;}else if(static_cast<char>(2) == acBoard[iRow][iColumn]){iPlayerTwoLen ++;iPlayerOneLen = 0;}else{iPlayerTwoLen = 0;iPlayerOneLen = 0;}iRow ++;}if(iPlayerOneLen >= 5){return 1;}if(iPlayerTwoLen >= 5)return 2;}iPlayerOneLen = 0;iPlayerTwoLen = 0;iRow = 0;}return 0;}//检查棋盘左上方(包括对角线)是否存在五子连珠int GOBANG::CheckTopLeft(){int iRow = 0;int iTempRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 4; iRow < WIDE_AND_LONG; iRow ++){iTempRow = iRow;while(iTempRow >= 0){if(static_cast<char>(1) == acBoard[iTempRow][iColumn]){iPlayerOneLen ++;iPlayerTwoLen = 0;if(iPlayerOneLen >= 5){return 1;}}else if(static_cast<char>(2) == acBoard[iTempRow][iColumn]) {iPlayerTwoLen ++;iPlayerOneLen = 0;if(iPlayerTwoLen >= 5){return 2;}}else{iPlayerTwoLen = 0;iPlayerOneLen = 0;iTempRow --;iColumn ++;}iPlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = 0;}return 0;}//检查棋盘右上方(包括对角线)是否存在五子连珠int GOBANG::CheckTopRight(){int iRow = 0;int iColumn = 0;int iTempColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iColumn = 0; iColumn < WIDE_AND_LONG - 4; iColumn ++) {iTempColumn = iColumn;while(iTempColumn < WIDE_AND_LONG){if(static_cast<char>(1) == acBoard[iRow][iTempColumn]){iPlayerOneLen ++;iPlayerTwoLen = 0;if(iPlayerOneLen >= 5){return 1;}}else if(static_cast<char>(2) == acBoard[iRow][iTempColumn]) {iPlayerTwoLen ++;iPlayerOneLen = 0;if(iPlayerTwoLen >= 5){return 2;}}else{iPlayerTwoLen = 0;iPlayerOneLen = 0;}iRow ++;iTempColumn ++;}iPlayerOneLen = 0;iPlayerTwoLen = 0;iRow = 0;}return 0;}//检查棋盘左下方(不包括对角线)是否存在五子连珠int GOBANG::CheckDownLeft(){int iRow = 0;int iTempRow = 0;int iColumn = 0;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 1; iRow < WIDE_AND_LONG - 4; iRow ++){iTempRow = iRow;while(iTempRow < WIDE_AND_LONG){if(static_cast<char>(1) == acBoard[iTempRow][iColumn]){iPlayerOneLen ++;iPlayerTwoLen = 0;if(iPlayerOneLen >= 5){return 1;}}else if(static_cast<char>(2) == acBoard[iTempRow][iColumn]) {iPlayerTwoLen ++;iPlayerOneLen = 0;if(iPlayerTwoLen >= 5){return 2;}}else{iPlayerTwoLen = 0;iPlayerOneLen = 0;}iTempRow ++;iColumn ++;}iPlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = 0;}return 0;}//检查棋盘右下方(不包括对角线)是否存在五子连珠int GOBANG::CheckDownRight(){int iRow = 0;int iTempRow = 0;int iColumn = WIDE_AND_LONG - 1;int iPlayerOneLen = 0;int iPlayerTwoLen = 0;for(iRow = 1; iRow < WIDE_AND_LONG - 4; iRow ++){iTempRow = iRow;while(iTempRow < WIDE_AND_LONG){if(static_cast<char>(1) == acBoard[iTempRow][iColumn]){iPlayerOneLen ++;iPlayerTwoLen = 0;if(iPlayerOneLen >= 5){return 1;}}else if(static_cast<char>(2) == acBoard[iTempRow][iColumn]) {iPlayerTwoLen ++;iPlayerOneLen = 0;if(iPlayerTwoLen >= 5){return 2;}}else{iPlayerTwoLen = 0;iPlayerOneLen = 0;}iTempRow ++;iColumn --;}iPlayerOneLen = 0;iPlayerTwoLen = 0;iColumn = WIDE_AND_LONG - 1;}return 0;}//检查是否平局int GOBANG::CheckDraw(){int iRow = 0;int iColumn = 0;for(iRow = 0; iRow < WIDE_AND_LONG; iRow++){for(iColumn = 0; iColumn < WIDE_AND_LONG; iColumn++) {if('+' == acBoard[iRow][iColumn]){return 1;}}}return 0;}//检查是否达到结束的条件(五子连珠或平局)int GOBANG::CheckFinish(){int iJudgeRow = 0;int iJudgeColumn = 0;int iJudgeTopLeft = 0;int iJudgeTopRight = 0;int iJudgeDownLeft = 0;int iJudgeDownRight = 0;int iJudgeDraw = 0;iJudgeRow = CheckRow();iJudgeColumn = CheckColumn();iJudgeTopLeft = CheckTopLeft();iJudgeTopRight = CheckTopRight();iJudgeDownLeft = CheckDownLeft();iJudgeDownRight = CheckDownRight();iJudgeDraw = CheckDraw();if(1 == iJudgeRow || 1 == iJudgeColumn || 1 == iJudgeTopLeft || \1 == iJudgeTopRight || 1 == iJudgeDownLeft || 1 == iJudgeDownRight) {cout<<"恭喜玩家<"<<acPlayerOneName<<">获胜!"<<endl;return 1;}if(2 == iJudgeRow || 2 == iJudgeColumn || 2 == iJudgeTopLeft || \2 == iJudgeTopRight || 2 == iJudgeDownLeft || 2 == iJudgeDownRight) {cout<<"恭喜玩家<"<<acPlayerTwoName<<">获胜!"<<endl;return 1;}if(0 == iJudgeDraw){cout<<"平局!"<<endl;return 1;}return 0;}//显示棋盘到控制台int GOBANG::ShowBoard(){int iRow = 0;int iColumn = 0;system("cls");cout<<" ";for(iRow = 0; iRow < WIDE_AND_LONG; iRow++){if(9 < iRow){cout<<static_cast<char>('A' + iRow - 10)<<" ";}else{cout<<iRow<<" ";}}cout<<endl;for(iRow = 0; iRow < WIDE_AND_LONG; iRow++){if(9 < iRow){cout<<static_cast<char>('A' + iRow - 10)<<" ";}else{cout<<iRow<<" ";}for(iColumn = 0; iColumn < WIDE_AND_LONG; iColumn++){cout<<acBoard[iRow][iColumn]<<' ';}cout<<endl;}return 0;}//开始下棋int GOBANG::Chess(){bool bJudge = false;while(1){char cRow = 0;char cSeparator = 0;char cColumn = 0;char cTemp = 0;int iLen =1;fflush(stdin);if(!bJudge){cout<<"请<"<<acPlayerOneName<<">输入对应的行和列(格式: a,3 或a 3 或a 3):"; }else{cout<<"请<"<<acPlayerTwoName<<">输入对应的行和列(格式: a,3 或a 3 或a 3):"; }while('\n' != (cTemp = getchar())){if(iLen > 3){cout<<"输入有误!"<<endl;fflush(stdin);if(!bJudge){cout<<"请<"<<acPlayerOneName<<">输入对应的行和列(格式: a,3 或a 3 或a 3):"; }else{cout<<"请<"<<acPlayerTwoName<<">输入对应的行和列(格式: a,3 或a 3 或a 3):"; }iLen = 1;continue;}if(1 == iLen){cRow = cTemp;}else if(2 == iLen){cSeparator = cTemp;}else{cColumn = cTemp;}iLen++;}if(-1 == CheckIndexInput(cRow,cSeparator,cColumn)){cout<<"输入有误!"<<endl;continue;}if(-1 == WriteBoard(cRow,cColumn,bJudge)){continue;}ShowBoard();if(1 == CheckFinish()){BeginOrNot();}bJudge = !bJudge;}return 0;}//判断游戏结束后玩家是否选择继续还是退出int GOBANG::BeginOrNot(){char cTemp = 0;cout<<"是否继续?是(Y),退出(任意键):"; fflush(stdin);cTemp = getch();if('y' == cTemp || 'Y' == cTemp){InitBoard();ShowBoard();Chess();}else{exit(0); //程序的出口}return 0;}int main(){GOBANG gobang;memset(&gobang,0,sizeof(GOBANG)); gobang.InitPlayerName("玩家一","玩家二"); gobang.GetPlayerName();gobang.InitBoard();gobang.ShowBoard();gobang.Chess();return 0;}。
五子棋游戏代码—C语言
C语言游戏之五子棋源代码#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define SPACE 0x3920#define BILI 20#define JZ 4#define JS 3#define N 19int box[N][N];int step_x,step_y ;int key ;int flag=1 ;void draw_box();void draw_cicle(int x,int y,int color); void change();void judgewho(int x,int y);void judgekey();int judgeresult(int x,int y);void attentoin();void attention(){char ch ;window(1,1,80,25);textbackground(LIGHTBLUE);textcolor(YELLOW);clrscr();gotoxy(15,2);printf("游戏操作规则:");gotoxy(15,4);printf("Play Rules:");gotoxy(15,6);printf("1、按左右上下方向键移动棋子");gotoxy(15,8);printf("1. Press Left,Right,Up,Down Key to move Piece");gotoxy(15,10);printf("2、按空格确定落棋子");gotoxy(15,12);printf("2. Press Space to place the Piece");gotoxy(15,14);printf("3、禁止在棋盘外按空格");gotoxy(15,16);printf("3. DO NOT press Space outside of the chessboard");gotoxy(15,18);printf("你是否接受上述的游戏规则(Y/N)");gotoxy(15,20);printf("Do you accept the above Playing Rules? [Y/N]:");while(1){gotoxy(60,20);ch=getche();if(ch=='Y'||ch=='y')break ;else if(ch=='N'||ch=='n'){window(1,1,80,25);textbackground(BLACK);textcolor(LIGHTGRAY);clrscr();exit(0);}gotoxy(51,12);printf(" ");}}void draw_box(){int x1,x2,y1,y2 ;setbkcolor(LIGHTBLUE);setcolor(YELLOW);gotoxy(7,2);printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit.");for(x1=1,y1=1,y2=18;x1<=18;x1++) line((x1+JZ)*BILI,(y1+JS)*BILI,(x 1+JZ)*BILI,(y2+JS)*BILI);for(x1=1,y1=1,x2=18;y1<=18;y1++) line((x1+JZ)*BILI,(y1+JS)*BILI,(x 2+JZ)*BILI,(y1+JS)*BILI);for(x1=1;x1<=18;x1++)for(y1=1;y1<=18;y1++)box[x1][y1]=0 ;}void draw_circle(int x,int y,int color) {setcolor(color);setlinestyle(SOLID_LINE,0,1);x=(x+JZ)*BILI ;y=(y+JS)*BILI ;circle(x,y,8);}void judgekey(){int i ;int j ;switch(key){case LEFT :if(step_x-1<0)break ;else{for(i=step_x-1,j=step_y;i>=1;i --)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLU E);break ;}if(i<1)break ;step_x=i ;judgewho(step_x,step_y);break ;}case RIGHT :if(step_x+1>18)break ;else{for(i=step_x+1,j=step_y;i<=18 ;i++)if(box[i][j]==0){draw_circle(step_x,step_y,LIGH TBLUE);break ;}if(i>18)break ;step_x=i ;judgewho(step_x,step_y);break ;}case DOWN :if((step_y+1)>18)break ;else{for(i=step_x,j=step_y+1;j<=18 ;j++)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLU E);break ;}if(j>18)break ;step_y=j ;judgewho(step_x,step_y);break ;}case UP :if((step_y-1)<0)break ;else{for(i=step_x,j=step_y-1;j>=1;j --)if(box[i][j]==0){draw_circle(step_x,step_y,LIGHTBLU E);break ;}if(j<1)break ;step_y=j ;judgewho(step_x,step_y);break ;}case ESC :break ;case SPACE :if(step_x>=1&&step_x<=18&&s tep_y>=1&&step_y<=18){if(box[step_x][step_y]==0){box[step_x][step_y]=flag ; if(judgeresult(step_x,step_y)==1){sound(1000);delay(1000);nosound();gotoxy(30,4);if(flag==1){setbkcolor(BLUE);cleardevice(); setviewport(100,100,540,380,1);/*定义一个图形窗口*/setfillstyle(1,2);/*绿色以实填充*/setcolor(YELLOW);rectangle(0,0,439,279);floodfill(50,50,14);setcolor(12);settextstyle(1,0,5);/*三重笔划字体, 水平放?5倍*/ outtextxy(20,20,"The White Win !");setcolor(15);settextstyle(3,0,5);*无衬笔划字体, 水平放大5倍*/ uttextxy(120,120,"The White Win !");setcolor(14);settextstyle(2,0,8);getch();closegraph();exit(0);}if(flag==2){setbkcolor(BLUE);cleardevice();setviewport(100,100,540,380,1);/*定义一个图形窗口*/setfillstyle(1,2);/*绿色以实填充*/setcolor(YELLOW);rectangle(0,0,439,279);floodfill(50,50,14);setcolor(12);settextstyle(1,0,8);笔划字体, 水平放大8倍*/ outtextxy(20,20,"The Red Win !");setcolor(15);settextstyle(3,0,5);/*无衬笔划字体, 水平放大5倍*/outtextxy(120,120,"The Red Win !");setcolor(14);settextstyle(2,0,8);getch();closegraph();exit(0);}}change();break ;}}elsebreak ;}}void change(){if(flag==1)flag=2 ;elseflag=1 ;}void judgewho(int x,int y){if(flag==1)draw_circle(x,y,15);if(flag==2)draw_circle(x,y,4);}int judgeresult(int x,int y){ int j,k,n1,n2 ;while(1){ n1=0 ;n2=0 ;/*水平向左数*/for(j=x,k=y;j>=1;j--){ if(box[j][k]==flag)n1++;elsebreak ;}/*水平向右数*/for(j=x,k=y;j<=18;j++) {if(box[j][k]==flag)n2++;elsebreak ;}if(n1+n2-1>=5){return(1);break ;}/*垂直向上数*/n1=0 ;n2=0 ;for(j=x,k=y;k>=1;k--) {if(box[j][k]==flag)n1++;elsebreak ;}/*垂直向下数*/for(j=x,k=y;k<=18;k++) {if(box[j][k]==flag)n2++;elsebreak ;}if(n1+n2-1>=5){return(1);break ;}/*向左上方数*/n1=0 ;n2=0 ;for(j=x,k=y;j>=1,k>=1;j--,k--){if(box[j][k]==flag)n1++;elsebreak ;}/*向右下方数*/for(j=x,k=y;j<=18,k<=18;j++,k+ +){if(box[j][k]==flag)n2++;elsebreak ;}if(n1+n2-1>=5){return(1);break ;}/*向右上方数*/n1=0 ;n2=0 ;for(j=x,k=y;j<=18,k>=1;j++,k--){if(box[j][k]==flag)n1++;elsebreak ;}/*向左下方数*/for(j=x,k=y;j>=1,k<=18;j--,k++){if(box[j][k]==flag)n2++;elsebreak ;}if(n1+n2-1>=5){ return(1);break ;}return(0);break ;} }void main(){int gdriver=VGA,gmode=VGAHI;clrscr();attention();initgraph(&gdriver,&gmode,"c:\\tc" );/* setwritemode(XOR_PUT);*/flag=1 ;draw_box();do{step_x=0 ;step_y=0 ;/*draw_circle(step_x,step_y,8); */judgewho(step_x-1,step_y-1);do{while(bioskey(1)==0);key=bioskey(0);judgekey();}while(key!=SPACE&&key!=ESC);}while(key!=ESC);closegraph();}。
C语言五子棋游戏源代码
#i n c l u d e<s t d i o.h>#define N 10void welcome();void initqipan();void showqi(int i);void save(int p);void panduan(int p);/******************主函数*****************/void main(){int p=0;welcome();initqipan();for(p=1;p<=N*N;p++){weizhi[p].x[p]=zouqihang(); weizhi[p].y[p]=zouqilie();save(p);showqi(p);panduan(p);{printf("%d",i);printf(" ");}printf("\n");for(i=1;i<N;i++){for(j=0;j<N;j++){if(j==0)elsefp=fopen("wuzi_list","rb");for(i=1;i<=N*N;i++){fread(&weizhi[i],sizeof(struct zuobiao),1,fp);a[i]=weizhi[i].x[i];b[i]=weizhi[i].y[i];}for(m=1;m<p;m++){while(weizhi[p].x[p]==a[m]&&weizhi[p].y[p]==b[m]){for(i=1;i<N;i++){for(j=1;j<N;j++){if(j==1)printf("%d",i);for(k=1;k<=p;k++){if(i==weizhi[k].x[k]&&j==weizhi[k].y[k]){{printf("int zouqihang(){int x;printf("请输入要走棋子所在行数!\n");printf("x=");scanf("%d",&x);while(x>N-1||x<1){printf("error!\n");printf("请输入要走棋子所在行数!\n");}!\n");{printf("error!\n");printf("请输入要走棋子所在列数!\n");printf("y=");scanf("%d",&y);}return y;}/******************文件保存*****************/void save(int i){FILE *fp;{fread(&weizhi[i],sizeof(struct zuobiao),1,fp);a[i]=weizhi[i].x[i];b[i]=weizhi[i].y[i];}/*****************判断行******************/for(i=1;i<=p;i++){if(i%2==1){{{k[0]++;continue;}else if((a[i]==a[j])&&(b[i]==b[j]-4)){k[0]++;continue;}else if(k[0]==5){}{for(j=2;j<=p;j=j+2){if((a[i]==a[j])&&(b[i]==b[j]-1)){k[1]++;continue;}else if((a[i]==a[j])&&(b[i]==b[j]-2)){}else if(k[1]==5){printf("Player 2 wins!!!\n");}else}if(k[1]==5)break;k[1]=1;}}/**********************判断列k[2]++;continue;}else if((a[i]==a[j]-2)&&(b[i]==b[j])){continue;}else if((a[i]==a[j]-3)&&(b[i]==b[j])){}continue;}if(k[2]==5)break;k[2]=1;}else if(k[2]==5)break;else if(i%2==0){{{k[3]++;continue;}else if((a[i]==a[j]-4)&&(b[i]==b[j])){k[3]++;continue;}else if(k[3]==5){}{if(k[0]==5||k[1]==5||k[2]==5||k[3]==5)break;else if(i%2==1){for(j=1;j<=p;j=j+2){if((a[i]==a[j]-1)&&(b[i]==b[j]-1)){k[4]++;}{k[4]++;continue;}else if(k[4]==5){printf("Player 1 wins!!!\n");}elsecontinue;}k[5]++;continue;}else if((a[i]==a[j]-2)&&(b[i]==b[j]-2)){k[5]++;continue;}else if((a[i]==a[j]-3)&&(b[i]==b[j]-3)){}continue;}if(k[5]==5)break;k[5]=1;}}/**********判断对角(左下-右上)************/for(i=1;i<=p;i++){break;k[6]++;continue;}else if((a[i]==a[j]+3)&&(b[i]==b[j]-3)){k[6]++;continue;}else if((a[i]==a[j]+4)&&(b[i]==b[j]-4)){}}else if(k[6]==5)break;else if(i%2==0){for(j=2;j<=p;j=j+2){if((a[i]==a[j]+1)&&(b[i]==b[j]-1)){k[7]++;}{k[7]++;continue;}else if(k[7]==5){printf("Player 2 wins!!!\n");}elsecontinue;}}/****************游戏结束*******************/void over(){printf("************************************\n");printf(" game over!!!\n");printf("************************************\n");}/****************游戏开始*******************/void welcome(){。
五子棋c语言版
#include<stdio.h>#include<string.h>#include<time.h>#include<stdlib.h>#define N 19int i,j,k,size=N;int isBlack=1;//当前是黑方下子 isBlack=1 若为白方下子 isBlack=0char state[N][N];char x,y,temp[10];char c; //用来存放显示黑白子的变量void printState();void startGame(){//printf("\n潇洒菠菜提示:此功能待开发...\n");//当前初始化面板。
for(i=0;i<size;i++){for(j=0;j<size;j++){state[i][j]='*';}}printState();while(1){printf("\n\t请%s方下子:",isBlack?"黑":"白");fflush(stdin);scanf("%s",temp);if(!strcmp(strupr(temp),"OUT")) //如果在下的过程中输入OUT 的话就返回主菜单{system("cls");return;}if(!strcmp(temp,"BACK")) //悔棋... BACK{i=x-'A'; //这里i和j承担过循环控制变量!需要重新初始化j=y-'A';state[i][j]='*';printState();printf("\t 观棋不语真君子,落子不悔大丈夫!\n");isBlack=!isBlack;continue;}if(!strcmp(temp,"LOSE")) //认输... LOSE{printf("\n\t潇洒菠菜提示:%s方认输,%s方胜!\n\n",isBlack?"黑":"白",isBlack?"白":"黑");return;}x=temp[0]; //取前两个字符做处理。
五子棋游戏代码
#include <graphics.h>#include <stdio.h>#include <conio.h>#define N 20/*定义键盘*/#define up 'i'#define down 'k'#define left 'j'#define right 'l'#define esc 27#define enter 13#define A 'a'#define S 's'#define D 'd'#define W 'w'#define space 32#define Y 'y'#define n 'n'int gamespeed=5;int i,j,key;struct Sor{int x;int y;/*x,y表示当前光标的位置*/int yes[N][N];/* 0表示无棋子,1表示白色棋子,2表示红色棋子*/ int kao;/* 1表示白棋准备落子,2表示红棋准备落子*/int ok;/*1表示白棋胜出,2表示红棋胜出*/}sor;void init(void) /**/{initgraph(510, 500);}void drawqp(void)/*画棋盘*/{setcolor(GREEN);for(i=50;i<=(N-1)*20+30;i+=20){line(50,i,(N-1)*20+30,i);line(i,50,i,(N-1)*20+30);}setcolor(RGB(248,248,0));for(i=0;i<4;i++){circle((N-1)*10+40,(N-1)*10+40,i);circle(130,130,i);circle(130,330,i);circle(330,130,i);circle(330,330,i);}}void color(){settextcolor(RGB(200,225,150));settextstyle(30,30,"楷书");outtextxy(430,90,"五");outtextxy(430,140,"子");outtextxy(430,190,"棋");outtextxy(430,240,"游");outtextxy(430,290,"戏");}void clew(void) /*input message*/{setcolor(RGB(255,0,0));outtextxy(100,20,"1P: 方向:i k j l 落子:回车2P: 方向:w s a d 落子:空格"); outtextxy(15,20,"五子棋玩法:");}void place(void)/*画出光标的位置*/{line(sor.x-10,sor.y-10,sor.x-7,sor.y-10);line(sor.x-10,sor.y-10,sor.x-10,sor.y-7);line(sor.x-10,sor.y+10,sor.x-10,sor.y+7);line(sor.x-10,sor.y+10,sor.x-7,sor.y+10);line(sor.x+10,sor.y-10,sor.x+10,sor.y-7); line(sor.x+10,sor.y-10,sor.x+7,sor.y-10);line(sor.x+10,sor.y+10,sor.x+7,sor.y+10); line(sor.x+10,sor.y+10,sor.x+10,sor.y+7);}void win(void)/*判断是否胜出*/{for(i=1;i<N;i++){for(j=1;j<N;j++){if(((j+4)<N&&sor.yes[i][j]!=0&&sor.yes[i][j]==sor.yes[i][j+1]&&sor.yes[i][j+1]==sor.yes[i][j+2]&&sor.yes[i][j+2]==sor.yes[i][j+3]&&sor.yes[i][j+3]==sor.yes[i][j+4])||((i+4)<N&&sor.yes[i][j]!=0&&sor.yes[i][j]==sor.yes[i+1][j]&&sor.yes[i+1][j]==sor.yes[i+2][j]&&sor.yes[i+2][j]==sor.yes[i+3][j]&&sor.yes[i+3][j]==sor.yes[i+4][j])||((i+4)<N&&(j+4)<N&&sor.yes[i][j]!=0&&sor.yes[i][j]==sor.yes[i+1][j+1]&&sor.yes[i+1][j+1]==sor.yes[i+2][j+2]&& sor.yes[i+2][j+2]==sor.yes[i+3][j+3]&& sor.yes[i+3][j+3]==sor.yes[i+4][j+4])||((i+4)<N&&j>4&&sor.yes[i][j]!=0&& sor.yes[i][j]==sor.yes[i+1][j-1]&&sor.yes[i+1][j-1]==sor.yes[i+2][j-2]&& sor.yes[i+2][j-2]==sor.yes[i+3][j-3]&& sor.yes[i+3][j-3]==sor.yes[i+4][j-4])) {if(sor.yes[i][j]==1)sor.ok=1;elsesor.ok=2;break;}}if(sor.ok!=0)break;}}void gameover(void){if(sor.ok==1){ settextcolor(YELLOW);settextstyle(30,30,"楷书");outtextxy(110,100,"白方获胜");}else{ settextcolor(YELLOW);settextstyle(30,30,"楷书");outtextxy(110,100,"红方获胜");}}void xandy(void)/*显示光标的横纵坐标*/{char str1[10],str2[10];setfillstyle(SOLID_FILL,7);setfillcolor(LIGHTRED);bar(50,440,190,470);setfillcolor(WHITE);settextcolor(YELLOW);settextstyle(11,11,"宋体");outtextxy(240,420,"组员:");outtextxy(240,440,"代壮张志慧房鑫"); outtextxy(240,460,"胡百川马天元殷奖章"); sprintf(str1,"X:%d",(sor.x-30)/20);sprintf(str2,"Y:%d",(sor.y-30)/20);outtextxy(70,450,str1);outtextxy(140,450,str2);color();}void gameplay(void){for(i=1;i<N;i++)/*棋盘初始化*/for(j=1;j<N;j++)sor.yes[i][j]=0;sor.kao=1; /*白棋先走*/sor.ok=0;/*双方胜负未分*/sor.x=(N-1)*10+40;sor.y=(N-1)*10+40;/*初始化光标,将光标定位在棋盘的中心*/ setcolor(LIGHTBLUE);//淡洋红色place();while(1){xandy();key=getch();if(key==esc)break;/*白棋键盘移动*/else if(key==up&&sor.y>50&&sor.kao==1){setcolor(0);place();sor.y-=20;}else if(key==down&&sor.y<(N-1)*20+30&&sor.kao==1){setcolor(0);place();sor.y+=20;}else if(key==left&&sor.x>50&&sor.kao==1){setcolor(0);place();sor.x-=20;}else if(key==right&&sor.x<(N-1)*20+30&&sor.kao==1){setcolor(0);place();sor.x+=20;/*红方键盘移动*/else if(key==W&&sor.y>50&&sor.kao==2){setcolor(0);place();sor.y-=20;}else if(key==S&&sor.y<(N-1)*20+30&&sor.kao==2){setcolor(0);place();sor.y+=20;}else if(key==A&&sor.x>50&&sor.kao==2){setcolor(0);place();sor.x-=20;}else if(key==D&&sor.x<(N-1)*20+30&&sor.kao==2){setcolor(0);place();sor.x+=20;}else if(key==space&&sor.yes[(sor.x-30)/20][(sor.y-30)/20]==0&&sor.kao==2) {setcolor(RED);/*for(i=1;i<=9;i++){circle(sor.x,sor.y,i);Sleep(10);}*/circle(sor.x,sor.y,10);setfillcolor(RED);fillcircle(sor.x,sor.y,10);sor.yes[(sor.x-30)/20][(sor.y-30)/20]=2;sor.kao=1;win();if(sor.ok!=0){gameover();break;}}else if(key==enter&&sor.yes[(sor.x-30)/20][(sor.y-30)/20]==0&&sor.kao==1)setcolor(RGB(255,255,255));/*for(i=1;i<=9;i++){circle(sor.x,sor.y,i);Sleep(10);}*/circle(sor.x,sor.y,10);setfillcolor(RGB(255,255,255)); fillcircle(sor.x,sor.y,10);sor.yes[(sor.x-30)/20][(sor.y-30)/20]=1; sor.kao=2;win();if(sor.ok!=0){gameover();break;}}elsecontinue;if(sor.ok!=0)break;if(sor.kao==1)setcolor(WHITE);elsesetcolor(RGB(255,128,255));place();}/*endwhile(1)*/}void main(){while(1){init();cleardevice();clew();drawqp();gameplay();setcolor(YELLOW);settextstyle(15,15,"g");outtextxy(150,350,"继续吗(Y/N)?");while(1){key=getch();if(key==Y||key==n||key==esc)break;}if(key==n||key==esc)break;}closegraph();}。
c五子棋课程设计报告
c五子棋课程设计报告一、教学目标本课程旨在让学生掌握C五子棋的基本规则、技巧和策略,培养他们的逻辑思维、判断力和竞技水平。
具体目标如下:1.知识目标:了解C五子棋的历史背景、基本规则和竞技策略。
掌握棋子的移动、 capture 和摆放规则。
了解不同棋型(活三、活四、死三、死四等)及其应用。
2.技能目标:能够独立完成C五子棋的设置和开局。
能够运用基本技巧进行中局对抗。
能够运用竞技策略进行残局思考和决策。
3.情感态度价值观目标:培养学生的团队协作和竞技精神。
增强学生面对挑战、克服困难的信心。
通过C五子棋的学习,培养学生的耐心、细心和逻辑思维能力。
二、教学内容根据课程目标,教学内容主要包括以下几个方面:1.C五子棋基本规则:棋盘、棋子、走法、capture 等。
2.棋型识别与运用:活三、活四、死三、死四等。
3.开局技巧:棋型摆放、线路控制、速度进攻。
4.中局策略:防守、攻击、棋型配合。
5.残局思考:胜负判断、棋型转换、策略选择。
教学大纲安排如下:第1-2课时:C五子棋基本规则及棋型识别。
第3-4课时:开局技巧及中局策略。
第5-6课时:残局思考及竞技水平提升。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用以下教学方法:1.讲授法:讲解C五子棋的基本规则、棋型和策略。
2.案例分析法:分析典型棋局,引导学生思考和判断。
3.实验法:让学生亲自动手实践,提高竞技水平。
4.讨论法:分组讨论,分享学习心得和经验。
四、教学资源教学资源包括:1.教材:《C五子棋入门教程》。
2.参考书:《C五子棋高级技巧》。
3.多媒体资料:教学PPT、棋局视频等。
4.实验设备:C五子棋棋盘、棋子。
以上资源将有助于实现教学目标,提高学生的学习效果。
五、教学评估本课程的教学评估将采用多元化方式,全面、客观地评价学生的学习成果。
评估方式包括:1.平时表现:课堂参与度、团队协作、竞技水平等。
2.作业:课后练习、棋局分析报告等。
3.考试:期中考试、期末考试,分别考察学生的基本规则掌握和竞技水平。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
辽宁工业大学C语言程序设计课程设计(论文)题目:五子棋游戏院(系):专业班级:学号:学生姓名:指导教师:教师职称:起止时间:课程设计(报告)任务及评语目录第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数据结构设计及用法说明 (3)2.2.3程序结构(流程图) (3)2.2.4各模块的功能及程序说明 (5)2.2.5程序结果 (6)2.3程序源代码及注释 (6)第3章课程设计总结 (23)参考资料 (24)第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程序功能介绍本程序是在一个方阵上通过两人对弈的形式,依次在棋盘上放置两种颜色的棋子,哪一方先让五个棋子形成一条直线(包括横、竖、对角线3个方向),即为获胜,游戏初始运行界面应为如下:游戏操作规则:1、按左右上下方向键移动棋子2、按空格键确定落棋子3、禁止在棋盘外按空格2.2程序整体设计说明2.2.1设计思路1) 黑先、白后,从天元开始相互顺序落子。
2) 白棋第一手应在天元为界自己一侧布子,之后双方可任意行子。
3) 最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
4) 黑棋禁手判负、白棋无禁手。
黑棋禁手包括“三、三”“四、四”“长连”。
黑方只能“四、三”胜。
5) 如分不出胜负,则定为平局。
6) 对局中中途退场均判为负。
7) 五连与禁手同时形成,先五为胜。
1) 长连:在一条直线或斜线上,连续下成五个以上的棋型2) 活三:在一条直线或斜线上,由三个子构成的,必须防守否则将成为“活四”导致速胜的棋型。
三只有下面两种棋型结构:3) 活四:指在一条直线或斜线上,由连续的四个字所构成的,无论对方怎样防守,只要再走一手棋将必定成为五连的棋型:4) 四:在一条直线或斜线上,由四个同色子构成的,必须防守否则下一步立刻成为“五连”导致速胜的棋型。
活四也是四之一。
2.2.2数据结构设计及用法说明int gPlayOrder; /*指示当前行棋方 */struct point gCursor; /*光标在棋盘上的位置 */char gChessBoard[19][19];/*用于记录棋盘上各点的状态*/ break/*是落子键*/else /*交换行棋方*/2.2.3程序结构(流程图)main()函数流程图Judgeplayer流程图2.2.4各模块的功能及程序说明case KEYFALLCHESS: 判断落子。
void Init(void) 界面初始化,数据初始化。
textmode(C40)画棋盘。
void DrawCross(int x,int y)确定画棋盘上的交叉点。
void DoError(void)落子错误处理。
void DoWin(int Order)赢棋处理。
switch(direction)判断输赢。
void EndGame(void)游戏结束处理。
2.2.5程序结果2.3程序源代码及注释*加载头文件*/#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.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/*定义数组大小*/#define N 19/*定义全局变量*/int status[N][N]; /*定义的数组,保存状态*/ int step_x,step_y;/*行走的坐标*/int key ; /*获取按下的键盘的键*/ int flag; /*玩家标志*//*自定义函数原型*/void DrawBoard();void DrawCircle(int x,int y,int color); void Alternation();void JudgePlayer(int x,int y);void Done();int ResultCheck(int x,int y);void WelcomeInfo();void ShowMessage();/*定义函数*//*显示欢迎信息函数*/void WelcomeInfo(){char ch ;/*移动光标到指定位置*/gotoxy(12,4);/*显示欢迎信息*/printf("Welcome you to gobang word!");gotoxy(12,6);printf("1.You can use the up,down,left and right key to move the chessman,"); gotoxy(12,8);printf(" and you can press Space key to enter after you move it !");gotoxy(12,10);printf("2.You can use Esc key to exit the game too !");gotoxy(12,12);printf("3.Don not move the pieces out of the chessboard !");gotoxy(12,14);printf("DO you want to continue ?(Y/N)");ch=getchar();/*判断程序是否要继续进行*/if(ch=='n'||ch=='N')/*如果不继续进行,则推出程序*/exit(0);}/*画棋盘函数*/void DrawBoard(){int x1,x2;int y1,y2;/*设置背景色*/setbkcolor(2);/*设置线条颜色*/setcolor(1);/*设置线条风格、宽度*/setlinestyle(DOTTED_LINE,1,1);/*按照预设的偏移量开始画棋盘*/for(x1=1,y1=1,y2=18;x1<=18;x1++)line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFS ET_y)*OFFSET);for(x1=1,y1=1,x2=18;y1<=18;y1++)line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFS ET_y)*OFFSET);/*将各个点的状态设置为0*/for(x1=1;x1<=18;x1++)for(y1=1;y1<=18;y1++)status[x1][y1]=0;/*显示帮助信息*/setcolor(14);/*设置字体、大小*/settextstyle(1,0,1);outtextxy((19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,"Player key:");setcolor(9);settextstyle(3,0,1);outtextxy((19+OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,"UP--up ");outtextxy((19+OFFSET_x)*OFFSET,(6+OFFSET_y)*OFFSET,"DOWN--down ");outtextxy((19+OFFSET_x)*OFFSET,(8+OFFSET_y)*OFFSET,"LEFT--left");outtextxy((19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,"RIGHT--right"); outtextxy((19+OFFSET_x)*OFFSET,(12+OFFSET_y)*OFFSET,"ENTER--space"); setcolor(14);settextstyle(1,0,1);outtextxy((19+OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,"Exit:"); setcolor(9);settextstyle(3,0,1);outtextxy((19+OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,"ESC"); }/*画圆函数*/void DrawCircle(int x,int y,int color){setcolor(color);/*设置画圆线条的风格,宽度,这里设置为虚线*/setlinestyle(SOLID_LINE,0,1);x=(x+OFFSET_x)*OFFSET;y=(y+OFFSET_y)*OFFSET;/*以(x,y)为圆心,8为半径画圆*/circle(x,y,8);}/*交换行棋方函数*/void Alternation(){if(flag==1)flag=2 ;elseflag=1 ;}/*对不同的行棋方画不同颜色的圆函数*/void JudgePlayer(int x,int y){if(flag==1)DrawCircle(x,y,15);if(flag==2)DrawCircle(x,y,4);}/*判断当前行棋方是否获胜函数*/int ResultCheck(int x,int y){int j,k;int n1,n2 ;while(1){/*对水平方向进行判断是否有5个同色的圆*/ n1=0;n2=0;/*水平向左数*/for(j=x,k=y;j>=1;j--){if(status[j][k]==flag)n1++;elsebreak;}/*水平向右数*/for(j=x,k=y;j<=18;j++){if(status[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);}/*对垂直方向进行判断是否有5个同色的圆*/n1=0;n2=0;/*垂直向上数*/for(j=x,k=y;k>=1;k--){if(status[j][k]==flag)n1++;elsebreak ;}/*垂直向下数*/for(j=x,k=y;k<=18;k++){if(status[j][k]==flag)n2++;elsebreak ;}if(n1+n2-1>=5){return(1);}/*从左上方到右下方进行判断是否有5个同色的圆*/ n1=0;n2=0;/*向左上方数*/for(j=x,k=y;(j>=1)&&(k>=1);j--,k--){if(status[j][k]==flag)n1++;elsebreak;}/*向右下方数*/for(j=x,k=y;(j<=18)&&(k<=18);j++,k++){if(status[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);}/*从右上方到左下方进行判断是否有5个同色的圆*/ n1=0;n2=0;/*向右上方数*/for(j=x,k=y;(j<=18)&&(k>=1);j++,k--){if(status[j][k]==flag)n1++;elsebreak;}/*向左下方数*/for(j=x,k=y;(j>=1)&&(k<=18);j--,k++){if(status[j][k]==flag)n2++;elsebreak;}if(n1+n2-1>=5){return(1);}return(0);}}/*执行下棋函数*/void Done(){int i ;int j ;/*根据不同的key值进行不同的操作*/switch(key){/*如果是向左移动的*/case LEFT:/*如果下一步超出棋盘左边界则什么也不作*/ if(step_x-1<0)break ;else{for(i=step_x-1,j=step_y;i>=1;i--)if(status[j]==0){DrawCircle(step_x,step_y,2);break ;}if(i<1)break ;step_x=i ;JudgePlayer(step_x,step_y);break ;}/*如果是向右移动的*/case RIGHT :/*如果下一步超出棋盘右边界则什么也不作*/if(step_x+1>18)break ;else{for(i=step_x+1,j=step_y;i<=18;i++)if(status[j]==0){/*每移动一步画一个圆,显示移动的过程*/ DrawCircle(step_x,step_y,2);break ;}if(i>18)break ;step_x=i ;/*根据不同的行棋者画不同颜色的圆*/JudgePlayer(step_x,step_y);/*显示行棋一方是谁*/break ;}/*如果是向下移动的*/case DOWN :/*如果下一步超出棋盘下边界则什么也不作*/ if((step_y+1)>18)break ;else{for(i=step_x,j=step_y+1;j<=18;j++) if(status[j]==0){DrawCircle(step_x,step_y,2);break ;}if(j>18)break ;step_y=j ;JudgePlayer(step_x,step_y);break ;}/*如果是向上移动的*/case UP :/*如果下一步超出棋盘上边界则什么也不作*/ if((step_y-1)<0)break ;else{for(i=step_x,j=step_y-1;j>=1;j--)if(status[j]==0){DrawCircle(step_x,step_y,2);break ;}if(j<1)break ;step_y=j ;JudgePlayer(step_x,step_y);break ;}/*如果是退出键*/case ESC :break ;/*如果是确定键*/case SPACE:/*如果操作是在棋盘之内*/if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18){/*按下确定键后,如果棋子当前位置的状态为0*/if(status[step_x][step_y]==0){/*则更改棋子当前位置的状态在flag,表示是哪个行棋者行的棋*/ status[step_x][step_y]=flag ;/*如果判断当前行棋者获胜*/if(ResultCheck(step_x,step_y)==1){/*以指定频率打开PC扬声器*/sound(1000);/*扬声器的发生时间,为1秒钟*/delay(1000);nosound();setbkcolor(BLUE);/*清除图形屏幕*/cleardevice();/*为图形输出设置当前视口*/setviewport(100,100,540,380,1);/*绿色实填充*/setfillstyle(1,2);setcolor(YELLOW);rectangle(0,0,439,279);floodfill(50,50,14);setcolor(12);settextstyle(1,0,5);/*三重笔划字体, 水平放大5倍*/outtextxy(20,20,"Congratulation !");setcolor(15);settextstyle(3,0,4);/*如果是Player1获胜,显示获胜信息*/if(flag==1){/*无衬笔划字体, 水平放大5倍*/outtextxy(20,120,"Player1 win the game !"); }/*如果是Player1获胜,显示获胜信息*/if(flag==2){/*无衬笔划字体, 水平放大5倍*/outtextxy(20,120,"Player2 win the game !"); }settextstyle(2,0,8);getch();exit(0);}/*如果当前行棋者没有获胜,则交换行棋方*/ Alternation();/*提示行棋方是谁*/ShowMessage();break;}}elsebreak ;}}/*显示行棋方函数*/void ShowMessage(){/*轮到Player1行棋*/if(flag==1){setcolor(2);settextstyle(1,0,1);gotoxy(100,30);/*覆盖原有的字迹*/outtextxy(100,30,"It's turn to Player2 !");setcolor(12);settextstyle(1,0,1);outtextxy(100,30,"It's turn to Player1 !");}/*轮到Player2行棋*/if(flag==2){setcolor(2);settextstyle(1,0,1);/*覆盖原有的字迹*/outtextxy(100,30,"It's turn to Player1 !");setcolor(12);settextstyle(1,0,1);gotoxy(100,20);outtextxy(100,30,"It's turn to Player2 !");}}/*主函数*/int main(){int gdriver;int gmode;int errorcode;/*清空文本模式窗口*/clrscr();/*显示欢迎信息*/WelcomeInfo();gdriver=DETECT;gmode=0;/*初始化图形系统*/registerbgidriver(EGAVGA_driver); //把驱动程序装入到执行程序中,方法见独立图形程序的建立一文initgraph(&gdriver,&gmode,"");/*返回最后一次不成功的图形操作的错误代码*/errorcode=graphresult();if (errorcode!= grOk){/*根据错误代码输出错误信息串*/printf("\nNotice:Error occured when grphics initialization: %s\n",grapherrormsg(errorcode));printf("Press any key to quit!");getch();exit(1);}/*设置flag初始值,默认是Player1先行*/flag=1;/*画棋盘*/DrawBoard();ShowMessage();do{step_x=0 ;step_y=0 ;JudgePlayer(step_x-1,step_y-1);do{/*如果没有键按下,则bioskey(1)函数将返回0*/ while(bioskey(1)==0);/*获取从键盘按下的键值*/key=bioskey(0);/*根据获得的键值进行下棋操作*/Done();}while(key!=SPACE&&key!=ESC);}while(key!=ESC); /*关闭图形系统*/ closegraph();return 0;}第3章课程设计总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。