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不难) 游戏规则 双方各执一 ...
随机推荐
- 文件及文件夹操作- File类、Directory 类、FileInfo 类、DirectoryInfo 类
文件及文件夹操作: C/S:WinForm可以操作客户端文件 Client ServerB/S:Brower Server 命名空间:using system .IO; 1. File类: 创建:Fi ...
- xxxx征集系统项目目标文档
分组:每四人一组 主题:xxx征集系统 成果: 讨论结束后,每组提交一份课堂讨论记录(电子版发表到博客上,纸质版小组成员签名,下节课提交). 每人根据课堂讨论结果提交一份系统利益相关者描述案例.撰写项 ...
- vue day7 table checkbox 全选
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- python实现redis分布式锁
https://www.cnblogs.com/wangwei916797941/p/10030805.html
- 汇编实验1(又是作业emm)
实验任务:学会使用debug 1.使用Debug,将程序段写入内存: 机器码: b8 20 4e 05 16 14 bb 00 20 01 d8 89 c3 01 d8 b8 1a 00 bb 26 ...
- Python实例之抓取HTML中的数据并保存为TXT
本实例实现了抓取捧腹网中存储于html中的笑话数据(非JSON数据) 通过浏览器相关工具发现捧腹网笑话页面的数据存储在HTML页面而非json数据中,因此可以直接使用soup.select()方法来抓 ...
- JS制作图片切换
<!DOCTYPE html> <html> <head> <title>纯JS制作简单的图片切换</title> <meta cha ...
- flutter 容器
Flutter 有着丰富的布局控件库 . Flutter 中的布局整体分为 Single-child layout widget (单子布局部件) Multi-child layout widget ...
- innobackupex: error while loading shared libraries: libssl.so.6
我遇到过这个问题,但由于测试环境不允许上网,所以虽然搜到了一篇解决办法,但我也未亲自测试,先记录下来别人的解决办法. 参考文章:http://blog.itpub.net/29654823/views ...
- GitHub如何删除一个仓库
登陆后选择你需要删除的仓库 github如何删除一个仓库 在仓库的主界面的右边菜单栏选择settings github如何删除一个仓库 进入设置页面,一直往下拉,会发现一个红色的危险地区.. 找到de ...