问题描述:两个游戏者在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. [USACO06JAN]树林The Grove

    树木(grove)Time Limit: 1Sec Memory Limit: 64 MB[Description]牧场里有一片树林,林子里没有坑.贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回 ...

  2. Linux----------rsync的介绍及安装使用

    目录 一.rsync的介绍 1.1rsync的特点 二.rsync命令 三.rsync的ssh认证协议 四.ssh协议方式使用方法 五.rsync协议方式使用方法即 (rsync + inotifu- ...

  3. return,break,continue三者区别

    详解:http://www.cnblogs.com/yangdabao/p/6172210.html return:直接结束这个方法,后面所有代码不再执行,不管循坏外,还是循环内,全部停止,直接返回 ...

  4. C++——STL内存清除

    1.vector元素的清除 看代码.在vector中添加若干元素,然后clear() #include<iostream> #include<list> #include< ...

  5. linux后台执行命令:&与nohup的用法

    & 这种方法很简单,就是在命令之后加个“&”符号就可以了,如下: ./test & 这样一来,test程序就在后台运行了.但是,这样处理还不够,因为这样做虽然程序是在后台运行了 ...

  6. Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器

    第一个版本发布内容如下: 开源组件(spring-cloud-alibaba开头): 服务发现(Service Discovery) 配置管理(Configuration Management) 高可 ...

  7. 代码漏洞扫描描述Cross Site History Manipulation解决办法[dongcoder.com]

    代码漏洞扫描 漏洞描述:Cross Site History Manipulation 简要描述:产品的行为差异或发送不同的反应,在某种程度上暴露了与安全性相关的产品状态,例如特定的操作是否成功.可能 ...

  8. C# .NET XML 序列化为对象,反序列化

    如果遇到:   根级别上的数据无效. 行 1,位置 1   .:即无法反序列化(反序列失败),得到对象为null ,把 xml 文本 Trim一下. xml=xml.Trim(); 序列化完毕你可以看 ...

  9. centos 后台挂起运行python

    用Xshell连接服务器运行python文件,当关闭终端或连接断开后相应的python文件也就不会继续运行了,要达到后台挂起运行就要使用 nohup 命令了. 用法如下: # -u 表示禁止缓存,将结 ...

  10. Oracle 外键级联更新

    Oracle数据库中,外键约束只允许级联删除,不允许级联更新,因此,如果想要实现主表数据更新后,子表外键自动更新,只能取消外键关系,通过前端程序来维护实现完整引用,一个代替的解决方案是使用延迟约束和触 ...