C语言实现简单井字棋游戏

本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下

游戏截图

源代码

person.h

//玩家对战
void person()
{
 int i,j;
 initMap(map);
 //打印棋局
 displayMap(map);
 //未分出胜负且棋局未落满子前无限循环
 while(1)
 {
  //获取玩家下子位置
  getXY(&i,&j);
  //玩家落子
  setPiece(map,i,j);
  //清屏
  system("cls");
  //打印棋局
  displayMap(map);
  //玩家落子后判断是否已经分出胜负
  if(isWin(map)==1)
  {
   //输出获胜方
   displayWinner();
   break;
  }
  //是否棋局已满
  else if(count==row*col)
  {
   printf("平局!\n");
   break;
  }
  //交替到对手回合
  exchangeTurn();
 }
}

computer.h

//局面价值
int getSum(char map[][col])
{
 int sumO=0,sumX=0;
 int i,j;
 for(i=0;i<row;i++)
 {
  for(j=0;j<col;j++)
  {
   if(map[i][j]=='O')
   {
    sumO+=score[i][j];
   }
   else if(map[i][j]=='X')
   {
    sumX+=score[i][j];
   }
  }
 }
 return sumX-sumO;
}

//思考
void think(char map[][col])
{
 int canWin=0;
 int i,j;
 int x=-1,y=-1;
 int sum;
 int maxSum=-20;
 count++;
 for(i=0;i<row;i++)
 {
  for(j=0;j<col;j++)
  {
   if(map[i][j]==m)
   {
    map[i][j]='X';

    //能获胜,直接落子此处
    if(isWin(map))
    {
     return;
    }
    //不能获胜,落子在分数最多的地方
    else
    {
     map[i][j]='O';
     if(isWin(map))
     {
      map[i][j]='X';
      return;
     }
     map[i][j]='X';
     sum=getSum(map);
     if(sum>maxSum)
     {
      maxSum=sum;
      x=i;
      y=j;
     }
    }

    map[i][j]=m;
   }
  }
 }
 map[x][y]='X';
}

void computer()
{
 int i,j;
 char computerType='X';
 initMap(map);
 //打印棋局
 displayMap(map);
 //未分出胜负且棋局未落满子前无限循环
 while(1)
 {
  //电脑落子
  if(nowType==computerType)
  {
   printf("电脑落子:");
   think(map);
  }
  //玩家落子
  else
  {
   //获取玩家下子位置
   getXY(&i,&j);
   //玩家落子
   setPiece(map,i,j);
  }

  //清屏
  system("cls");
  //打印棋局
  displayMap(map);
  //玩家落子后判断是否已经分出胜负
  if(isWin(map)==1)
  {
   //输出获胜方
   displayWinner();
   break;
  }
  //是否棋局已满
  else if(count==row*col)
  {
   printf("平局!\n");
   break;
  }
  //交替到对手回合
  exchangeTurn();
 }
}

main.c

#include<stdio.h>
#include<stdlib.h>

//棋局
char map[3][3];
//行列
int row=3,col=3;
//棋子类型
char o='O',x='X',m=' ';
//当前棋子类型
char nowType='O';
//已落子数量
int count=0;

//初始化棋局
void initMap(char map[][col])
{
 int i,j;
 for(i=0;i<row;i++)
 {
  for(j=0;j<col;j++)
  {
   map[i][j]=m;
  }
 }
}

//打印当前棋局
void displayMap(char map[][col])
{
 int i,j;
 printf("   ");
 for(i=0;i<col;i++)
 {
  printf("%d ",i);
 }
 printf("\n  ");
 for(i=0;i<2*col+1;i++)
 {
  printf("*");
 }
 printf("\n");
 for(i=0;i<row;i++)
 {
  printf("%d  ",i);
  for(j=0;j<col;j++)
  {
   printf("%c ",map[i][j]);
  }
  printf("\n  ");
  for(j=0;j<2*col+1;j++)
  {
   printf("*");
  }
  printf("\n");
 }
}

//获取用户输入
void getXY(int *i,int *j)
{
 while(1)
 {
  printf("落子方:%c\n",nowType);
  printf("落子位置(x,y)=");
  scanf("%d %d",i,j);
  if(*i<0||*i>=row||*j<0||*j>=col||map[*i][*j]!=m)
  {
   printf("输入不合法!\n");
  }
  else
  {
   return;
  }
 }
}

//交替下子
void exchangeTurn()
{
 if(nowType==o)
 {
  nowType=x;
 }
 else
 {
  nowType=o;
 }
}

//下子
void setPiece(char map[][col],int i,int j)
{
 map[i][j]=nowType;
 count++;
}

//判断是否分出胜负,分别从横竖斜三个方向数数
int isWin(char map[][col])
{
 int i,j;
 int flagR,flagC;
 for(i=0;i<row;i++)
 {
  flagR=0,flagC=0;
  for(j=0;j<col;j++)
  {
   if(map[i][j]==o)
   {
    flagR++;
   }
   else if(map[i][j]==x)
   {
    flagR--;
   }
   if(map[j][i]==o)
   {
    flagC++;
   }
   else if(map[j][i]==x)
   {
    flagC--;
   }
  }
  if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col))
  {
   return 1;
  }
 }
 flagR=0,flagC=0;
 for(i=0,j=0;i<row&&j<col;i++,j++)
 {
  if(map[i][j]==o)
  {
   flagR++;
  }
  else if(map[i][j]==x)
  {
   flagR--;
  }
  if(map[i][col-j-1]==o)
  {
   flagC++;
  }
  else if(map[i][col-j-1]==x)
  {
   flagC--;
  }
 }
 if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col))
 {
  return 1;
 }
 else
 {
  return 0;
 }
}

//输出胜方
void displayWinner()
{
 printf("%c方获得胜利!\n",nowType);
}

//给局面打分的基础表(站位分)
int score[3][3]={
 {4,2,4},
 {2,8,2},
 {4,2,4}
};
//引入自定义头文件
#include"person.h"
#include"computer.h"

int main()
{
 int gameType;
 printf("1.人机对战\n其他.玩家对战\n");
 scanf("%d",&gameType);
 if(gameType==1)
 {
  computer();
 }
 else
 {
  person();
 }
 return 0;
}

代码解析

1、 其实棋类游戏设计最重要的就是模拟下棋的过程。
2、 我们知道井字棋是双方交替下子,一方执O,一方执X。
3、 比如O先下,玩家下完子后,我们判断一下此时他是否已经获胜(即是否出现横或竖或两斜线出现三子连珠的情况),没有获胜则判断是否已经将棋局下满子了,还是没有的话,轮到X的回合。再次执行此步骤。
4、 了解了过程就自然好设计了。因为棋局比较简单,我们用一个二维字符数组即可存储。落子位置用坐标(x,y),通过玩家输入即可进行模拟。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现井字棋小游戏

    C语言实现简单的"井字棋游戏",供大家参考,具体内容如下 总体构造: 1.游戏菜单的逻辑实现 2.游戏本体的代码实现 part 1:游戏菜单的整体逻辑 ①简单的通过一个输入0和1的switch函数实现判断是玩游戏还是退出游戏的逻辑 输入1则进入游戏,而且打完game()即游戏本体之后因为do-while函数输入1会继续循环询问是否玩游戏 输入0则break退出游戏,且退出do-while循环,程序结束. int main() { int input = 0; srand((unsign

  • C语言实现井字棋游戏

    本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下 首先,我们需要一个大体的思路,先进行宏观规划,再对细节进行实现. 比如: 1.首先需要一个菜单面板作以修饰,在这个面板上,玩家可以选择进入游戏或者退出游戏. 2.需要一个游戏程序,这个是核心. 差不多就是这两个了,我们可以先把这个写下来,这样也可以方便后面使用,像这样: void Game(); int Menu();//这里Menu之所以用int,是为了用返回值来确定是否退出游戏,并非唯一,也非最佳,读者自己尝试 为

  • C语言实现简单的井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 1.什么是井字棋 井字棋相信大部分人都玩过 规则:双方轮流放子,当某一方的三个子连成一线(行,列,对角)时,该方获胜. 2.游戏前的准备 1. 菜单 游戏正式开始前我们可以为用户提供一个选择菜单,笔者做了一个最简单的游戏开始菜单: 代码: /*菜单*/ int menu() { printf("###########################\n"); printf("## 1.Play

  • C语言实现简易井字棋游戏

    井子棋承载了每个人孩童时的美好时光,小到书本.纸张,大到课桌.墙壁,总能找到井字棋盘的痕迹.今天我们就来实际操作一番,用C语言完成一个简单的井字棋游戏,让我们一起重温美好. 棋盘如下: **功能描述:**棋盘共分为九个格子,一方执"O"为棋,一方执"X"为棋,双方依次选择格子.己方棋子率先连成三子的获胜,若棋盘占满仍未分胜负,则打成平局. 具体功能实现: 1.在页面选择玩家vs玩家,或玩家vs电脑 2.玩家下棋时,输入对应格子的坐标 3.电脑下棋时,使用随机值选择坐

  • C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O'代表电脑下的子,'X'代表玩家下的子.未下子的时候初始化 ' '(space).则二维数组为"char"类型,大小为char board[3][3]. 2.打印棋盘 打印出井字的棋盘,同时为了将数据显示在每格的中间,用空格隔开(" %c |")的格式设置棋盘"|"用来形成竖,接着打印&quo

  • C语言实现简单井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 游戏截图 源代码 person.h //玩家对战 void person() { int i,j; initMap(map); //打印棋局 displayMap(map); //未分出胜负且棋局未落满子前无限循环 while(1) { //获取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); //清屏 system("cls"); //打印棋局

  • C语言代码实现井字棋游戏

    井字棋是一个很常见的小游戏.要求对战双方在一个"井"形的棋盘里分别下"*"棋子或者"#"棋子,谁先连成3个,谁就赢. 本次使用C语言来实现这个小游戏. 由于使用函数较多,所以采用多文件的方式方便梳理代码思路. 本次一共有三个文件: ** game.h: 包含了game.c文件中函数的声明和库函数的声明.** #pragma once #define ROW 3 #define COL 3 #include<stdio.h> #incl

  • python实现简单井字棋游戏

    井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜. 游戏的难点在于,如何判断连接成了一条线:横.竖.斜三个方向: 游戏的代码: #!/usr/bin/env python3 # -*- coding:utf-8 -*- u''' Created on 2019年4月13日 @au

  • 用C语言实现井字棋游戏代码

    目录 前言 首先得确定程序实现的功能 直接上代码: 1. 菜单界面 2. 棋盘打印 3. 玩家下棋 4. 电脑下棋(智障下棋版,毫无智能) 5. 判断输赢 搞定 总结 前言 我们都玩过或见过这样一种简单地下棋游戏,两位玩家在一个井字形状的棋盘上,用‘*’和‘#’来下棋,获胜条件是横竖斜任意一列三子成列.那如何在C语言怎么写一个简单地黑框框里运行的井字棋呢,我们在接下来开始从0实施这一工程. 首先得确定程序实现的功能 在写代码时列出需求方便我们后面实现它们. 菜单界面棋盘打印棋子存储采用二维数组.

  • C语言二维数组应用之井字棋游戏

    本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下 数组是C语言中一种重要的数据类型,接下来我和大家分享用二维数组完成一个井字棋游戏. 井字棋,是一种在3*3格子上进行的连珠游戏,和五子棋类似.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜. 井字棋的规则想必大家都已非常清楚,下面来简单梳理一下完成这个游戏的主要思路 一.变量的定义 1.首先要定义棋盘变量为一个3*3的二维数组 

  • python实现简单的井字棋游戏(gui界面)

    项目输出 项目先决条件 要使用python构建井字游戏,我们需要tkinter模块和python的基本概念 Tkinter模块是用于渲染图形的标准图形用户界面. Tkinter.messagebox用于显示消息框 要安装tkinter模块,我们在命令提示符下使用了pip install命令: pip install tkinter 项目文件结构 这些是使用python构建井字游戏的步骤: 导入模块 初始化窗口 检查结果的功能 检查获胜者的功能 定义标签和按钮 1.导入模块 from tkinte

  • python实现简单井字棋小游戏

    用python实现的一个井字棋游戏,供大家参考,具体内容如下 #Tic-Tac-Toe 井字棋游戏 #全局常量 X="X" O="O" EMPTY=" " #询问是否继续 def ask_yes_no(question): response=None; while response not in("y","n"): response=input(question).lower() return respon

随机推荐