三子棋和扫雷游戏的实现

主函数

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"sanziqi.h"
#include"saolei.h"
void init()
{
    printf("******************************************\n");
    printf("**     1.三子棋     2.扫雷    3.退出    **\n");
    printf("******************************************\n");
}

int main()
{
    int key = 0;
    while(!(key == 3))
    {
    init();
    printf("请选择模式:");
    scanf("%d",&key);
    switch (key)
    {
    case 1: sanziqi();break;
    case 2: saolei();break;
    case 3: break;
    default: break;
    }
    }
    system("pause");
    return 0;
}

扫雷部分(基础)

头文件 saolei.h

#ifndef __SAOLEI_H_
#define __SAOLEI_H_
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define easy 10;
#define mid 10;
#define hard 10;


void init_board(char board[ROWS][COLS],int rows,int cols,char ret);
void print_board(char board[ROWS][COLS],int row,int col);
void set_mine(char board[ROWS][COLS],int row,int col);

#endif

扫雷子文件 saolei.c

#include"saolei.h"
int clear_count = 0;
int get_mine(char board[ROWS][COLS],int x,int y)
{
    int count = 0;
    if(board[x-1][y] == '1')
    {
        count++;
    }
    if(board[x+1][y] == '1')
    {
        count++;
    }
    if(board[x-1][y+1] == '1')
    {
        count++;
    }
    if(board[x+1][y+1] == '1')
    {
        count++;
    }
    if(board[x][y+1] == '1')
    {
        count++;
    }
    if(board[x-1][y-1] == '1')
    {
        count++;
    }
    if(board[x+1][y-1] == '1')
    {
        count++;
    }
    if(board[x][y-1] == '1')
    {
        count++;
    }
    return count;
}
void clear_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
    int x = 0;
    int y = 0;
    while(1)
    {
        printf("请输入要排查的坐标->:");
        scanf("%d%d",&x,&y);
        while((mine[x][y]=='1') && (0 == clear_count))//防止第一次炸死
        {
            init_board(mine,ROWS,COLS,'0');
            set_mine(mine,ROW,COL);
            if(mine[x][y]=='0')
            {
                clear_count++;
                print_board(mine,ROW,COL);
                break;
            }
        }
        if(x>=1 && x<=row && y>=1 && y<=row)
        {
            if(mine[x][y]=='1')
            {
                printf("很遗憾炸死了\n");
                break;
            }
            else
            {
                int count = 0;
                count = get_mine(mine,x,y);
                show[x][y] = count+'0';
                print_board(show,ROW,COL);
            }
        }
        else
        {
            printf("输入的坐标不合法\n");
        }
    }
}

void set_mine(char board[ROWS][COLS],int row,int col)
{
    int x = 0;
    int y = 0;
    int count = easy;
    while(count)
    {
        x = rand()%row+1;
        y = rand()%col+1;
        if(board[x][y] == '0')
        {
            board[x][y] = '1';
            count--;
        }
    }
}
void print_board(char board[ROWS][COLS],int row,int col)
{
    int i = 0;
    int j = 0;
    for(i = 0; i<=row;i++)
    {
        printf("%d ",i);
    }
    printf("\n");
    for(i = 1;i<=row;i++)
    {
        printf("%d ",i);
        for(j = 1;j<=col;j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void init_board(char board[ROWS][COLS],int rows,int cols,char ret)
{
    int i = 0;
    int j = 0;
    for(i = 0; i<rows ; i++)
    {
        for(j = 0; j<cols ; j++)
        {
            board[i][j] = ret;
        }
    }
}
void saolei()
{
    char mine[ROWS][COLS] = {0};
    char show[ROWS][COLS] = {0};
    srand((unsigned int)time(NULL));
    init_board(mine,ROWS,COLS,'0');
    init_board(show,ROWS,COLS,'*');
    set_mine(mine,ROW,COL);//设置雷
    print_board(mine,ROW,COL);
    print_board(show,ROW,COL);
    clear_mine(mine,show,ROW,COL);
}

三子棋(基础)

头文件 sanziqi.h

#ifndef __SANZIQI_H__
#define __SANZIQI_H__
#define ROW  3
#define COL  3
#include<stdio.h>
#include<time.h>
#include<windows.h>
void sanziqi();
void qipan(char qizi[ROW][COL],int row,int col);
void play_move(char qizi[ROW][COL],int row,int col);
char check_win(char qizi[ROW][COL],int row,int col);
#endif

三子棋子文件 sanziqi.c

#include"sanziqi.h"
void qipan(char qizi[ROW][COL],int row,int col)
{
    int i = 0;
    for(i = 0; i<=row-1; i++)
    {
        printf(" %c | %c | %c \n",qizi[i][0],qizi[i][1],qizi[i][2]);
    if( i<row-1)
    {
        printf("---|---|---\n",qizi[i][0],qizi[i][1],qizi[i][2]);
    }
    }
}
void play_move(char qizi[ROW][COL],int row,int col)
{
    int x = 0;
    int y = 0;
    while(1)
    {
    printf("请玩家输入坐标—>:");
    scanf("%d%d",&x,&y);
    if(x>=1 && x<= row &&y>=1 && y<= col && qizi[x-1][y-1]==0)
     {
         qizi[x-1][y-1]='X';
        break;
     }
    else
     {
         printf("坐标输出错误\n");
     }
    }
}
void computer_move(char qizi[ROW][COL],int row,int col)
{
    int re = 0;
    int x = 0;
    int y = 0;
    while(1)
    {      
           x = rand()%row;
           y = rand()%col;
        if(qizi[x][y]==0)
        {
           qizi[x][y]='O';
           break;
        }
    }
    printf("\n");
}
char check_win(char qizi[ROW][COL],int row,int col)
{
    int i = 0;
    int j = 0;
    int count = 0;
    for(i = 0;i<row;i++)//行
    {
    if((qizi[i][0]==qizi[i][1])&&(qizi[i][1]==qizi[i][2])&&qizi[i][1]!=0)
     {
        return qizi[i][1];
     }
    }
    for(i = 0;i<col;i++)//处理列
    {
    if((qizi[0][i]==qizi[1][i])&&(qizi[1][i]==qizi[2][i])&&qizi[1][i]!=0)
      {
        return qizi[1][i];
      }
    }
    if((qizi[0][0]==qizi[1][1])&&(qizi[1][1]==qizi[2][2])&&qizi[1][1]!=0)
    {
        return qizi[1][1];
    }
    if((qizi[0][2]==qizi[1][1])&&(qizi[1][1]==qizi[2][0])&&qizi[1][1]!=0)
    {
        return qizi[1][1];
    }
    for(i = 0;i<row;i++)
    {
        for(j = 0;j<row;j++)
        {
            if(qizi[i][j]!=0)
            {
                count++;
            }
        }
    }
    if(9 ==count)
    {
        return 9;
    }

}
void sanziqi()
{   char win = 0;
    char qizi[ROW][COL] = {0};
    qipan(qizi,ROW,COL);
    srand((unsigned int)time(NULL));
    while(1)
    {
    play_move(qizi,ROW,COL);
    qipan(qizi,ROW,COL);
    win = check_win(qizi,ROW,COL);
    if(win == 'X')
     {
         printf("玩家胜\n");
         break;
     }
    else if(win == 'O')
     {
         printf("电脑胜\n");
         break;
     }
    else if(win == 9)
    {
         printf("平局\n");
         break;
    }
    computer_move(qizi,ROW,COL);
    qipan(qizi,ROW,COL);
    win = check_win(qizi,ROW,COL);
    if(win == 'X')
     {
         printf("玩家胜\n");
         break;
     }
    else if(win == 'O')
     {
         printf("电脑胜\n");
         break;
     }
    else if(win == 9)
    {
         printf("平局\n");
         break;
    }
    }
}

猜你喜欢

转载自blog.csdn.net/a331683772/article/details/78765350