用C語(yǔ)言實(shí)現(xiàn)三子棋小游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1. 規(guī)則介紹
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來(lái),相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了。但是,有很多時(shí)候會(huì)出現(xiàn)和棋的情況。
2. 編寫思路
2.1 選擇界面的編寫
提供選擇界面(設(shè)計(jì)者可根據(jù)自己的喜好設(shè)定棋盤的大??;輸入何種數(shù)字或者符號(hào)開始或者退出游戲也可由設(shè)計(jì)者自己確定數(shù)字)
static void Menu()
{
printf("---------------------\n");
printf("| 1: Play 2: Exit |\n");
printf("---------------------\n");
printf("Please Select# ");
}
2.2 棋盤的編寫
首先我們應(yīng)該實(shí)現(xiàn)三行三列的棋盤,為后續(xù)使用方便,所以我們?cè)谇懊婧甓x行(ROW 3)列(COL 3)都為3;設(shè)計(jì)者也可以根據(jù)自己的喜歡設(shè)置不同樣式的棋盤;
static void Showboard(char board[][COL], int row, int col)
{
printf(" | 1 | 2 | 3 |\n");
printf("---------------------\n");
for (int i = 0; i < row; i++){
printf("%d |", i + 1);
for (int j = 0; j < col; j++){
printf(" %c |", board[i][j]);
}
printf("\n---------------------\n");
}
}
2.3 玩家落子
設(shè)定讓玩家以(x,y)坐標(biāo)的方式?jīng)Q定落子方位,在玩家輸入后,我們要設(shè)定判斷程序,判斷玩家輸入的坐標(biāo)是否合法(在我們?cè)O(shè)定的坐標(biāo)范圍內(nèi))、輸入的位置是否已經(jīng)落子;如果合法,且位置沒被占用,則在輸入的位置用符號(hào)代替玩家的棋子,這里用 ‘ X ' 表示玩家的棋子,為后續(xù)容易修改,在前面宏定義。
static void PlayerMove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
int quit = 0;
while (!quit){
printf("請(qǐng)輸入你的位置# ");
scanf("%d %d", &x, &y);
if (x<1 || x>3 || y<1 || y>3){
printf("你輸入的坐標(biāo)有誤!\n");
continue;
}
else if (board[x - 1][y - 1] != ' '){
printf("該坐標(biāo)已被占用!\n");
continue;
}
else {
board[x - 1][y - 1] = P_COLOR;
break;
}
}
}
2.4 三子連珠判定
設(shè)定三子連珠所有可能的情況,然后判定是否可以繼續(xù)進(jìn)行游戲(返回NEXT),或者和棋(返回DRAW);
static char Judge(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] != ' '){
return board[i][0];
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j] && \
board[1][j] == board[2][j] && \
board[0][j] != ' '){
return board[0][j];
}
}
if (board[0][0] == board[1][1] && \
board[1][1] == board[2][2] && \
board[0][0] != ' '){
return board[1][1];
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[1][1] != ' '){
return board[1][1];
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == ' '){
return NEXT;
}
}
}
return DRAW;
}
2.5 電腦落子方式
電腦落子方式我們采用生成隨機(jī)數(shù)
static void ComputerMove(char board[][COL], int row, int col)
{
while (1){
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = C_COLOR;
break;
}
}
}
2.6 游戲邏輯
生成隨機(jī)數(shù),以便電腦落子使用;
生成二維數(shù)組作為棋盤,傳入行和列,然后用memset初始化;
展示棋盤;
玩家落子;
判定落子是否合法;如果合法則輪到計(jì)算機(jī)落子;
判斷計(jì)算機(jī)落子是否合法;如果合法則繼續(xù)循環(huán);
設(shè)定判斷循環(huán)出口;
static void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
memset(board, ' ', sizeof(board));
char result = 'x';
do{
Showboard(board, ROW, COL);
PlayerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
ComputerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
} while (1);
Showboard(board, ROW, COL);
if (P_COLOR == result){
printf("you win!\n");
}
else if (C_COLOR == result){
printf("you loss!\n");
}
else{
printf("draw!\n");
}
}
2.7 設(shè)定游戲開始o(jì)r退出
首先展示菜單;輸入1開始游戲;輸入2則退出;將上述代碼整合后如下。
3. 整體代碼
#include<stdivo.h>
#include<time.h>
#include<Windows.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
#define NEXT 'N'
#define DRAW 'D'
static void Menu()
{
printf("---------------------\n");
printf("| 1: Play 2: Exit |\n");
printf("---------------------\n");
printf("Please Select# ");
}
static void Showboard(char board[][COL], int row, int col)
{
printf(" | 1 | 2 | 3 |\n");
printf("---------------------\n");
for (int i = 0; i < row; i++){
printf("%d |", i + 1);
for (int j = 0; j < col; j++){
printf(" %c |", board[i][j]);
}
printf("\n---------------------\n");
}
}
static void PlayerMove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
int quit = 0;
while (!quit){
printf("請(qǐng)輸入你的位置# ");
scanf("%d %d", &x, &y);
if (x<1 || x>3 || y<1 || y>3){
printf("你輸入的坐標(biāo)有誤!\n");
continue;
}
else if (board[x - 1][y - 1] != ' '){
printf("該坐標(biāo)已被占用!\n");
continue;
}
else {
board[x - 1][y - 1] = P_COLOR;
break;
}
}
}
static char Judge(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] != ' '){
return board[i][0];
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j] && \
board[1][j] == board[2][j] && \
board[0][j] != ' '){
return board[0][j];
}
}
if (board[0][0] == board[1][1] && \
board[1][1] == board[2][2] && \
board[0][0] != ' '){
return board[1][1];
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[1][1] != ' '){
return board[1][1];
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == ' '){
return NEXT;
}
}
}
return DRAW;
}
static void ComputerMove(char board[][COL], int row, int col)
{
while (1){
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = C_COLOR;
break;
}
}
}
static void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
memset(board, ' ', sizeof(board));
char result = 'x';
do{
Showboard(board, ROW, COL);
PlayerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
ComputerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != NEXT){
break;
}
} while (1);
Showboard(board, ROW, COL);
if (P_COLOR == result){
printf("you win!\n");
}
else if (C_COLOR == result){
printf("you loss!\n");
}
else{
printf("draw!\n");
}
}
int main()
{
int quit = 0;
int select = 0;
while (!quit){
Menu();
scanf("%d", &select);
switch (select){
case 1:
Game();
printf("Play Again?\n");
break;
case 2:
quit = 1;
break;
default:
printf("\n");
break;
}
}
printf("ByeBye!\n");
system("pause");
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++項(xiàng)目實(shí)戰(zhàn)之makefile使用
這篇文章主要介紹了C++項(xiàng)目實(shí)戰(zhàn)之makefile使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
VS2022+libtorch+Cuda11.3安裝測(cè)試教程詳解(調(diào)用cuda)
這篇文章主要介紹了VS2022+libtorch+Cuda11.3安裝測(cè)試(調(diào)用cuda),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
使用?Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序的過(guò)程詳解
Visual?Studio?2022?引入了用于?Linux?C++?開發(fā)的本機(jī)?WSL2?工具集,可以構(gòu)建和調(diào)試?Linux?C++?代碼,并提供了非常好的?Linux?文件系統(tǒng)性能、GUI?支持和完整的系統(tǒng)調(diào)用兼容性,這篇文章主要介紹了使用Visual?Studio?2022?開發(fā)?Linux?C++?應(yīng)用程序,需要的朋友可以參考下2021-11-11
VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法
今天在編寫VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯(cuò)誤碼:126,這里就為大家分享一下具體的解決方法2021-03-03

