C 语言控制台实现五子棋项目
花了一天时间实现了控制台五子棋项目,把项目贴上来。也算是告一段落了。
为了进一步了解C语言编程,熟悉优秀的编码风格,提升编码能力,丰富项目经验。所以在编程初期选择了控制台小游戏《单机五子棋》作为项目进行编码。
本项目定位:
控制台小程序,作为熟悉一个完整的项目流程存在。
项目周期:
一星期。
实际时间:
一天。(2016年4月5日)
游戏功能:
首先实现能够让双人进行对战,最后得出胜负(结果)。然后加入人机对战元素,也就是传统意义上一个人玩的单机游戏。
编码风格:
C语言面向过程编程,变量名与函数名全部使用驼峰命名法。
代码:
#include <stdio.h> // 标准库
#include <conio.h> // 按键
#include <Windows.h> // 屏幕刷新
#include <stdlib.h> // 随机数 static const int wArr = ;
static const int hArr = ; int temp = ;
int allRound = ;
int iMap[wArr][hArr] = {};
void initMap();
void showMap();
void getUserInput();
void userInput(int width, int height);
void whoIsWin();
void aiInput(int w, int h); bool notherUser = true; // 区分用户 int myChess = ;
int whiteChess = ;
int blackChess = ; int main()
{
int InputW = ;
int InputH = ;
initMap(); while ()
{
showMap();
getUserInput();
system("CLS");
whoIsWin();
if ( == allRound)
break; } showMap();
if (notherUser)
{
printf("User2, Win\n");
}
else
{
printf("User1, Win\n");
} return ;
} void initMap()
{
for (int i = ; i < wArr; ++i)
{
for (int j = ; j < hArr; ++j)
{
iMap[i][j] = NULL;
}
} for (int i = ; i < wArr; ++i)
{
iMap[i][] = temp++;
} temp = ; for (int i = ; i < wArr; ++i)
{
iMap[][i] = temp++;
}
temp = ;
} void showMap()
{
for (int i = ; i < wArr; ++i)
{
for (int j = ; j < hArr; ++j)
{
printf("%3.0d", iMap[i][j]);
}
printf("\n");
}
} void getUserInput()
{
int w, h;
if (notherUser)
{
printf("User1:\n");
myChess = whiteChess;
// ============ 用户输入
scanf_s("%d %d", &w, &h); userInput(w, h);
}
else
{
printf("User2:\n");
myChess = blackChess;
// 下面是 AI 部分
aiInput(rand()%wArr, rand()%hArr);
}
} void userInput(int w, int h)
{
if (w >= wArr || w <= || h >= hArr || h <= )
{
return;
}
else if (iMap[w][h] == whiteChess || iMap[w][h] == blackChess)
{
return;
}
iMap[w][h] = myChess; notherUser = !notherUser;
} void aiInput(int w, int h)
{
if (w >= wArr || w <= || h >= hArr || h <= )
{
return;
}
else if (iMap[w][h] == whiteChess || iMap[w][h] == blackChess)
{
return;
}
iMap[w][h] = myChess; notherUser = !notherUser;
} void whoIsWin()
{
for (int i = ; i < wArr; ++i)
{
for (int j = ; j < hArr; ++j)
{
if(iMap[i][j] > )
// 竖排五个
if (iMap[i + ][j] == iMap[i + ][j]
&& iMap[i + ][j] == iMap[i + ][j]
&& iMap[i + ][j] == iMap[i + ][j]
&& iMap[i + ][j] == iMap[i + ][j]
//&& iMap[i + 4][j] == iMap[i + 5][j]
)
{
allRound = ;
}
// 右斜五个
else if (iMap[i + ][j + ] == iMap[i + ][j + ]
&& iMap[i + ][j + ] == iMap[i + ][j + ]
&& iMap[i + ][j + ] == iMap[i + ][j + ]
&& iMap[i + ][j + ] == iMap[i + ][j + ]
//&& iMap[i + 4][j + 4] == iMap[i + 5][j + 5]
)
{
allRound = ;
}
// 左斜五个
else if (iMap[i + ][j + ] == iMap[i - ][j + ]
&& iMap[i - ][j + ] == iMap[i - ][j + ]
&& iMap[i - ][j + ] == iMap[i - ][j + ]
&& iMap[i - ][j + ] == iMap[i - ][j + ]
//&& iMap[i - 4][j + 4] == iMap[i - 5][j + 5]
)
{
allRound = ;
}
// 横排五个
else if (iMap[i][j + ] == iMap[i][j + ]
&& iMap[i][j + ] == iMap[i][j + ]
&& iMap[i][j + ] == iMap[i][j + ]
&& iMap[i][j + ] == iMap[i][j + ]
//&& iMap[i][j + 4] == iMap[i][j + 5]
)
{
allRound = ;
}
}
}
}
C 语言控制台实现五子棋项目的更多相关文章
- C语言可以开发哪些项目?
C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...
- C语言可以开发哪些项目?(转)
原文地址:https://www.cnblogs.com/shiyanlou/p/6098661.html 知乎:https://www.zhihu.com/question/20564904 C语言 ...
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)
使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置jdk-15.0.1-免配置路径版提取码:earu免安装版 ...
- Go 语言控制台输入&生成随机数
Go 语言控制台输入&生成随机数 1. 不同基础类型之间的转化对于不同的基础类型之间的转化,Go 提供了 strconv包.它实现了字符串与其他基本数据类型之间的转化.其中最常用的数值转化函数 ...
- Win32控制台、Win32项目、MFC项目、CLR控制台、CLR空项目、空项目区别
转载:https://blog.csdn.net/zfmss/article/details/79244696 1.Win32控制台 初始代码模版以main为程序入口,默认情况下,只链接C++运行时库 ...
- docker~Dockerfile方式生成控制台和Api项目的镜像
回到目录 一些理论知识 将控制台程序和API程序部署到docker,然后运行它,这个首先要解决的问题就是如何在linux平台运行C#代码,哈哈,很古老的问题,事实上,对于这种问题早在几年前就已经有了解 ...
- vue初级学习--控制台创建vue项目
一.导语 困困的我,好想睡啊,但还是敲下这边有的没的的笔记吧 二.正文 1.输入 vue list 可查看此环境下,vue能创建的项目模板 没将webpack.vue-route啃精了的话,老实用we ...
- go语言熟知的开源项目
go语言在国内是比较火的,并且好多公司都用go语言进行重构之前的系统,今天来看下基本大家都知道的go语言的开源项目 1.Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用 ...
随机推荐
- HTML网页中添加音频视频动画...(转)
在网页中适当嵌入音频和视频能够充分显示网页的多媒体特性,特别是随着宽带网的普及,使得网络广播和网络视频成为现实,网页音频和视频的重要性也日益突显.具体来说,网页音频和视频的嵌入方法主要有三种: 一.b ...
- [Akka]发送一条消息的内部流程
本想通过了解一下Akka-actor工程中主要的类的概念,来看下Akka内部运作的机制.无奈里边的类的确太多,注释中对每个类的功能也没有足够的解释.所以还是通过debug的方式,找个入手点,看一下互相 ...
- Kafka 之 async producer (1)
问题 很多条消息是怎么打包在一起的? 如果消息是发给很多不同的topic的, async producer如何在按batch发送的同时区分topic的 它是如何用key来做partition的? 是如 ...
- javascript div z-index, input tabindex属性说明
<html> <body> <form> 用户名: <input type="text" tabindex="1" / ...
- HTTPS访问:weblogic下配置SSL
进入Weblogic安装路径下的JDK安装目录bin文件下,通过keytool工具生成密钥对(标识密钥库) 输入命令,生成密钥 keytool.exe -genkey -v -alias weblog ...
- linux非阻塞的socket EAGAIN的错误处理
http://blog.csdn.net/tianmohust/article/details/8691644 在Linux中使用非阻塞的socket的情形下. (一)发送时 当客户通过Socket提 ...
- 利用PyInstaller将python代码封装成EXE(亲测可用)
有些不能成功,有些不全的,下面总结一下,给自己以后看看. 1下载PyInstaller..去官网下载http://www.pyinstaller.org/(我下载的版本) 2不需要安装,解压即 ...
- ARMv7 ldr/str指令详解
因为ARM的算术运算不支持直接操作内存地址,所以要把内存里的数据先加载进寄存器.ldr指令就是干这事的,称为间接取址模式. 一共有3*3九种模式,先是直接偏移,先偏移,后偏移三大类,指的是如何对源操作 ...
- Android开发之隐式Intent中Intent-filter的三个属性-action,category,data
使用隐式Intent时,需要使用到意图过滤器Intent-filter.Intent-filter含有三个属性:action,category,data.通过这三个属性的组合,可以启动想要启动的act ...
- Python中的抽象超类
# -*- coding:utf-8 -*- class Super(object): def test(self): self.action() class Sub(Super): def acti ...