问题描述:两个游戏者在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. maven 使用axis2 client 需要导入的依赖

    <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2</artif ...

  2. VMWare安装

    1. VMware 的下载和安装 VMware Workstation 15 Pro for Windows(64 位)的下载地址如下: 官方试用版地址:http://www.vmware.com/c ...

  3. TCP 三次握爪 四次挥手

    TCP三次握手和四次挥手过程 1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向 ...

  4. 使用dotenv 管理nodejs 应用的环境变量&&docker-compose 运行

      说明dotenv 是一个很方便的符合12 factor 的环境变量管理工具,使用很方便,实际上里面的代码也不是很多 测试使用docker 进行环境部署,为了方便分发使用pkg 进行打包,使用alp ...

  5. 压力测试:系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式

    PS:下面是性能测试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...

  6. C语言之二维数组与指针

    二维数组: ][]; 二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下: #include "stdio.h&quo ...

  7. MegaCLi命令总结

    MegaCli命令总结 MegaCli 版本8.00.29,raid卡为lsi 8888elp,固件11.0.1-0036 1    巡读 一MegaCli -adppr -enblauto  -a0 ...

  8. 再见VB6!再见程序生涯!

    今天写一篇博文告别使用了15年的VB6,从此终结程序生涯.记得读大学的时候第一学习编程,用VB6嵌入MediaPlayer控件写了一个简易视频播放器,看着视频的画面激动人心,从此就爱上了编程,从此也和 ...

  9. Docker安装使用battery historian

    apt-get insatll docker.io battery historian ubuntu下使用 首先要确保是google浏览器,然后用命令行 google-chrome --proxy-s ...

  10. 20175236 2018-2019-2 《Java程序设计》第六周学习总结

    教材学习内容总结 第七章 try :用于监听.将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出. catch:用于捕获异常.catch用来捕获try ...