问题描述:两个游戏者在3*3棋盘里轮流作标记,如果一个人在行,列或者两个对角线可以作三个标记,则为获胜。

我们首先得打印菜单供玩家选择(可以选择玩游戏或者退出游戏)

 void menu()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("********************\n");
}

接下来得有个test函数测试游戏的可玩性:

srand()函数随机生成生成数起点,为rand()函数服务,注意包含头文件为<Time.h>

void test()
{
int input = ;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入选项:");
scanf("%d",&input);
switch(input)
{
case :
game();
break;
case :
printf("退出游戏");
break;
default:
printf("输入有误,请重新输入");
break;
}
}while(input);
}

接下来就到了玩游戏环节:

用'#'作电脑标记,用'*'作玩家标记,用变量ret接受输赢信息,'*'为玩家赢,’#‘为电脑赢,’C'继续玩游戏,‘P’平局;

void game()
{
char ret = '';
char board[ROW][COL]={};
InitBoard(board,ROW,COL);
DisplatBoard(board,ROW,COL);
while()
{
PlayMove(board,ROW,COL);
DisplatBoard(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret=='*')
{
printf("玩家赢\n");
break;
}
else if(ret=='#')
{
printf("电脑赢\n");
break;
}
else if(ret=='Q')
{
printf("平局\n");
break;
}
ComputerMove(board,ROW,COL);
DisplatBoard(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret=='*')
{
printf("玩家赢\n");
break;
}
else if(ret=='#')
{
printf("电脑赢\n");
break;
}
else if(ret=='Q')
{
printf("平局\n");
break;
}
}
}

最后就是game.c的游戏完善部分:

初始化棋盘:

使用memset()将棋盘全部初始化为空格,头文件为<string.h>

void InitBoard(char board[ROW][COL],int row,int col)
{
memset(board,' ',row*col*sizeof(board[][]));
}

打印棋盘:

void DisplatBoard(char board[ROW][COL],int row,int col)
{
int i=;
int j=;
for(i = ; i < row; i++)
{
for(j = ; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - )
printf("|");
}
printf("\n");
for(j = ; j < col ; j++)
{
if (i < row - )
printf("___");
else
printf(" ");
if (j < col - )
printf("|");
}
printf("\n");
}
}

玩家下:

void PlayMove(char board[ROW][COL],int row,int col)
{
int x=;
int y=;
do
{
printf("请玩家输入坐标:");
scanf("%d %d",&x,&y);
if ((x> && x<=row) && (y> && y<=col))
{
if (board[x-][y-]==' ')
{
board[x-][y-]='*';
break;
}
else
printf("这个坐标被占了,请重新输入:\n");
}
else
printf("输入错误,请重新输入\n");
}while();
}

电脑下:

使用rand()函数随机生成坐标

void ComputerMove(char board[ROW][COL],int row,int col)
{
int x = ;
int y = ;
printf("电脑走:\n");
while ()
{
x = rand()%row;
y = rand()%col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}

判断输赢:

char IsWin(char board[ROW][COL],int row,int col)
{
int i=;
int j=;
int count=;
char temp[ROW] = {''};
for (i = ; i < row; i++)
{
count = ;
for(j = ; j < col; j++)
temp[j]=board[i][j];
for(j = ; j < col - ; j++)
{
if(temp[j]==temp[j+])
count++;
else
break;
}
if(count==(row-))
return board[i][];
}
count = ;
for (i = ; i < col; i++)
{
count=;
for(j = ; j < row; j++)
temp[j]=board[j][i];
for(j = ; j < row - ; j++)
{
if(temp[j]==temp[j+])
count++;
else
break;
}
if(count==(row-))
return board[][i];
}
count = ;
for (i = ; i < row; i++)
temp[i]=board[i][i];
for(j = ; j < col - ; j++)
{
if(temp[j]==temp[j+])
count++;
else
break;
}
if(count==(row-))
return board[][];
count = ;
for (i = ; i < row; i++)
temp[i]=board[i][row--i];
for(j = ; j < col - ; j++)
{
if(temp[j]==temp[j+])
count++;
else
break;
}
if(count==(row-))
return board[][row-];
if (IsFull(board,ROW,COL))
return 'Q';
}

判断棋盘是否满了:

static把函数封装在game.c内部

static int IsFull(char board[ROW][COL],int row,int col)
{
int i=;
int j=;
int count=;
for (i = ; i < row; i++)
{
for (j = ; j < col; j++)
{
if (board[i][j] != ' ')
count++;
}
}
if (count==row*col)
return ;
else
return ;
}

部分调试界面展示:

因为我写代码时考虑到想让三子棋改为五子棋、八子棋等方便点,就在声明部分声明行和列,方便修改棋盘,这是调试过程调试五子棋显示的棋盘。

最后,我的游戏还很蠢想要打败玩家除非玩家想让它赢,存在很多不足,希望各位可以借鉴的同时不要吐槽,也期待进一步的优化和改进。

c语言实现:三子棋的更多相关文章

  1. 用c语言实现三子棋

    1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ...

  2. C语言简易三子棋

    这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ...

  3. C语言数组实现三子棋

    C语言实现三子棋(通过数组) 需要包含的头文件 #include <stdio.h> #include <stdlib.h> #include <time.h> 创 ...

  4. c语言小游戏-三子棋的完成

    三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ...

  5. 51Nod:1995 三子棋

    1995 三子棋  题目来源: syu校赛 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 小的时候大家一定玩过"井"字棋吧.也就是在 ...

  6. C语言之三字棋的简单实现及扩展

    C语言之三字棋的简单实现及扩展 在我们学习完数组之后,我们完全可以利用数组相关知识来写一个微小型的游戏,比如说今天所说的--三子棋. 大纲: 文件组成 实现   完整代码展示   扩展 即: 一.文件 ...

  7. 51nod 1995 三子棋

    小的时候大家一定玩过“井”字棋吧.也就是在九宫格中,只要任意行.列,或者任意连续对角线上面出现三个相同的,就能获胜.现在小明和小花也在玩三子棋,但是他们不是在九宫格里,而是在3×4的格子里面.现在小明 ...

  8. P1838 三子棋I

    题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 由于小a比较愚蠢,uim总是让他先. 我们用9个数字表示棋盘位置: 123 4 ...

  9. React + Ts 实现三子棋小游戏

    在这里阅读效果更佳 还记得当年和同桌在草稿纸上下三子棋的时光吗 今天我们就用代码来重温一下年少(假设你有react基础,没有也行,只要你会三大框架的任意一种,上手react不难) 游戏规则 双方各执一 ...

随机推荐

  1. 常识判断-科技-day123

    PS: 在常识中科技是最难的 PS: 20-2w  HZ是人能听到的频率 PS: 物体的熔点和凝固点是一致的 PS: 氮肥如果多了,可能只是长叶子不结果: 磷肥促进开花结果 PS; 病毒是介于生物和非 ...

  2. Flagr 架构

    来自官方文档 https://checkr.github.io/flagr/#/flagr_overview There are three components in the flagr, Flag ...

  3. 18.23 inline函数功能

    GUN的C关键字,在函数定义中函数返回类型前加上关键字inline,可以把函数指定为内联函数.关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用 ...

  4. 从零开始打jar包--补充

    想试一下动态编译的功能,所以想看一下java如何编译 原文见:http://www.cnblogs.com/flashsun/p/7246260.html 但这篇文章有些错误及遗漏之处,导致有些没有办 ...

  5. Unity 3D中不得不说的yield协程与消息传递

    1. 协程 在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花.怪物死亡后20秒再复活之类的.刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这 ...

  6. 【转】/etc/rc.d/rc与/etc/rc.d/init.d的关系介绍

    /etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行.程序运行到这里(init进程读取了运行级别),相信从命名的角度大家也能猜到该运行/etc/rc. ...

  7. streamsets

    streamstes用户指南: https://streamsets.com/documentation/datacollector/latest/help/index.html#datacollec ...

  8. laravel学习资料

    http://blog.csdn.net/qq_20873039/article/category/6246852   --laravel核心概念 /Eloquent ORM / laravel bl ...

  9. 第四节 Python基础之数据类型(集合)

    在学习本节之前,我们先对数据类型做一个补充,也就是数据类型的分类: 按照可变和不可变来分: 可变:列表,字典 不可变:数字,字符串,元组 按照访问顺序来分: 顺序访问:字符串,列表,元组 映射的方式访 ...

  10. sql server 2005中的分区函数用法(partition by 字段)

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...