c語言實作三子棋
文章目錄
- c語言實作三子棋
- 前言
- 一、三子棋游戲需要注意什么
- 二、使用步驟`
- 1. 列印選單
- 2. 創建陣列存放資料,利用回圈創造一個三子棋的基本外框,創建陣列存放資料--列印的結果跟這個注釋的差不多,個人覺得三子棋回圈的時候可以暴力一些
- 3. 初始化陣列內容
- 4. 玩家 電腦下棋( 判斷平局,玩家贏,電腦贏等情況)--此處的玩家下棋可以考慮玩家以為坐標從(1,1)開始,我們在這里假設以玩家先下棋
三子棋
前言
三子棋的小游戲對于回圈的理解,創建陣列有幫助,今天就寫個三子棋吧,一、三子棋游戲需要注意什么
參與游戲的玩家可能并不知道陣列的下標從0開始,所以我們要考慮到這一點,
二、使用步驟`
1. 列印選單
void menu()
{
printf("**********************\n");
printf("****0.exit 1.play*\n");
printf("**********************\n");
printf("**********************\n");
}
2. 創建陣列存放資料,利用回圈創造一個三子棋的基本外框,創建陣列存放資料–列印的結果跟這個注釋的差不多,個人覺得三子棋回圈的時候可以暴力一些
// --- --- ---
//| | | |
// --- --- ---
//| | | |
// --- --- ---
//| | | |
// --- --- ---
void decribe(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//每一行的‘---’
printf(" ---");
}
printf("\n");
for (int j = 0; j < row; j++)
{
//||的列印
printf("| %c ",board[i][j]);
}
printf("|\n");
}
printf(" --- --- --- \n");
}//就這樣一個好看的三子棋就印入眼簾啦!
3. 初始化陣列內容
void Initboard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';//把每個陣列都置為空格
}
}
}
4. 玩家 電腦下棋( 判斷平局,玩家贏,電腦贏等情況)–此處的玩家下棋可以考慮玩家以為坐標從(1,1)開始,我們在這里假設以玩家先下棋
void Playermove(char board[ROW][COL], int row, int col)
{
//玩家下棋
int x = 0;
int y = 0;
printf("請玩家輸入坐標\n");
while (1)
{
scanf("%d%d", &x, &y);
//判斷坐標是否合理,且合理的情況下,下的位置必須是沒有下過子的
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
if (board[x - 1][y - 1] != ' ')
{
printf("已經被占用,請重新下子\n");
}
}
}
}
void Computermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
//我們用%一個row得到的數肯定小于row所以比起我們自己輸入的數不用考慮是否坐標合法
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x ][y ] == ' ')//此處的x與y為0,1,2,可以直接放置
{
board[x ][y] = '#';
break;
}
}
}
//回傳1就滿了
//回傳0就還有剩余的
//Isfull用來判斷是否陣列被填滿,
int Isfull(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
int Iswin(char board[ROW][COL], int row, int col)
{
//判斷誰贏了
//如果玩家贏了回傳*,電腦贏回傳#,平局的話回傳Q,沒分出勝負回傳C,(continue),此時可以直接回傳陣列存放的字符作為輸贏的判斷,
//贏的話可以是三行同一個字符,三列同一個字符,兩條對角線
//一定要先判斷雙方是否有沒有贏才能判斷是否平局不然在最后一個子落的時候有一方贏了顯示的結果會錯誤
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 i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
return board[0][i];
}
//此處是兩條對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1]!=' ')
return board[1][1];
else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
int ret =Isfull(board, ROW, COL);
if (ret == 1)
return 'Q';
else return 'C';
}
//這里附上全部代碼
//game.h
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void decribe(char board[ROW][COL], int row, int col);
void Initboard(char board[ROW][COL], int row, int col);
void Playermove(char board[ROW][COL], int row, int col);
void Computermove(char board[ROW][COL], int row, int col);
int Iswin(char board[ROW][COL], int row, int col);
//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
// --- --- ---
//| | | |
// --- --- ---
//| | | |
// --- --- ---
//| | | |
// --- --- ---
void decribe(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//每一行的---
printf(" ---");
}
printf("\n");
for (int j = 0; j < row; j++)
{
//||的列印
printf("| %c ",board[i][j]);
}
printf("|\n");
}
printf(" --- --- --- \n");
}
void Initboard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';//把每個陣列都置為空格
}
}
}
void Playermove(char board[ROW][COL], int row, int col)
{
//玩家下棋
int x = 0;
int y = 0;
printf("請玩家輸入坐標\n");
while (1)
{
scanf("%d%d", &x, &y);
//判斷坐標是否合理,且合理的情況下,下的位置必須是沒有下過子的
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
if (board[x - 1][y - 1] != ' ')
{
printf("已經被占用,請重新下子\n");
}
}
}
}
void Computermove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
//我們用%一個row得到的數肯定小于row所以比起我們自己輸入的數不用考慮是否坐標合法
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x ][y ] == ' ')//此處的x與y為0,1,2,可以直接放置
{
board[x ][y] = '#';
break;
}
}
}
//回傳1就滿了
//回傳0就還有剩余的
int Isfull(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
int Iswin(char board[ROW][COL], int row, int col)
{
//判斷誰贏了
//如果玩家贏了回傳*,電腦贏回傳#,平局的話回傳Q,沒分出勝負回傳C,(continue),此時可以直接回傳陣列存放的字符作為輸贏的判斷,
//贏的話可以是三行同一個字符,三列同一個字符,兩條對角線
//一定要先判斷雙方是否有沒有贏才能判斷是否平局不然在最后一個子落的時候有一方贏了顯示的結果會錯誤
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 i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
return board[0][i];
}
//此處是兩條對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1]!=' ')
return board[1][1];
else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
return board[1][1];
int ret =Isfull(board, ROW, COL);
if (ret == 1)
return 'Q';
else return 'C';
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("**********************\n");
printf("****0.exit 1.play*\n");
printf("**********************\n");
printf("**********************\n");
}
void game()
{
int ret = 0;
//首先要創建一個陣列來存放資料
char board[3][3] = { 0 };
//先把這個陣列弄成三子棋的格式
decribe(board, ROW, COL);
//初始化這個陣列
Initboard(board, ROW, COL);
//開始下棋
//我們決定讓玩家先下棋 下棋是一個回圈的程序
while (1)
{
Playermove(board, ROW, COL);
decribe(board, ROW, COL);
ret =Iswin(board,ROW,COL);
if (ret != 'C')
{
break;
}
//到電腦下棋
Computermove(board, ROW, COL);
decribe(board, ROW, COL);
ret = Iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("恭喜你打贏了人機\n");
}
if (ret == '#')
{
printf("你一定輸的很不容易吧\n");
}
if (ret == 'Q')
{
printf("恭喜你和人機打的平分秋色");
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請輸入你選擇的數字:>\n");
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
}
case 0:
{
break;
}
}
} while (input);
}
int main()
{
test();
return 0;
}
這里的代碼有參照UP主 位元鵬哥,加入了自己的學習理解和筆記
好啦,代碼到這里就告一段落,這是本人第一次發表文章,有什么問題或者哪里有問題都可以私聊我,歡迎小伙伴們一起學習!!
2021.2.14
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260147.html
標籤:其他
