c语言实现:三子棋
问题描述:两个游戏者在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语言实现:三子棋的更多相关文章
- 用c语言实现三子棋
1 game.c://实现三子棋的.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void init_board(cha ...
- C语言简易三子棋
这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ...
- C语言数组实现三子棋
C语言实现三子棋(通过数组) 需要包含的头文件 #include <stdio.h> #include <stdlib.h> #include <time.h> 创 ...
- c语言小游戏-三子棋的完成
三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ...
- 51Nod:1995 三子棋
1995 三子棋 题目来源: syu校赛 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 小的时候大家一定玩过"井"字棋吧.也就是在 ...
- C语言之三字棋的简单实现及扩展
C语言之三字棋的简单实现及扩展 在我们学习完数组之后,我们完全可以利用数组相关知识来写一个微小型的游戏,比如说今天所说的--三子棋. 大纲: 文件组成 实现 完整代码展示 扩展 即: 一.文件 ...
- 51nod 1995 三子棋
小的时候大家一定玩过“井”字棋吧.也就是在九宫格中,只要任意行.列,或者任意连续对角线上面出现三个相同的,就能获胜.现在小明和小花也在玩三子棋,但是他们不是在九宫格里,而是在3×4的格子里面.现在小明 ...
- P1838 三子棋I
题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 由于小a比较愚蠢,uim总是让他先. 我们用9个数字表示棋盘位置: 123 4 ...
- React + Ts 实现三子棋小游戏
在这里阅读效果更佳 还记得当年和同桌在草稿纸上下三子棋的时光吗 今天我们就用代码来重温一下年少(假设你有react基础,没有也行,只要你会三大框架的任意一种,上手react不难) 游戏规则 双方各执一 ...
随机推荐
- [USACO06JAN]树林The Grove
树木(grove)Time Limit: 1Sec Memory Limit: 64 MB[Description]牧场里有一片树林,林子里没有坑.贝茜很想知道,最少需要多少步能围绕树林走一圈,最后回 ...
- Linux----------rsync的介绍及安装使用
目录 一.rsync的介绍 1.1rsync的特点 二.rsync命令 三.rsync的ssh认证协议 四.ssh协议方式使用方法 五.rsync协议方式使用方法即 (rsync + inotifu- ...
- return,break,continue三者区别
详解:http://www.cnblogs.com/yangdabao/p/6172210.html return:直接结束这个方法,后面所有代码不再执行,不管循坏外,还是循环内,全部停止,直接返回 ...
- C++——STL内存清除
1.vector元素的清除 看代码.在vector中添加若干元素,然后clear() #include<iostream> #include<list> #include< ...
- linux后台执行命令:&与nohup的用法
& 这种方法很简单,就是在命令之后加个“&”符号就可以了,如下: ./test & 这样一来,test程序就在后台运行了.但是,这样处理还不够,因为这样做虽然程序是在后台运行了 ...
- Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器
第一个版本发布内容如下: 开源组件(spring-cloud-alibaba开头): 服务发现(Service Discovery) 配置管理(Configuration Management) 高可 ...
- 代码漏洞扫描描述Cross Site History Manipulation解决办法[dongcoder.com]
代码漏洞扫描 漏洞描述:Cross Site History Manipulation 简要描述:产品的行为差异或发送不同的反应,在某种程度上暴露了与安全性相关的产品状态,例如特定的操作是否成功.可能 ...
- C# .NET XML 序列化为对象,反序列化
如果遇到: 根级别上的数据无效. 行 1,位置 1 .:即无法反序列化(反序列失败),得到对象为null ,把 xml 文本 Trim一下. xml=xml.Trim(); 序列化完毕你可以看 ...
- centos 后台挂起运行python
用Xshell连接服务器运行python文件,当关闭终端或连接断开后相应的python文件也就不会继续运行了,要达到后台挂起运行就要使用 nohup 命令了. 用法如下: # -u 表示禁止缓存,将结 ...
- Oracle 外键级联更新
Oracle数据库中,外键约束只允许级联删除,不允许级联更新,因此,如果想要实现主表数据更新后,子表外键自动更新,只能取消外键关系,通过前端程序来维护实现完整引用,一个代替的解决方案是使用延迟约束和触 ...