c语言编程三子棋(井字棋)

头文件(test.h):

#ifndef _THREE_CHESS_H_//防止头文件被重复,包含[也可以用#pragma once]
#define _THREE_CHESS_H_

#include <stdio.h>
#include <windows.h>
#include <time.h>
#pragma warning(disable:4996)//VS中解决scanf函数不能使用问题

#define ROW 3
#define COL 3//宏定义

void ShowUI();
void Game();
void ComputerMove(char board[][COL], int row, int col);
void ShowBoard(char board[][COL], int row, int col);
char Judge(char board[][COL], int row, int col);
void PlayerMove(char board[][COL], int row, int col);//函数声明

#endif

源文件:(test.c)

#include "three_chess.h"

void ShowUI()//菜单
{
    printf("##################################\n");
    printf("## 1. Play              2. Exit ##\n");
    printf("##################################\n");
    printf("Please Select:> ");
}

void ComputerMove(char board[][COL], int row, int col)//电脑下棋函数
{
    while (1){
        int x = rand() % row;
        int y = rand() % col;//调用随机函数,确保横竖坐标小于3
        if (board[x][y] == ‘ ‘){
            board[x][y] = ‘O‘;
            break;
        }
    }
}

void PlayerMove(char board[][COL], int row, int col)//客户下棋函数
{
    int x, y;
    while (1){
        printf("Please Enter Your Pos(x,y):>  ");
        scanf("%d %d", &x, &y);//输入坐标值
        if (x >= 1 && x <= row && y >= 1 && y <= col){
            if (board[x-1][y-1] == ‘ ‘){//确保在坐标为空中下棋
                board[x - 1][y - 1] = ‘X‘;
                break;
            }
            else{
                printf("Enter Pos Is Not OK, Try Again!\n");
            }
        }
        else{
            printf("Enter Error, Try Again!\n");
        }
    }
}

char Judge(char board[][COL], int row, int col)//判断函数
{
    int i = 0;
    int j = 0;
    //判断输赢
    for (; i < row; i++){
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] &&             board[i][0] != ‘ ‘){//判断行
            return board[i][0];返回‘X’‘O’判断谁赢
        }
    }
    for (i = 0; i < col; i++){
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] &&             board[0][i] != ‘ ‘){//判断列
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] &&        board[1][1] != ‘ ‘){//判断主对角线
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] &&        board[1][1] != ‘ ‘){//判断反对角线
        return board[1][1];
    }
    //判断是否继续游戏
    for (i = 0; i < row; i++){
        for (j = 0; j < col; j++){
            if (board[i][j] == ‘ ‘){
                return ‘N‘;
            }
        }
    }
    return ‘E‘;
}

void ShowBoard(char board[][COL], int row, int col)//显示函数
{
    printf("    1   2   3\n");
    printf("-----------------\n");
    int i = 0;
    int j = 0;
    for (; i < row; i++){
        printf("%d |", i + 1);
        for (j = 0; j < col; j++){
            printf(" %c |", board[i][j]);
        }
        printf("\n-----------------\n");
    }
    printf("\n");
}

void Game()//游戏环节
{
    char board[ROW][COL];
    memset(board, ‘ ‘, sizeof(board));
    char result = ‘N‘;
    srand((unsigned long)time(NULL));
    while (1){
        system("cls");//清屏
        ComputerMove(board, ROW, COL);
        ShowBoard(board, ROW, COL);
        result = Judge(board, ROW, COL);
        if (result != ‘N‘){//‘X‘ ‘O‘ ‘E‘ ‘N‘
            break;
        }
        PlayerMove(board, ROW, COL);
        ShowBoard(board, ROW, COL);
        result = Judge(board, ROW, COL);
        if (result != ‘N‘){//‘X‘ ‘O‘ ‘E‘ ‘N‘
            break;
        }
    }
    switch (result){
    case ‘X‘:
        printf("You Win! :)\n");
        break;
    case ‘O‘:
        printf("You Lose, Computer Win! :(\n");
        break;
    case ‘E‘:
        printf("平局,恭喜!\n");
        break;
    default:
        break;
    }
}

执行文件:(main.c)

#include "three_chess.h"

int main()
{
    int select = 0;
    int quit = 0;
    while (!quit){
        ShowUI();
        scanf("%d", &select);
        switch (select){
        case 1:
            Game();
            break;
        case 2:
            quit = 1;
            printf("Bye,Bye!\n");
            break;
        default:
            printf("Please Enter Again!\n");
            break;
        }
    }
    return 0;
}

原文地址:https://blog.51cto.com/14233078/2378046

时间: 2024-10-10 23:06:37

c语言编程三子棋(井字棋)的相关文章

程序设计入门—Java语言 第五周编程题 2井字棋(5分)

2 井字棋(5分) 题目内容: 嗯,就是视频里说的那个井字棋.视频里说了它的基本思路,现在,需要你把它全部实现出来啦. 你的程序先要读入一个整数n,范围是[3,100],这表示井字棋棋盘的边长.比如n=3就表示是一个3x3的棋盘.然后,要读入n行,每行n个数字,每个数字是1或0,依次表示[0,0]到[n-1,n-1]位置上的棋子.1表示X,0表示O(大写字母O). 你的程序要判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子.如果存在,则输出代表获胜一

井字棋的最优策略竟是先占角!

http://www.guokr.com/article/4754/ 井字棋可能是最简单的棋类游戏了,它简单到了成年人之间玩几乎总是平局的地步.因此,这个游戏貌似最多只能哄哄小孩子.不过,对井字棋游戏中所有可能的情况进行一番细致的分析,你会发现一个你或许不会料到的惊人结论——先手的最优策略不是稳坐正中央,而是先占一个角! 几年前,果壳网小编曾经自己动手写过一个和人下井字棋的电脑程序,运行之后却发现电脑先走时总爱把第一步棋下在角上:检查程序代码许久后才意识到,电脑程序可能并没有问题.人们往往有一个

人工智能博弈树算法做的井字棋游戏

不会输,超碉!井字棋这个游戏真是太无聊啦! 算法大概就是,有一个给状况进行估价的函数,深搜每种状况,假设每个人都按对自己最有利的方式走(假设玩家也是不傻),最后让电脑走出最有利的一步. 代码: 1 //#pragma comment(linker, "/STACK:102400000,102400000") 2 #include<cstdio> 3 #include<cmath> 4 #include<iostream> 5 #include<

[游戏学习22] MFC 井字棋 双人对战

>_<:太多啦,感觉用英语说的太慢啦,没想到一年做的东西竟然这么多.....接下来要加速啦! >_<:注意这里必须用MFC和前面的Win32不一样啦! >_<:这也是第一次出现MFC游戏,其框架和逻辑的写法和Win32有很大的区别,建议先看一下MFC的基础再理解代码: >_<:TicTac.h 1 #define EX 1 //该点左鼠标 2 #define OH 2 //该点右鼠标 3 4 class CMyApp : public CWinApp 5 {

C++井字棋游戏,DOS界面版

据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /* N字棋游戏PVP版,DOS版 本棋盘可扩充,仅仅需调整检測条件就可以,其它接口不需改变. 非人机对战型.PVP类型; @author:天下无双 @date:2014-5-25 @version:1.0 */ #include <iostream> #include <string> #define INVALID

井字棋

题目描述 对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜. 给定一个二维数组board,代表当前棋盘,其中元素为1的代表是当前玩家的棋子,为0表示没有棋子,为-1代表是对方玩家的棋子. 测试样例: [[1,0,1],[1,-1,-1],[1,-1,0]] 返回:true //判断每行每列每个对角线上的值是否都为1 class Board { public: bool checkWon(vector<vector<int> > board) { int len =

井字棋游戏升级版 - TopTicTacToe项目 简介

一.游戏简介 井字棋是一款世界闻名的游戏,不用我说,你一定知道它的游戏规则. 这款游戏简单易学,玩起来很有意思,不过已经证明出这款游戏如果两个玩家都足够聪明的话, 是很容易无法分出胜负的,即我们得到的结果是平局. 我们的项目,就是井字棋游戏的升级版!游戏有九个小棋盘,每个棋盘构成了整体布局的一部分,要想获得游戏的胜利,你要把握整个局势才行! 二.亮点 创新 传统的井字棋只有九个格,玩法简单,但是变化也相当有限.初玩者很容易被这新颖的游戏吸引住,但是玩了一段时间后,很容易摸出规律,很轻松达到不败的

『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&amp;代码讲解+资源打包下载】

一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎.可能我说了半天,对它名字不熟悉的朋友也不懂我在说神马.那没关系,我就引用Wiki(维基百科)的介绍作为大家对它名字的认识,顺便也勾起我们儿时的回忆: 井字棋,大陆.台湾又称为井字游戏.圈圈叉叉:另外也有打井游戏.OX棋的称呼,香港多称井字过三关.过三关,是种纸笔游戏.两个玩家,一个打圈(O),一个打

[CareerCup] 17.2 Tic Tac Toe 井字棋游戏

17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏,有下面几点需要考虑: 1. 判断是否能赢hasWon函数是调用一次还是多次,如果是多次,我们可能为了优化而需要加入一些预处理. 2. 井字棋游戏通常是3x3的大小,我们是否想要实现NxN的大小? 3. 我们需要在代码紧凑,执行速度和代码清晰之间做出选择. #include <iostream> #

Pascal小游戏 井字棋

一个很经典的井字棋游戏 Pascal源码Chaobs奉上 注意:1.有的FP版本不支持汉语,将会出现乱码.2.别想赢电脑了,平手不错了. 井字过三关: program TicTacToe; uses crt; var a:Array [1..3] of Array [1..3] of char; b:Array [1..3] of Array [1..3] of integer; i,n,g,e,p:integer; t:text; c:char; o:integer; r:integer; s