C语言实现五子棋小游戏

代码采用C语言编写,结合图形库,实现五子棋小游戏,代码如下:

#include<fstream>
#include <stdlib.h> 
#include <graphics.h>
#include <stdio.h>
#include<bits/stdc++.h>
#include <windows.h> 
 
#define MAXROW 1000
#define MAXCOL 500

int visb[MAXROW][MAXCOL];//记录黑棋
#define VISBF "visb.dat"
int visw[MAXROW][MAXCOL];//记录白棋
#define VISWF "visw.dat"
int bwin;//标记黑棋获胜
int wwin;//标记白棋子获胜
int step;

int tmpb[MAXROW][MAXCOL];
int tmpw[MAXROW][MAXCOL];

mouse_msg msg = {0};

void caozuo();
void saveWPositionToFile();
void saveBPositionToFile();
void ZhuYe()//主页 
{
    wwin=0;
    bwin=0;
    memset(visb,0,sizeof(visb));
    memset(visw,0,sizeof(visw));//退出后仍可以再来一盘 (内存初始化)
    memset(tmpb, 0, sizeof(tmpb));
    memset(tmpw, 0, sizeof(tmpw));
    saveWPositionToFile();
    saveBPositionToFile();
    initgraph(1000, 500);
    setcaption("高艾祺_1192904001_五子棋游戏"); 
    setbkcolor(EGERGB(0x69, 0x69, 0x69)); //设置背景颜色
    setfillcolor(EGERGB(0xB0,0xD8,0xE6)) ;
    bar(350,350,650,500);
    bar(350,100,650,250);
    setbkmode(TRANSPARENT);//文字填充透明化
    setcolor(EGERGB(0x0, 0x0, 0x0));//字体颜色 
    setfont(40, 15, "楷体");
    outtextxy(450,150,"双人对战");
    setfont(40,15,"楷体");
    outtextxy(450,400,"开始游戏"); 
}
void saveWPositionToFile()
{
    FILE* fpw = fopen(VISWF, "wb");
    int rowIndex = 0;
    visw[0][0] = 123;
    for (; rowIndex < MAXROW; rowIndex++)
    {
        fwrite(visw[rowIndex], MAXCOL * sizeof(int), 1, fpw);
    }
   
    fclose(fpw);
}
void saveBPositionToFile()
{
    FILE* fpb = fopen(VISBF, "wb");
    int rowIndex = 0;
    for (; rowIndex < MAXROW; rowIndex++)
    {
        fwrite(visb[rowIndex], MAXCOL * sizeof(int), 1, fpb);
    }
    fclose(fpb);
}
void readWPositionFromFile()
{
    FILE* fpw = fopen(VISWF, "rb");
    if (fpw)
    {
        int rowIndex = 0;
        for (; rowIndex < MAXROW && !feof(fpw); rowIndex++)
        {
            fread(tmpw[rowIndex], MAXCOL * sizeof(int), 1, fpw);
        }
        fclose(fpw);
    }
}
void readBPositionFromFile()
{
    FILE* fpb = fopen(VISBF, "rb");
    if (fpb)
    {
        int rowIndex = 0;
        for (; rowIndex < MAXROW; rowIndex++)
        {
            fread(tmpb[rowIndex], MAXCOL * sizeof(int), 1, fpb);
        }
        fclose(fpb);
    }
}

int jud()
{
    readWPositionFromFile();
    readBPositionFromFile();

    for(int i=60;i<=480;i++)
    {
        for(int j=60;j<=480;j++)
        {
            
            if (tmpb[i][j] && tmpb[i + 30][j] && tmpb[i + 60][j] && tmpb[i - 30][j] && tmpb[i - 60][j])
                return 1;//横向获胜
            else if (tmpb[i][j] && tmpb[i][j + 30] && tmpb[i][j + 60] && tmpb[i][j - 30] && tmpb[i][j - 60])
                return 1;//纵向获胜
            else if (tmpb[i][j] && tmpb[i + 30][j + 30] && tmpb[i + 60][j + 60] && tmpb[i - 30][j - 30] && tmpb[i - 60][j - 60])
                return 1;//斜向获胜 
            else if (tmpb[i][j] && tmpb[i - 30][j + 30] && tmpb[i - 60][j + 60] && tmpb[i + 30][j - 30] && tmpb[i + 60][j - 60])
                return 1;
            if (tmpw[i][j] && tmpw[i + 30][j] && tmpw[i + 60][j] && tmpw[i - 30][j] && tmpw[i - 60][j])
                return 2;
            else if (tmpw[i][j] && tmpw[i][j + 30] && tmpw[i][j + 60] && tmpw[i][j - 30] && tmpw[i][j - 60])
                return 2;
            else if (tmpw[i][j] && tmpw[i + 30][j + 30] && tmpw[i + 60][j + 60] && tmpw[i - 30][j - 30] && tmpw[i - 60][j - 60])
                return 2;
            else if (tmpw[i][j] && tmpw[i - 30][j + 30] && tmpw[i - 60][j + 60] && tmpw[i + 30][j - 30] && tmpw[i + 60][j - 60])
                return 2;
        }
    }
}
void QiPan()//棋盘
{
    setbkcolor(EGERGB(173, 92, 45));//设置背景颜色
    setcolor(BLACK);
    for(int i=60;i<510;i+=30)
    {
        line(i,60,i,480);
        line(60,i,480,i);
    }
    setcolor(EGERGB(255, 255, 255));
    setfont(40, 15, "楷体");
    xyprintf(700,150,"白棋先行");
    setcolor(EGERGB(0,0,0));
    setfont(40, 15, "楷体");
    xyprintf(700,200,"黑棋后行");
}
 
void zhankuang()//显示当前棋盘状况
{
    setbkcolor(EGERGB(173, 92, 45));//设置背景颜色
    setcolor(BLACK);
    for(int i=60;i<510;i+=30)//显示棋盘 
    {
        line(i,60,i,480);
        line(60,i,480,i);
    }
    
    for(int i=60;i<=480;i++)
    {
        for(int j=60;j<=480;j++)
       {
            if(visw[i][j])//显示白棋 
            {
                setcolor(EGERGB(255, 255, 255));
                setfillcolor(EGERGB(255,255,255));
                fillellipse(i,j,15,15);
            }
            else if(visb[i][j])//显示黑棋 
            {
                setcolor(EGERGB(0, 0, 0));
                setfillcolor(EGERGB(0,0,0));
                fillellipse(i,j,15,15);
            }
        }
      }
    
    setcolor(EGERGB(255, 255, 255));
    setfont(40, 15, "楷体");
    xyprintf(700,150,"白棋:%d",(step-1)/2+(step-1)%2);
    setcolor(EGERGB(0,0,0));
    setfont(40, 15, "楷体");
    xyprintf(700,200,"黑棋:%d",(step-1)/2);
 
    setfillcolor(EGERGB(0x87,0xCE,0x0FF));
    bar(700,400,850,450);
    setcolor(EGERGB(0x0, 0x0, 0x0));
    outtextxy(750,400,"退出");
    if(bwin)
    {
        setcolor(EGERGB(0, 0, 0));
        setbkmode(TRANSPARENT);
        setfont(20, 10, "楷体");
        outtextxy(630,350,"黑棋获胜,点击下方回到主菜单");
    }
    else if(wwin)
    {
        setcolor(EGERGB(255, 255, 255));
        setbkmode(TRANSPARENT);
        setfont(20, 10, "楷体");
        outtextxy(650,350,"白棋获胜,点击下方退出键回到主菜单");
    }
}

void choose()
{
    for ( ; is_run(); delay_fps(60))//鼠标操作
    {
        while (mousemsg())
        {
            msg = getmouse();
        }
        if((int)msg.is_down()&&msg.x>=350&&msg.x<=650&&msg.y>=350&&msg.y<=500)
        {
            cleardevice();
            caozuo();
            break;
        }
    }
    
}
void fanhui()//退出至主页 
{
    for(; is_run(); )
    {
        msg = getmouse();
        if((int)msg.is_down()&&(int)msg.x>=700&&msg.x<=850&&msg.y>=400&&msg.y<=450)//鼠标操作,“退出”所在文本框范围 
        {
            cleardevice();
            ZhuYe();
            choose();
        }
    }
}

void caozuo()//鼠标操作 
{
    bwin=0;
    wwin=0;
    QiPan();// 
    step=1;//步数初始化
        for ( ; is_run(); )
        {
            msg = getmouse();
            if((int)msg.is_down()&&msg.x&&msg.y&&visw[msg.x/30*30][msg.y/30*30]==0&&visb[msg.x/30*30][msg.y/30*30]==0&&msg.x>=50&&msg.x<=485&&msg.y>=55&&msg.y<=485)
            {
                step++;//每走一步,步数+1
                if((step)&1)
                {
                    visb[msg.x/30*30][msg.y/30*30]=1;//奇数下黑棋
                    saveBPositionToFile();
                }
                if((step)%2==0)
                {
                    visw[msg.x/30*30][msg.y/30*30]=1;//偶数下白棋
                    saveWPositionToFile();
                }
                if(jud()==1) 
                    {
                    bwin=1;
                    }
                else if(jud()==2) 
                    {
                    wwin=1;
                    }
                cleardevice();
                zhankuang();
                if(bwin||wwin) 
                    break;    
            }
            else if((int)msg.is_down()&&(int)msg.x>=700&&msg.x<=850&&msg.y>=400&&msg.y<=450)
            {    
                cleardevice();
                ZhuYe();
                choose();
            }
        }
}


int main()
{
    HWND hwndDOS = GetForegroundWindow();
    ShowWindow(hwndDOS, SW_HIDE);
    ZhuYe();//主菜单
    choose();//菜单栏选择
    fanhui();
    closegraph();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电路设计(25)——4位数字频率计的multisim仿真及PCB设计

1.设计要求 使用4位数码管&#xff0c;显示输入信号的频率。完成功能仿真后&#xff0c;用AD软件&#xff0c;画出原理图以及PCB。 2.电路设计 输入信号的参数为&#xff1a; 可见&#xff0c;输入为168HZ&#xff0c;测量值为170HZ&#xff0c;误差在可接受的范围内。 3.PCB设…

Bluesky数据采集框架-2

访问保存的数据 到此&#xff0c;自然想到了"我如何访问我保存的数据&#xff1f;"。从bluesky的视角&#xff0c;那真的不是bluesky的关注&#xff0c;但它是一个合理的问题&#xff0c;因此我们将强调一个特定的场景。 注意&#xff1a;本章假设你正在使用databr…

从零开始手写mmo游戏从框架到爆炸(二十)— 战斗系统一

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 规则 我们现在设计并尝试开发战斗系统。战斗系统我们先设定几个规则 1、多人对多人&#xff1a;英雄可以携带宝宝&#xff0c;面对的野怪也可以是成群的&#xff0…

C++ //练习 8.3 什么情况下,下面的while循环会终止?

C Primer&#xff08;第5版&#xff09; 练习 8.3 练习 8.3 什么情况下&#xff0c;下面的while循环会终止&#xff1f; while(cin>>i) /* ... */环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 当输入条件不为真的时候&am…

AI:134-基于深度学习的社交媒体图像内容分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

【右一的电子笔记】全导航,持续更新...

文章目录 &#x1f4da;计算机基础&#x1f407;高程&#xff08;c&#xff09;&#x1f407;python基础&#x1f407;数据结构&#x1f407;数据库系统概念&#x1f407;计算机网络&#x1f407;计算机组成原理&#x1f407;操作系统 &#x1f4da;大数据&#x1f407;大数据管…

C语言——实用调试技巧——第2篇——(第23篇)

坚持就是胜利 文章目录 一、实例二、如何写出好&#xff08;易于调试&#xff09;的代码1、优秀的代码2、示范&#xff08;1&#xff09;模拟 strcpy 函数方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;有弊端方法四&#xff1a;对方法三进行优化assert 的使用 方法五…

Spring之AOP源码解析(下)

前言 在上一遍文章中,我们主要讲解了ProxyFactory在Spring完成AOP动态代理的过程中发挥的作用。这一篇我们主要讲解这些注解都是如何注入Advisors,然后分析这些Advisors生效的条件 注解都是如何注入Advisor并匹配的 EnableTransactionManagement注解 我们在之前提到EnableT…

C++ const关键字

在C中&#xff0c;const是一个关键字&#xff0c;用于声明常量或者修饰变量、指针、引用等&#xff0c;表示其数值是不可修改的。const关键字的主要作用包括一下几个方面&#xff1a; 一、修饰基本数据类型 基本数据类型&#xff0c;修饰符const可以用在类型说明符前&#xf…

STM32 TCP实现OTA

芯片&#xff1a;stm32f407 开发平台&#xff1a;stm32cubeide 上位机开发平台&#xff1a;visual studio 2017 1. FLASH分配 将flash划分为四个部分&#xff1a; bootloader: 0x8000000-0x800ffff app1: 0x8010000-0x805ffff app2: …

一流的财务:搞数据!!!(干货)

“三流财务给数据&#xff0c;二流财务给分析报告&#xff0c;一流财务给....&#xff08;解决方案&#xff09;“这些文章应该很多人都看到过&#xff0c;这个口号粗看好像很有道理&#xff0c;但笔者并不认同&#xff0c;因为大家都忽略了一个重要的概念&#xff1a;数据&…

什么是rouge metric

采用分类任务的指标评估生成任务的问题 举个例子&#xff0c;在一个seq2seq模型中&#xff0c;黄金标签是“police killed the gunman”&#xff0c;模型输出是"the gunman police killed"&#xff0c;两句话的意思是有差别的&#xff0c;但是从unigram的角度&#…

数字化浪潮下的企业变革:深度解析ERP的崭新篇章

引言&#xff1a; 随着科技的飞速发展&#xff0c;企业正迎来前所未有的数字化浪潮。在这个数字时代&#xff0c;企业资源规划&#xff08;ERP&#xff09;被认为是企业应对挑战、实现创新的重要工具。本文将深入研究ERP的发展历程&#xff0c;聚焦不同行业和场景下的创新应用…

Atomic-flag-tutorial

本文介绍 <atomic> 头文件中最简单的原子类型: atomic_flag。atomic_flag 一种简单的原子布尔类型&#xff0c;只支持两种操作&#xff0c;test_and_set 和 clear。 std::atomic_flag 详解 std::atomic_flag 构造函数 std::atomic_flag 构造函数如下&#xff1a; ato…

ROS2 学习笔记13:创建 ROS2 包

ROS2 学习笔记13&#xff1a;创建 ROS2 包 Background 背景1 什么是ROS2 包2 ROS2包的组成3 工作空间的包 Prerequisites 前提Tasks 任务1 Create a package2 Build a package3 Source the setup file4 Use the package5 Examine package contents6 Customize package.xml Summ…

虚 拟 化原理

1 概念&#xff1a; ①通俗理解&#xff1a; 虚拟化是在硬件和操作系统之间的实践 ②通过对计算机的服务层级的理解&#xff0c;理解虚拟化概念 抽离层级之间的依赖关系&#xff08;服务器虚拟化&#xff09; 2 虚拟化分类 ①按架构分类 ◆寄居架构&#xff1a;装在操作系统上…

pytest.param作为pytest.mark.parametrize的参数进行调用

pytest.param&#xff1a;在 pytest.mark.parametrize 中可以作为一个指定的参数进行调用 获取数据库&#xff08;网页端&#xff09;数据&#xff0c;通过pytest.param包装成数据包用于pytest.mark.parametrize 中实现数据驱动调用。 import os import pytest import json fr…

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp&#xff0c;ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…

5.1 Ajax数据爬取之初介绍

目录 1. Ajax 数据介绍 2. Ajax 分析 2.1 Ajax 例子 2.2 Ajax 分析方法 &#xff08;1&#xff09;在网页页面右键&#xff0c;检查 &#xff08;2&#xff09;找到network&#xff0c;ctrl R刷新 &#xff08;3&#xff09;找 Ajax 数据包 &#xff08;4&#xff09;…

【前后端的那些事】文件上传组件封装

文章目录 效果前端代码后端代码组件封装 效果 前端代码 /views/file/file.vue <template><el-row><el-uploadv-model:file-list"fileList"class"upload-demo"multiple:auto-upload"false":on-preview"handlePreview"…